카테고리 없음

스파르타 AI-8기 TIL(1/24)-TeamProject

kimjunki-8 2025. 1. 24. 23:16
상속? 데코레이터?

상속과 데코레이터는 파이썬에서 둘 다 코드 재사용성과 확장성을 높이는 도구이지만, 사용하는 목적과 방식이 완전히 다릅니다. 서로 비슷하게 보일 수 있지만 차이가 있습니다.

1. 상속 (Inheritance)
상속은 클래스 간의 관계를 정의하고, 기존 클래스(부모 클래스)의 속성과 메서드를 확장하거나 재정의하기 위해 사용됩니다.
특징
부모 클래스의 모든 속성과 메서드를 자식 클래스가 물려받습니다.
자식 클래스는 부모 클래스의 기능을 확장하거나 덮어쓸 수 있습니다.
객체 지향 프로그래밍(OOP)의 핵심 개념 중 하나입니다.
사용 사례
코드 재사용: 비슷한 기능을 가진 클래스들을 효율적으로 작성할 수 있습니다.
다형성(Polymorphism): 상속받은 메서드를 다양하게 오버라이드하여 동작을 변경할 수 있습니다.
class Animal:
    def sound(self):
        return "Some generic sound"

class Dog(Animal):
    def sound(self):
        return "Woof woof"

# 사용
animal = Animal()
dog = Dog()
print(animal.sound())  # Some generic sound
print(dog.sound())     # Woof woof​

“IS-A” 관계를 정의합니다. 예를 들어, Dog is a kind of Animal.
클래스 기반이며, 객체 지향적 설계입니다.

2. 데코레이터 (Decorator)
정의
데코레이터는 함수나 메서드의 동작을 동적으로 확장하거나 수정할 수 있는 도구입니다. 함수나 클래스에 적용할 수 있습니다.
특징
데코레이터는 함수(또는 클래스)를 입력으로 받아, 이를 수정하거나 기능을 추가한 새로운 함수를 반환합니다.
보통 @ 문법을 사용하여 간결하게 적용합니다.
사용 사례
로깅, 권한 체크, 성능 측정, 캐싱 등.
기존 코드를 변경하지 않고 동작을 확장합니다.
def logger(func):
    def wrapper(*args, **kwargs):
        print(f"Function {func.__name__} is called with {args} and {kwargs}")
        result = func(*args, **kwargs)
        print(f"Function {func.__name__} returned {result}")
        return result
    return wrapper

@logger
def add(a, b):
    return a + b

# 사용
print(add(3, 5))

“HAS-A” 관계를 정의합니다. 함수나 객체가 추가적인 기능을 가진다.
함수형 프로그래밍 스타일을 활용하며, 주로 동작을 추가하거나 수정합니다.

비슷하게 느껴지는 이유
상속과 데코레이터는 둘 다 기존 기능을 확장하거나 재정의한다는 점에서 비슷하게 느껴질 수 있습니다. 하지만 근본적으로 다릅니다.

구조적 차이:
상속은 클래스를 기반으로 전체 구조를 확장하거나 변경하는 데 사용되며, 데코레이터는 특정 함수나 메서드의 동작만 수정합니다.

적용 범위:
상속은 클래스 전체에 영향을 미치지만, 데코레이터는 함수 단위로 동작합니다.


언제 상속과 데코레이터를 사용할까?
상속을 사용할 때:
여러 클래스가 비슷한 기능을 공유할 때.
객체 간의 계층 구조(예: 동물 -> 포유류 -> 개)를 만들 때.
기본 동작을 유지하면서 확장이 필요한 경우.

데코레이터를 사용할 때:
기존 함수나 메서드의 동작을 변경하지 않고 추가적인 동작을 덧붙이고 싶을 때.
로깅, 권한 검사, 성능 측정과 같은 반복적인 작업을 처리할 때.