객체지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그래밍 패러다임 중 하나로, 데이터를 객체로 모델링하고 이 객체들이 서로 상호작용하며 프로그램이 동작하도록 구성하는 방식이다. Python은 객체지향 프로그래밍을 강력하게 지원하며, 이를 통해 코드의 재사용성과 유지보수성을 높일 수 있다.
객체와 클래스
객체(Object): 실제로 존재하는 구체적인 실체를 말한다. 예를 들어, '고양이'는 하나의 객체가 될 수 있다.
클래스(Class): 객체를 만들기 위한 설계도나 틀을 의미한다. 즉, 객체의 속성과 행동을 정의하는 청사진이다.
클래스 정의와 객체 생성
클래스를 정의하고 이를 통해 객체를 생성하는 기본적인 방법을 살펴보자.
class Dog:
def __init__(self, name, breed):
self.name = name
self.breed = breed
def bark(self):
print(f"{self.name}가 짖는다: 멍멍!")
# 객체 생성
my_dog = Dog("바둑이", "진돗개")
my_dog.bark()
위 예제에서 Dog
클래스는 name
과 breed
라는 두 개의 속성을 가지고 있으며, bark
라는 메서드를 가지고 있다. __init__
메서드는 생성자로, 객체가 생성될 때 호출되어 객체의 초기 상태를 설정한다.
실생활 예제: 도서관 시스템
실생활에 적합한 예제로 도서관 시스템을 모델링해보자. 도서관에는 책, 회원, 대출 등이 있을 수 있다.
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
self.is_checked_out = False
def check_out(self):
if not self.is_checked_out:
self.is_checked_out = True
print(f"{self.title}이(가) 대출되었습니다.")
else:
print(f"{self.title}은(는) 이미 대출 중입니다.")
def return_book(self):
if self.is_checked_out:
self.is_checked_out = False
print(f"{self.title}이(가) 반납되었습니다.")
else:
print(f"{self.title}은(는) 대출되지 않았습니다.")
class Member:
def __init__(self, name):
self.name = name
self.borrowed_books = []
def borrow_book(self, book):
if book not in self.borrowed_books:
book.check_out()
self.borrowed_books.append(book)
else:
print(f"{self.name}은(는) 이미 {book.title}을(를) 대출했습니다.")
def return_book(self, book):
if book in self.borrowed_books:
book.return_book()
self.borrowed_books.remove(book)
else:
print(f"{self.name}은(는) {book.title}을(를) 대출하지 않았습니다.")
# 객체 생성 및 사용 예제
book1 = Book("파이썬 마스터하기", "홍길동")
member1 = Member("김철수")
member1.borrow_book(book1)
member1.return_book(book1)
이 예제에서는 Book
클래스와 Member
클래스를 정의하였다. Book
클래스는 책의 제목과 저자, 대출 상태를 속성으로 가지며, 대출 및 반납 기능을 메서드로 제공한다. Member
클래스는 회원의 이름과 대출한 책 목록을 속성으로 가지며, 책을 대출하고 반납하는 기능을 메서드로 제공한다.
상속
상속은 객체지향 프로그래밍의 중요한 특징 중 하나로, 기존 클래스(부모 클래스)를 기반으로 새로운 클래스(자식 클래스)를 만들 수 있게 한다. 이를 통해 코드의 재사용성을 높일 수 있다.
class Librarian(Member):
def __init__(self, name, employee_id):
super().__init__(name)
self.employee_id = employee_id
def manage_books(self, book, action):
if action == "check_out":
book.check_out()
elif action == "return":
book.return_book()
# 사서 객체 생성 및 사용 예제
librarian = Librarian("이사서", 1001)
librarian.manage_books(book1, "check_out")
librarian.manage_books(book1, "return")
다형성
다형성은 동일한 인터페이스를 통해 다양한 객체를 처리할 수 있게 하는 객체지향 프로그래밍의 특징이다.
class EBook(Book):
def __init__(self, title, author, file_size):
super().__init__(title, author)
self.file_size = file_size
def display_file_size(self):
print(f"파일 크기: {self.file_size}MB")
# 전자책 객체 생성 및 사용 예제
ebook = EBook("파이썬 프로그래밍", "이몽룡", 5)
ebook.check_out()
ebook.display_file_size()
위 예제에서 EBook
클래스는 Book
클래스를 상속받아 정의되었으며, 추가로 파일 크기 속성을 가지고 있다. EBook
객체는 Book
객체와 동일한 인터페이스를 통해 사용될 수 있다.