객체 지향 프로그래밍은 데이터와 해당 데이터를 다루는 동작을 하나의 논리적 단위로 묶어 프로그램을 구성하는 방식입니다. 현실 세계의 사물이나 개념을 객체로 모델링하여, 객체의 속성과 행위를 통해 문제를 해결합니다. 캡슐화, 상속, 다형성과 같은 메커니즘을 활용하면 코드의 재사용성과 유연성을 크게 높일 수 있습니다.
아래 코드를 통해 파이썬 객체 지향 프로그래밍에서 자주 등장하는 기본 개념들을 살펴보겠습니다.
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
def describe(self):
print(f"제목: {self.title}, 저자: {self.author}")
book1 = Book("파이썬 입문", "홍길동")
book1.describe() # 출력: 제목: 파이썬 입문, 저자: 홍길동
book2 = Book("자료구조", "이순신")
book2.describe() # 출력: 제목: 자료구조, 저자: 이순신
클래스와 객체
클래스는 동일한 속성과 메서드를 공유하는 객체들의 템플릿입니다. 객체는 클래스를 기반으로 생성된 실제 인스턴스입니다. 위 예제에서 Book은 클래스이고, book1과 book2는 이 클래스로부터 만들어진 구체적인 객체입니다.
초기화 메서드(생성자)
__init__은 객체가 생성될 때 자동으로 호출되는 특별한 메서드입니다. 이를 통해 객체의 초기 상태를 설정합니다. 파이썬에서는 첫 번째 매개변수로 객체 자신을 가리키는 self를 반드시 명시해야 합니다.
속성과 메서드
속성은 객체가 가지는 데이터이고, 메서드는 객체가 수행할 수 있는 동작입니다. 예제에서 title과 author는 속성, describe는 메서드입니다.
self 키워드
인스턴스 메서드의 첫 번째 매개변수인 self는 호출된 객체 자신을 참조합니다. 메서드 내에서 self.속성명 또는 self.메서드명() 형태로 객체의 멤버에 접근할 수 있습니다.
상속
상속은 기존 클래스의 특성을 다른 클래스가 물려받는 기능입니다. 부모 클래스의 속성과 메서드를 자식 클래스에서 재사용할 수 있고, 필요에 따라 확장하거나 재정의할 수 있습니다.
class EBook(Book):
def __init__(self, title, author, file_size):
super().__init__(title, author) # 부모 클래스의 생성자 호출
self.file_size = file_size
def describe(self):
super().describe() # 부모 클래스의 메서드 호출
print(f"파일 크기: {self.file_size}MB")
ebook = EBook("고급 파이썬", "김구", 12)
ebook.describe()
위 코드를 실행하면 다음과 같은 결과를 얻습니다.
제목: 고급 파이썬, 저자: 김구
파일 크기: 12MB
다형성
다형성은 동일한 인터페이스나 메서드가 서로 다른 클래스에서 다르게 동작할 수 있도록 하는 성질입니다. 주로 메서드 오버라이딩을 통해 구현하며, 동일한 함수가 전달된 객체의 실제 타입에 따라 다른 행동을 수행하게 만듭니다.
class MediaFile:
def play(self):
pass
class Audio(MediaFile):
def play(self):
print("음악을 재생합니다.")
class Video(MediaFile):
def play(self):
print("영상을 재생합니다.")
def start_play(media):
media.play()
audio = Audio()
video = Video()
start_play(audio) # 출력: 음악을 재생합니다.
start_play(video) # 출력: 영상을 재생합니다.
함수 start_play는 전달받는 객체의 구체적인 클래스가 Audio인지 Video인지 신경 쓰지 않고 동일한 방식으로 호출됩니다. 이러한 특성 덕분에 기존 코드를 수정하지 않고도 새로운 미디어 유형을 쉽게 추가할 수 있습니다.