Python 학습: 객체 지향 프로그래밍 (OOP)
객체 지향 프로그래밍(OOP)은 프로그램을 객체 단위로 구성하여 재사용성과 유지보수성을 높이는 프로그래밍 패러다임입니다. 이번 글에서는 클래스와 객체, 생성자와 소멸자, 상속, 다형성, 캡슐화에 대해 알아보겠습니다.
1. 클래스와 객체: 클래스 정의, 객체 생성
클래스 정의 : 클래스는 객체의 설계도입니다. Python에서는 class 키워드를 사용하여 클래스를 정의합니다.
객체 생성 : 객체는 클래스로부터 생성된 인스턴스입니다. 클래스의 인스턴스를 생성하려면 클래스 이름을 함수처럼 호출합니다.
클래스 정의와 객체 생성 예제
def __init__(self, name, age):
self.name = name
self.age = age
def bark(self):
print(f"{self.name}이(가) 짖습니다.")
# 객체 생성
my_dog = Dog("Buddy", 3)
print(my_dog.name) # Buddy 출력
print(my_dog.age) # 3 출력
my_dog.bark() # Buddy이(가) 짖습니다. 출력
위의 예제에서 Dog 클래스는 이름과 나이를 속성으로 가지며, bark 메서드를 정의합니다. my_dog 객체는 Dog 클래스의 인스턴스입니다.
2. 생성자와 소멸자: __init__, __del__
생성자 (__init__) : 생성자는 객체가 생성될 때 자동으로 호출되는 메서드입니다. 객체의 초기화를 담당합니다.
소멸자 (__del__) : 소멸자는 객체가 소멸될 때 자동으로 호출되는 메서드입니다. 객체의 자원을 해제합니다.
생성자와 소멸자 예제
def __init__(self, name):
self.name = name
print(f"{self.name}이(가) 태어났습니다.")
def __del__(self):
print(f"{self.name}이(가) 사라졌습니다.")
# 객체 생성 및 소멸
my_cat = Cat("Whiskers")
del my_cat # 명시적으로 객체 소멸
위의 예제에서 Cat 클래스는 생성자와 소멸자를 정의합니다. my_cat 객체가 생성될 때 생성자가 호출되고, 객체가 소멸될 때 소멸자가 호출됩니다.
3. 상속: 클래스 상속
상속은 기존 클래스의 속성과 메서드를 새로운 클래스가 물려받는 기능입니다. 이를 통해 코드의 재사용성을 높일 수 있습니다.
상속 예제
def __init__(self, name):
self.name = name
def speak(self):
pass
class Dog(Animal):
def speak(self):
print(f"{self.name}이(가) 짖습니다.")
class Cat(Animal):
def speak(self):
print(f"{self.name}이(가) 야옹합니다.")
# 객체 생성
dog = Dog("Buddy")
cat = Cat("Whiskers")
dog.speak() # Buddy이(가) 짖습니다. 출력
cat.speak() # Whiskers이(가) 야옹합니다. 출력
위의 예제에서 Dog와 Cat 클래스는 Animal 클래스를 상속받습니다. 각 클래스는 speak 메서드를 재정의합니다.
4. 다형성: 메서드 오버라이딩
다형성은 동일한 인터페이스를 통해 서로 다른 데이터 타입의 객체를 다룰 수 있는 기능입니다. 메서드 오버라이딩은 자식 클래스에서 부모 클래스의 메서드를 재정의하는 것입니다.
메서드 오버라이딩 예제
def area(self):
return 0
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14 * self.radius * self.radius
# 객체 생성
rect = Rectangle(3, 4)
circ = Circle(5)
print(f"사각형의 면적: {rect.area()}") # 사각형의 면적: 12 출력
print(f"원의 면적: {circ.area()}") # 문의 면적: 78.5 출력
위의 예제에서 Rectangle과 Circle 클래스는 Shape 클래스를 상속받고, area 메서드를 재정의하여 각 도형의 면적을 계산합니다.
5. 캡슐화: 접근 지정자 (public, private, protected)
캡슐화는 객체의 내부 상태를 보호하고, 외부로부터의 직접 접근을 제한하는 원칙입니다. Python에서는 관습적으로 접근 지정자를 사용합니다:
- public : 모든 곳에서 접근 가능 (기본)
- protected : 클래스 내부와 자식 클래스에서만 접근 가능 (_로 시작)
- private : 클래스 내부에서만 접근 가능 (__로 시작)
캡슐화 예제
def __init__(self, brand, model):
self.brand = brand # public
self._model = model # protected
self.__year = 2020 # private
def display_info(self):
print(f"브랜드: {self.brand}, 모델: {self._model}, 연도: {self.__year}")
car = Car("Toyota", "Corolla")
car.display_info() # 브랜드: Toyota, 모델: Corolla, 연도: 2020 출력
print(car.brand) # Toyota 출력
print(car._model) # Corolla 출력
# print(car.__year) # 오류 발생: private 변수는 접근할 수 없음
위의 예제에서 Car 클래스는 brand (public), _model (protected), __year (private) 속성을 가집니다. __year 속성은 클래스 내부에서만 접근할 수 있습니다.
이 글에서는 Python의 객체 지향 프로그래밍(OOP)에 대해 알아보았습니다. 클래스와 객체, 생성자와 소멸자, 상속, 다형성, 캡슐화를 이해하고 활용하면 보다 구조적이고 유지보수하기 쉬운 코드를 작성할 수 있습니다. Happy Coding!
'프로그래밍 > Python' 카테고리의 다른 글
[Python] 9. Python의 "표준 라이브러리와 외부 패키지" (0) | 2024.06.18 |
---|---|
[Python] 8. Python의 "모듈과 패키지" (0) | 2024.06.18 |
[Python] 6. Python의 "예외 처리" (0) | 2024.06.18 |
[Python] 5. Python의 "파일 입출력" (1) | 2024.06.17 |
[Python] 4. Python의 "데이터 구조" (0) | 2024.06.17 |