파이썬 - 추상화

안녕하세요, 파이썬 프로그래머를 꿈꾸는 여러분! 오늘은 파이썬에서 흥미로운 추상화 세계에 던져볼 거예요. 프로그래밍에 새로운 사람이라도 걱정하지 마세요; 저는 여러분이 이 개념을 단계별로 이해할 수 있도록 안내해 드릴 거예요, 마치 저의 수년간의 교육 경험에서 수많은 학생들을 안내한 것처럼요. 그럼, 좋아하는 음료를 준비하고 편하게 앉아서 함께 이 흥미로운 여정에 떠나보죠!

Python - Abstraction

추상화란 무엇인가요?

파이썬의 구체적인 세부 사항에 뛰어들기 전에, 프로그래밍에서 추상화란 무엇인지 이해해 보죠. 자동차를 운전하는 것을 상상해 보세요. 스티어링 휠, 페달, 기어 쉼표를 사용하는 방법을 알고 있지만, 엔진이 내부에서 어떻게 작동하는지 이해해야 하는 것은 아니죠. 그것이 바로 추상화의 핵심입니다 - 복잡한 구현 세부 사항을 숨기면서 간단한 인터페이스를 제공하여 상호작용할 수 있도록 합니다.

파이썬에서는 객체가 무엇을 하고 있는지에 주목할 수 있게 됩니다. 그것이 어떻게 하는지는 상관없죠. 마치 놀라운 일을 하는 마법의 상자를 가지고 있다는 것과 같아요 - 상자를 사용하는 방법을 알고 있으면 됩니다, 마법이 내부에서 어떻게 일어나는지는 필요하지 않습니다!

파이썬 추상화의 유형

파이썬에서는 주로 두 가지 유형의 추상화를 다룹니다:

  1. 데이터 추상화
  2. 프로세스 추상화

데이터 추상화

데이터 추상화는 복잡한 데이터 구조를 숨기고 데이터와 상호작용할 수 있는 간단한 인터페이스를 제공하는 것입니다. 간단한 예제를 살펴보죠:

class BankAccount:
def __init__(self):
self.__balance = 0  # Private attribute

def deposit(self, amount):
self.__balance += amount

def withdraw(self, amount):
if self.__balance >= amount:
self.__balance -= amount
else:
print("Insufficient funds!")

def get_balance(self):
return self.__balance

# BankAccount 클래스 사용
my_account = BankAccount()
my_account.deposit(1000)
my_account.withdraw(500)
print(my_account.get_balance())  # 출력: 500

이 예제에서는 잔액이 어떻게 저장되고 조작되는 세부 사항을 추상화했습니다. BankAccount 클래스의 사용자는 __balance 속성에 대해 알 필요 없이 제공된 메서드를 사용하여 계좌와 상호작용할 수 있습니다.

프로세스 추상화

프로세스 추상화는 함수나 메서드의 구현 세부 사항을 숨기는 것입니다. 예제를 살펴보죠:

def calculate_area(shape, *args):
if shape == "circle":
return 3.14 * args[0] ** 2
elif shape == "rectangle":
return args[0] * args[1]
elif shape == "triangle":
return 0.5 * args[0] * args[1]
else:
return "Unknown shape"

# calculate_area 함수 사용
circle_area = calculate_area("circle", 5)
rectangle_area = calculate_area("rectangle", 4, 6)
triangle_area = calculate_area("triangle", 3, 4)

print(f"Circle area: {circle_area}")
print(f"Rectangle area: {rectangle_area}")
print(f"Triangle area: {triangle_area}")

calculate_area 함수는 다양한 도형의 구체적인 계산을 추상화합니다. 사용자는 공식을 알 필요 없이 도형과 필요한 매개변수를 제공하면 됩니다.

파이썬 추상 클래스

이제 파이썬에서 추상 클래스에 대해 이야기해 보죠. 추상 클래스는 상속받을 수 있지만, 직접 인스턴스화되지 않는 클래스입니다. 다른 클래스의 블루프린트 같은 것입니다.

