객체지향프로그래밍 세 번째 글에서는 OOP의 네 가지 특징인 캡슐화, 상속, 다형성, 추상화에 대해 다뤄보려고 합니다.
캡슐화는 데이터(변수)와 그 데이터를 다루는 방법(메서드)을 하나로 묶는 것입니다. 이는 마치 알약 캡슐처럼 내용물을 보호하고 외부에서 직접 접근하지 못하게 하는 개념입니다.
class BankAccount:
def __init__(self, owner, balance):
self.__owner = owner # private 속성
self.__balance = balance # private 속성
def deposit(self, amount):
if amount > 0:
self.__balance += amount
return True
return False
def withdraw(self, amount):
if 0 < amount <= self.__balance:
self.__balance -= amount
return True
return False
def get_balance(self):
return self.__balance
#사용예시
account = BankAccount("Alice", 1000)
account.deposit(500) # 입금
account.withdraw(200) # 출금
print(account.get_balance()) # 잔액 확인
상속은 기존 클래스의 특성을 새로운 클래스가 물려받는 것입니다. 이는 부모로부터 자식이 특성을 물려받는 것과 유사합니다.
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!"
# 사용 예시
dog = Dog("Buddy")
cat = Cat("Whiskers")
print(dog.speak()) # Buddy says Woof!
print(cat.speak()) # Whiskers says Meow!
다형성은 같은 이름의 메서드가 다른 클래스에서 다르게 동작할 수 있게 하는 것입니다. 이는 "여러 형태를 가질 수 있다"는 의미입니다.
class Triangle(Shape):
def __init__(self, base, height, side1, side2, side3):
self.base = base
self.height = height
self.side1 = side1
self.side2 = side2
self.side3 = side3
def area(self):
return 0.5 * self.base * self.height
def perimeter(self):
return self.side1 + self.side2 + self.side3
def print_shape_info(shape):
print(f"Area: {shape.area():.2f}")
print(f"Perimeter: {shape.perimeter():.2f}")
# 사용 예시
circle = Circle(5)
rectangle = Rectangle(4, 6)
triangle = Triangle(3, 4, 3, 4, 5)
for shape in [circle, rectangle, triangle]:
print_shape_info(shape)
print()
추상화는 복잡한 현실을 간단하게 표현하는 것입니다. 필요한 핵심 특성만 남기고 불필요한 세부사항은 숨깁니다.
from abc import ABC, abstractmethod
import math
class Shape(ABC):
@abstractmethod
def area(self):
pass
@abstractmethod
def perimeter(self):
pass
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return math.pi * self.radius ** 2
def perimeter(self):
return 2 * math.pi * self.radius
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
def perimeter(self):
return 2 * (self.width + self.height)
# 사용 예시
circle = Circle(5)
rectangle = Rectangle(4, 6)
print(f"Circle area: {circle.area():.2f}")
print(f"Rectangle perimeter: {rectangle.perimeter()}")