Python 클래스와 객체지향 프로그래밍 기초
목차
- 서론
- 객체지향 프로그래밍이란?
- 객체지향 프로그래밍의 개념
- 객체와 클래스의 정의
- 클래스의 정의와 사용
- 클래스 정의하기
- 인스턴스 생성하기
- 초기화 메소드 (
__init__
)
- 클래스의 속성과 메소드
- 인스턴스 변수와 클래스 변수
- 인스턴스 메소드와 클래스 메소드
- 정적 메소드
- 상속과 다형성
- 상속의 개념
- 메소드 오버라이딩
- 다형성의 개념
- 실습 예제
- 마무리
- 추천 태그
1. 서론
Python은 객체지향 프로그래밍(OOP)을 지원하는 강력한 언어입니다. 객체지향 프로그래밍은 코드의 재사용성과 유지보수성을 높여주며, 복잡한 프로그램을 논리적으로 구성할 수 있게 도와줍니다. 이번 포스팅에서는 Python의 클래스와 객체지향 프로그래밍 기초를 초보 개발자도 쉽게 이해할 수 있도록 설명하겠습니다.
2. 객체지향 프로그래밍이란?
2.1 객체지향 프로그래밍의 개념
객체지향 프로그래밍(OOP)은 데이터를 객체로 모델링하여 프로그래밍하는 방법론입니다. 객체는 데이터와 이를 조작하는 메소드를 포함하며, 클래스는 이러한 객체를 생성하기 위한 청사진(틀) 역할을 합니다.
2.2 객체와 클래스의 정의
- 객체(Object): 클래스의 인스턴스(instance)로, 실제 데이터와 기능을 포함하는 개체입니다.
- 클래스(Class): 객체를 생성하기 위한 설계도(틀)입니다. 클래스는 속성(변수)과 메소드(함수)를 포함합니다.
3. 클래스의 정의와 사용
3.1 클래스 정의하기
클래스를 정의하려면 class
키워드를 사용합니다.
class Dog:
pass
위 예제에서는 Dog
라는 빈 클래스를 정의하였습니다.
3.2 인스턴스 생성하기
클래스에서 인스턴스를 생성하려면 클래스 이름을 함수처럼 호출합니다.
my_dog = Dog()
print(my_dog) # <__main__.Dog object at 0x...>
3.3 초기화 메소드 (__init__
)
초기화 메소드는 인스턴스가 생성될 때 자동으로 호출되며, 인스턴스 변수의 초기값을 설정합니다.
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
my_dog = Dog("Buddy", 3)
print(my_dog.name) # Buddy
print(my_dog.age) # 3
4. 클래스의 속성과 메소드
4.1 인스턴스 변수와 클래스 변수
- 인스턴스 변수: 각 인스턴스에 독립적으로 존재하는 변수입니다.
- 클래스 변수: 클래스에 속하며, 모든 인스턴스가 공유하는 변수입니다.
class Dog:
species = "Canis familiaris" # 클래스 변수
def __init__(self, name, age):
self.name = name # 인스턴스 변수
self.age = age
my_dog = Dog("Buddy", 3)
print(my_dog.species) # Canis familiaris
print(Dog.species) # Canis familiaris
4.2 인스턴스 메소드와 클래스 메소드
- 인스턴스 메소드: 인스턴스 변수를 사용하며, 인스턴스에서 호출됩니다.
- 클래스 메소드: 클래스 변수를 사용하며, 클래스에서 호출됩니다.
@classmethod
데코레이터를 사용합니다.
class Dog:
species = "Canis familiaris"
def __init__(self, name, age):
self.name = name
self.age = age
def bark(self): # 인스턴스 메소드
return f"{self.name} barks!"
@classmethod
def get_species(cls): # 클래스 메소드
return cls.species
my_dog = Dog("Buddy", 3)
print(my_dog.bark()) # Buddy barks!
print(Dog.get_species()) # Canis familiaris
4.3 정적 메소드
정적 메소드는 클래스나 인스턴스 변수에 접근하지 않으며, 독립적인 기능을 수행합니다. @staticmethod
데코레이터를 사용합니다.
class Dog:
@staticmethod
def is_adult(age):
return age >= 2
print(Dog.is_adult(3)) # True
print(Dog.is_adult(1)) # False
5. 상속과 다형성
5.1 상속의 개념
상속은 기존 클래스를 확장하여 새로운 클래스를 만드는 것입니다. 새로운 클래스는 기존 클래스의 속성과 메소드를 물려받습니다.
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
pass
class Dog(Animal):
def speak(self):
return f"{self.name} says Woof!"
class Cat(Animal):
def speak(self):
return f"{self.name} says Meow!"
my_dog = Dog("Buddy")
my_cat = Cat("Kitty")
print(my_dog.speak()) # Buddy says Woof!
print(my_cat.speak()) # Kitty says Meow!
5.2 메소드 오버라이딩
서브 클래스에서 부모 클래스의 메소드를 재정의하는 것을 메소드 오버라이딩이라고 합니다.
class Animal:
def speak(self):
return "Some sound"
class Dog(Animal):
def speak(self):
return "Woof!"
my_dog = Dog()
print(my_dog.speak()) # Woof!
5.3 다형성의 개념
다형성은 동일한 메소드가 클래스에 따라 다르게 동작하는 특성입니다. 이는 코드의 유연성과 재사용성을 높여줍니다.
def make_animal_speak(animal):
print(animal.speak())
my_dog = Dog()
my_cat = Cat()
make_animal_speak(my_dog) # Woof!
make_animal_speak(my_cat) # Meow!
6. 실습 예제
예제 1: 간단한 은행 계좌 클래스
은행 계좌를 모델링한 클래스를 작성해보겠습니다.
class BankAccount:
def __init__(self, owner, balance=0):
self.owner = owner
self.balance = balance
def deposit(self, amount):
if amount > 0:
self.balance += amount
print(f"{amount}원이 입금되었습니다.")
else:
print("입금액은 0보다 커야 합니다.")
def withdraw(self, amount):
if 0 < amount <= self.balance:
self.balance -= amount
print(f"{amount}원이 출금되었습니다.")
else:
print("출금액이 잘못되었습니다.")
def get_balance(self):
return self.balance
# 계좌 생성 및 입출금 예제
account = BankAccount("철수")
account.deposit(1000)
account.withdraw(500)
print(f"잔액: {account.get_balance()}원") # 잔액: 500원
예제 2: 상속을 활용한 차량 클래스
차량을 모델링한 클래스와 이를 상속한 자동차 클래스를 작성해보겠습니다.
class Vehicle:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
def start_engine(self):
return "Engine started"
class Car(Vehicle):
def __init__(self, make, model, year, num_doors):
super().__init__(make, model, year)
self.num_doors = num_doors
def start_engine(self):
return "Car engine started"
def open_doors(self):
return f"{self.num_doors} doors opened"
# 차량 생성 및 메소드 호출 예제
my_car = Car("Hyundai", "Sonata", 2022, 4)
print(my_car.start_engine()) # Car engine started
print(my_car.open_doors()) # 4 doors opened
7. 마무리
이번 포스팅에서는 Python의 클래스와 객체지향 프로그래밍의 기본 개념에 대해 알아보았습니다. 객체지향 프로그래밍은 복잡한 프로그램을 논리적으로 구성하고, 코드의 재사용성과 유지보수성을 높이는 데 매우 유용합니다. 다양한 예제를 통해 클래스와 객체지향 프로그래밍의 개념을 익혀보시기 바랍니다.
이 포스팅이 Python을 처음 접하는 분들에게 도움이 되길 바랍니다.