[Python] 객체지향프로그래밍(3) - OOP의 네 가지 특징(캡슐화, 상속, 다형성, 추상화)

휴먼시아·2024년 10월 13일

Python

목록 보기
2/2
post-thumbnail

객체지향프로그래밍 세 번째 글에서는 OOP의 네 가지 특징인 캡슐화, 상속, 다형성, 추상화에 대해 다뤄보려고 합니다.


🔌 캡슐화(Encapsulation)

캡슐화는 데이터(변수)와 그 데이터를 다루는 방법(메서드)을 하나로 묶는 것입니다. 이는 마치 알약 캡슐처럼 내용물을 보호하고 외부에서 직접 접근하지 못하게 하는 개념입니다.

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())  # 잔액 확인

🔌 상속(Inheritance)

상속은 기존 클래스의 특성을 새로운 클래스가 물려받는 것입니다. 이는 부모로부터 자식이 특성을 물려받는 것과 유사합니다.

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!

🔌 다형성(Polymorphism)

다형성은 같은 이름의 메서드가 다른 클래스에서 다르게 동작할 수 있게 하는 것입니다. 이는 "여러 형태를 가질 수 있다"는 의미입니다.

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()

🔌 추상화(Abstraction)

추상화는 복잡한 현실을 간단하게 표현하는 것입니다. 필요한 핵심 특성만 남기고 불필요한 세부사항은 숨깁니다.

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()}")
profile
코(딩)찔찔이 성장기

0개의 댓글