Python 객체지향 프로그래밍 (OOP)Language/Python2023. 10. 24. 17:17
Table of Contents
객체지향 프로그래밍(OOP)란?
객체지향 프로그래밍은 프로그램을 객체(object)라는 기본 단위로 구성하여 설계 및 구현하는 프로그래밍 패러다임입니다. 각 객체는 데이터(attribute)와 이를 조작하는 행동(method)으로 구성됩니다. 이를 통해 코드의 재사용성과 유지보수성을 높이고 복잡한 문제를 직관적으로 해결할 수 있습니다.
클래스와 객체
클래스(class)는 객체를 생성하기 위한 템플릿 또는 설계도입니다. 클래스를 기반으로 생성된 실체를 객체(object)라고 합니다.
클래스 정의 및 객체 생성 예제
class Dog:
# 클래스 속성
species = "Canis familiaris"
# 생성자 메서드
def __init__(self, name, age):
self.name = name # 인스턴스 속성
self.age = age # 인스턴스 속성
# 인스턴스 메서드
def bark(self):
return f"{self.name}이(가) 멍멍 짖습니다!"
# 객체 생성
my_dog = Dog("바둑이", 3)
# 속성 접근
print(my_dog.name) # 출력: 바둑이
print(my_dog.age) # 출력: 3
# 메서드 호출
print(my_dog.bark()) # 출력: 바둑이가 멍멍 짖습니다!
생성자와 메서드 (__init__, self)
__init__은 객체가 생성될 때 자동으로 호출되는 생성자 메서드입니다. 생성자는 객체의 초기 상태를 설정하는 데 사용됩니다.
생성자의 역할
- 인스턴스 속성을 초기화합니다.
- 객체 생성과 동시에 원하는 속성을 설정할 수 있습니다.
self의 의미
self는 객체 자신의 참조를 나타냅니다.self를 통해 클래스 내부에서 객체의 속성과 메서드에 접근합니다.
생성자와 메서드의 예제
class Book:
def __init__(self, title, author, pages):
self.title = title # 책 제목
self.author = author # 저자 이름
self.pages = pages # 총 페이지 수
def description(self):
return f"'{self.title}' by {self.author}, {self.pages} pages"
# 객체 생성
my_book = Book("파이썬 프로그래밍", "홍길동", 350)
# 메서드 호출
print(my_book.description()) # 출력: '파이썬 프로그래밍' by 홍길동, 350 pages
상속과 다형성
상속(inheritance)은 기존 클래스의 속성과 메서드를 새로운 클래스가 물려받아 재사용하거나 확장할 수 있는 기능입니다.
다형성(polymorphism)은 같은 이름의 메서드가 객체의 타입에 따라 다르게 동작하는 것을 말합니다.
상속 예제
# 부모 클래스
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
return "소리를 냅니다."
# 자식 클래스
class Dog(Animal):
def speak(self):
return f"{self.name}이(가) 멍멍 짖습니다!"
class Cat(Animal):
def speak(self):
return f"{self.name}이(가) 야옹합니다!"
# 객체 생성
dog = Dog("바둑이")
cat = Cat("나비")
print(dog.speak()) # 출력: 바둑이가 멍멍 짖습니다!
print(cat.speak()) # 출력: 나비가 야옹합니다!
캡슐화와 접근 제한자
캡슐화(encapsulation)는 객체의 속성과 메서드를 외부에서 직접 접근하지 못하도록 제한하고, 특정 인터페이스를 통해 접근하게 만드는 개념입니다.
접근 제한자의 종류
- Public (
public) : 기본 접근 수준으로, 어디서나 접근 가능합니다. - Protected (
protected) : 클래스 내부와 하위 클래스에서만 접근 가능합니다. (_로 표시) - Private (
private) : 클래스 내부에서만 접근 가능합니다. (__로 표시)
캡슐화 예제
class BankAccount:
def __init__(self, account_number, balance):
self.account_number = account_number # public
self._balance = balance # protected
def deposit(self, amount):
if amount > 0:
self._balance += amount
return f"{amount}원이 입금되었습니다."
return "잘못된 금액입니다."
def withdraw(self, amount):
if 0 < amount <= self._balance:
self._balance -= amount
return f"{amount}원이 출금되었습니다."
return "잔액이 부족하거나 잘못된 금액입니다."
def get_balance(self):
return f"현재 잔액은 {self._balance}원입니다."
# 객체 생성
account = BankAccount("123-456-789", 100000)
# 메서드 사용
print(account.deposit(50000)) # 출력: 50000원이 입금되었습니다.
print(account.withdraw(30000)) # 출력: 30000원이 출금되었습니다.
print(account.get_balance()) # 출력: 현재 잔액은 120000원입니다.
참고
Python은 엄격한 접근 제한을 강제하지 않으며, protected나 private 속성에 접근은 가능합니다. 하지만 이러한 네이밍 컨벤션을 통해 사용자는 암묵적으로 접근을 제한하는 것이 권장됩니다.

'Language > Python' 카테고리의 다른 글
| Python 예외 처리(Exception, try-except) (0) | 2023.10.26 |
|---|---|
| Python 모듈(module)과 패키지(package) (0) | 2023.10.25 |
| Python 파일 입출력 (파일 열기, 읽기와 쓰기) (0) | 2023.10.24 |
| Python의 리스트 컴프리헨션(List Comprehension) (0) | 2023.10.23 |
| Python 딕셔너리(Dictionary)와 집합(Set) (0) | 2023.10.22 |