파이썬에서 추상 클래스를 만들기 위해서는 abc 모듈(추상 베이스 클래스)을 사용합니다. 이렇게 작동합니다:

from abc import ABC, abstractmethod

class Animal(ABC):
@abstractmethod
def make_sound(self):
pass

@abstractmethod
def move(self):
pass

class Dog(Animal):
def make_sound(self):
return "Woof!"

def move(self):
return "Running on four legs"

class Bird(Animal):
def make_sound(self):
return "Chirp!"

def move(self):
return "Flying with wings"

# 클래스 사용
dog = Dog()
bird = Bird()

print(dog.make_sound())  # 출력: Woof!
print(bird.move())  # 출력: Flying with wings

이 예제에서는 Animal이 추상 클래스로서 모든 동물의 인터페이스를 정의합니다. DogBird은 추상 메서드를 구현한 구상 클래스입니다.

추상 클래스 생성

추상 클래스를 생성하는 과정을 분리해 보겠습니다:

  1. 필요한 모듈을 임포트합니다:

    from abc import ABC, abstractmethod
  2. ABC에서 상속하여 추상 클래스를 생성합니다:

    class MyAbstractClass(ABC):
  3. @abstractmethod 데코레이터를 사용하여 추상 메서드를 정의합니다:

    @abstractmethod
    def my_abstract_method(self):
    pass

以下는 더 포괄적인 예제입니다:

from abc import ABC, abstractmethod

class Shape(ABC):
@abstractmethod
def area(self):
pass

@abstractmethod
def perimeter(self):
pass

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)

class Circle(Shape):
def __init__(self, radius):
self.radius = radius

def area(self):
return 3.14 * self.radius ** 2

def perimeter(self):
return 2 * 3.14 * self.radius

# 클래스 사용
rect = Rectangle(5, 3)
circle = Circle(4)

print(f"Rectangle area: {rect.area()}")
print(f"Circle perimeter: {circle.perimeter()}")

추상 메서드 오버라이딩

추상 클래스를 상속할 때는 모든 추상 메서드를 구현해야 합니다. 이를 메서드 오버라이딩이라고 합니다. 그렇지 않으면 파이썬은 클래스를 인스턴스화할 때 오류를 발생시킬 것입니다.

예제를 살펴보죠:

from abc import ABC, abstractmethod

class Vehicle(ABC):
@abstractmethod
def start_engine(self):
pass

@abstractmethod
def stop_engine(self):
pass

class Car(Vehicle):
def start_engine(self):
return "Car engine started. Vroom!"

def stop_engine(self):
return "Car engine stopped."

class Motorcycle(Vehicle):
def start_engine(self):
return "Motorcycle engine started. Vrrrm!"

def stop_engine(self):
return "Motorcycle engine stopped."

# 클래스 사용
car = Car()
motorcycle = Motorcycle()

print(car.start_engine())
print(motorcycle.stop_engine())

이 예제에서는 CarMotorcycleVehicle 클래스의 추상 메서드를 오버라이딩합니다.

결론

축하합니다! 여러분은 파이썬에서 추상화의 세계에 첫 걸음을 내딛었습니다. 추상화는 복잡한 시스템을 단순화하고 중요한 것에 주목하는 것이라는 것을 기억하십시오. 이는 여러분이 파이썬 여정에서 더 깔끔하고 조직적인 코드를 작성하는 데 도움이 될 강력한 도구입니다.

이 끝에, 우리가 논의한 주요 메서드를 요약한 표를 제공합니다:

메서드 설명
ABC 추상 베이스 클래스, 추상 클래스를 정의하는 데 사용
@abstractmethod 추상 메서드를 정의하는 데 사용하는 데코레이터
__init__ 객체를 초기화하는 생성자 메서드
super().__init__() 상속에서 부모 클래스를 초기화하는 호출

계속 연습하고, 호기심을 지켜주시고, эти 개념을 실험해 보세요. 알아보면, 여러분은 이미 우아한 추상화된 코드를 전문가처럼 작성하고 있을 것입니다! 코딩을 즐겁게, 미래의 파이썬 이들!

Credits: Image by storyset