본문 바로가기
카테고리 없음

디자인 패턴 개념과 활용법

by 준생님 2025. 4. 4.

 

디자인 패턴(Design Pattern)은 소프트웨어 개발에서 **반복적으로 발생하는 문제를 해결하기 위한 표준화된 설계 방법**입니다. 올바른 디자인 패턴을 사용하면 유지보수성과 확장성이 뛰어난 코드를 작성할 수 있습니다.

1. 디자인 패턴이란?

디자인 패턴은 소프트웨어 설계의 모범 사례(Best Practice)를 정의한 것입니다.

📌 디자인 패턴의 장점

  • 코드의 **재사용성** 증가
  • **유지보수성**이 뛰어난 코드 작성 가능
  • 개발자가 공통적인 설계를 이해하는 데 도움
  • 소프트웨어 설계에서 **유연성과 확장성** 향상

2. 디자인 패턴의 주요 유형

디자인 패턴은 크게 **세 가지**로 분류됩니다.

유형 설명 대표 패턴
생성 패턴 객체의 생성 과정을 단순화 싱글턴, 팩토리, 빌더
구조 패턴 클래스와 객체 간 관계를 최적화 어댑터, 데코레이터, 프록시
행동 패턴 객체 간의 상호작용을 정의 옵저버, 전략, 상태

3. 대표적인 디자인 패턴과 예제

📌 1. 싱글턴 패턴 (Singleton Pattern)

싱글턴 패턴은 **하나의 객체만 생성하도록 제한하는 패턴**입니다.

class Singleton:
    _instance = None

    @staticmethod
    def get_instance():
        if Singleton._instance is None:
            Singleton._instance = Singleton()
        return Singleton._instance

obj1 = Singleton.get_instance()
obj2 = Singleton.get_instance()

print(obj1 is obj2)  # 출력: True
    

📌 2. 팩토리 패턴 (Factory Pattern)

팩토리 패턴은 **객체 생성을 위한 인터페이스를 제공하는 패턴**입니다.

class Car:
    def drive(self):
        pass

class Tesla(Car):
    def drive(self):
        return "Tesla가 주행 중"

class BMW(Car):
    def drive(self):
        return "BMW가 주행 중"

class CarFactory:
    @staticmethod
    def get_car(brand):
        if brand == "Tesla":
            return Tesla()
        elif brand == "BMW":
            return BMW()

car = CarFactory.get_car("Tesla")
print(car.drive())  # 출력: Tesla가 주행 중
    

📌 3. 옵저버 패턴 (Observer Pattern)

옵저버 패턴은 **객체 간 1:N 관계를 정의하여 변경 사항을 자동으로 반영하는 패턴**입니다.

class Observer:
    def update(self, message):
        pass

class User(Observer):
    def __init__(self, name):
        self.name = name

    def update(self, message):
        print(f"{self.name} received: {message}")

class Channel:
    def __init__(self):
        self.subscribers = []

    def subscribe(self, user):
        self.subscribers.append(user)

    def notify(self, message):
        for user in self.subscribers:
            user.update(message)

channel = Channel()
user1 = User("Alice")
user2 = User("Bob")

channel.subscribe(user1)
channel.subscribe(user2)

channel.notify("새로운 영상이 업로드되었습니다!")  
# 출력: Alice received: 새로운 영상이 업로드되었습니다!
# 출력: Bob received: 새로운 영상이 업로드되었습니다!
    

📌 마무리

디자인 패턴은 소프트웨어 개발에서 코드의 **재사용성과 유지보수성**을 높여줍니다. 다양한 디자인 패턴을 익히고 실전에서 활용하면 더욱 효율적인 프로그램을 개발할 수 있습니다.