본문 바로가기
파이썬

파이썬 강의: 전략 패턴 마스터하기!

by bio62⭐ 2024. 10. 30.

확인했음.

 

파이썬 디자인 패턴 중 하나인 전략 패턴을 깊이 있게 파헤쳐 봅니다. 실제 코드 예제와 함께 쉽고 명확하게 개념을 이해하고, 실무에서 어떻게 활용하는지 배우세요. 유연하고 확장 가능한 코드를 작성하는 비결을 공개합니다!

 


전략(Strategy) 패턴: 유연성의 핵심, 알고리즘을 객체로 만들다

어휴, 디자인 패턴… 듣기만 해도 머리 아프죠? 저도 처음엔 그랬어요. 하지만 한번 제대로 이해하고 나면, 코딩 실력이 확! 늘었다는 걸 느끼실 거예요. 오늘 소개할 전략 패턴은 그중에서도 특히 유용하고, 사실 은근히 쉽게 이해할 수 있는 패턴 중 하나입니다. 뭐, 이름만 들어도 왠지 어려울 것 같지만요. 😅

 

전략 패턴은, 간단히 말해 알고리즘을 객체로 캡슐화하는 겁니다. 뭔 소리냐구요? 예를 들어, 쇼핑몰에서 결제할 때 카드 결제, 계좌 이체, 휴대폰 결제 등 여러 가지 방법이 있죠? 이 각각의 결제 방식을 각각의 클래스로 만들어서 관리하는 게 바로 전략 패턴의 핵심 아이디어입니다. 이렇게 하면 새로운 결제 방식이 추가돼도 기존 코드를 건드릴 필요가 없어요. 그냥 새로운 클래스 하나만 추가하면 끝! 얼마나 편리해요? 👍

 

그럼, 이 전략 패턴의 내부 구조를 좀 더 자세히 살펴볼까요? 주요 구성 요소는 크게 세 가지입니다. 먼저 전략 인터페이스는 모든 전략 클래스가 반드시 구현해야 하는 공통 인터페이스입니다. 이 인터페이스는 어떤 알고리즘을 사용하든 상관없이 공통적으로 사용할 수 있는 메서드를 정의해 놓은 겁니다. 마치 모든 병사들이 따라야 하는 기본 훈련 규칙과 같은 거죠.

 

다음으로 구체적인 전략 클래스가 있습니다. 이건 전략 인터페이스를 구현하는 실제 알고리즘을 담고 있는 클래스입니다. 각 클래스는 서로 다른 알고리즘을 가지고 있어요. 예를 들어, 위의 결제 시스템에서 카드 결제 클래스, 계좌 이체 클래스, 휴대폰 결제 클래스가 각각 구체적인 전략 클래스가 되는 거죠. 각 클래스는 자기만의 특별한 결제 방식을 가지고 있는 셈입니다.

 

마지막으로 콘텍스트는 전략을 선택하고 실행하는 역할을 합니다. 콘텍스트는 구체적인 전략 클래스의 객체를 가지고 있으며, 어떤 전략을 사용할지는 런타임(프로그램 실행 중)에 결정할 수 있습니다. 마치 장군이 전황을 보고 적절한 전략을 선택하는 것과 같은 겁니다. 이렇게 하면 프로그램이 유연하고 확장 가능하게 만들 수 있다는 장점이 있습니다.

 


전략 패턴의 장점과 단점: 천사와 악마의 속삭임

자, 이제 전략 패턴을 사용하면 어떤 장점이 있는지, 또 어떤 단점이 있는지 자세히 살펴볼까요? 모든 디자인 패턴이 그렇듯이 장점만 있는 건 아니니까요. 🤔

 

전략 패턴의 가장 큰 장점은 바로 유연성과 확장성입니다. 새로운 알고리즘을 추가하거나 기존 알고리즘을 변경하는 것이 매우 쉽습니다. 기존 코드를 수정할 필요가 없으니 유지보수도 간편해지죠. 마치 레고 블록을 조립하듯이, 필요에 따라 알고리즘 블록을 끼워 넣고 빼낼 수 있다고 생각하면 됩니다. 개발자 입장에선 정말 꿈같은 일이죠! 😇

 

하지만 모든 게 장밋빛인 건 아니죠. 단점도 존재합니다. 전략의 수가 많아지면 클래스의 수도 그만큼 늘어나서 코드가 복잡해질 수 있습니다. 또한, 전략 간의 상호작용이 복잡한 경우 코드를 관리하기가 어려워질 수도 있죠.

 

그래서 전략 패턴은 모든 상황에 적용할 수 있는 만능 패턴은 아니에요. 알고리즘의 종류가 많고, 그 알고리즘들이 자주 변경될 가능성이 높은 경우에 특히 유용합니다. 하지만 알고리즘의 수가 적고 변경될 일이 거의 없다면 전략 패턴을 사용하는 것은 오히려 코드를 복잡하게 만들 수 있으니 신중하게 결정해야 합니다.

 


파이썬으로 전략 패턴 구현하기: 실전 코드 예제

이제 드디어 실전 코드를 살펴볼 시간입니다! 말로만 설명해서는 잘 이해가 안 되실 테니까요. 😊 다음은 파이썬으로 전략 패턴을 구현한 간단한 예제입니다. 리스트를 정렬하는 여러 가지 방법을 전략 패턴으로 구현해 보았습니다.

 

from abc import ABC, abstractmethod

class SortStrategy(ABC):
    @abstractmethod
    def sort(self, data):
        pass

class BubbleSortStrategy(SortStrategy):
    def sort(self, data):
        n = len(data)
        for i in range(n-1):
            for j in range(n-i-1):
                if data[j] > data[j+1]:
                    data[j], data[j+1] = data[j+1], data[j]
        return data

class QuickSortStrategy(SortStrategy):
    def sort(self, data):
        data.sort() # 파이썬 내장 함수 사용 (실제 퀵 정렬 구현은 더 복잡)
        return data

class Sorter:
    def __init__(self, strategy: SortStrategy):
        self.strategy = strategy

    def sort(self, data):
        return self.strategy.sort(data)


data = [5, 1, 4, 2, 8]

sorter_bubble = Sorter(BubbleSortStrategy())
print(f"버블 정렬 결과: {sorter_bubble.sort(data.copy())}")

sorter_quick = Sorter(QuickSortStrategy())
print(f"퀵 정렬 결과: {sorter_quick.sort(data.copy())}")

 코드에서는 SortStrategy라는 추상 클래스를 정의하고, BubbleSortStrategy와 QuickSortStrategy가 이를 상속받아 각각 버블 정렬과 퀵 정렬 알고리즘을 구현합니다. Sorter 클래스는 어떤 정렬 전략을 사용할지 결정하고, 실제 정렬 작업을 수행하는 역할을 합니다. 어때요? 생각보다 간단하죠? 😉

 


전략 패턴의 실제 활용 사례: 현실 세계에서 만나다


이론적인 설명만으로는 부족하겠죠? 실제로 전략 패턴이 어떻게 사용되는지 몇 가지 예를 들어볼게요. 이해를 돕기 위해 표로 정리해 보았습니다.

 

결제 시스템 신용카드 결제, 계좌 이체, 페이팔 결제 각 결제 방식에 대한 구현을 분리하여 관리
이미지 처리 JPEG, PNG, GIF 처리 각 이미지 포맷에 대한 처리 로직을 분리
로그 시스템 콘솔 로그, 파일 로그, 데이터베이스 로그 로그 기록 방식을 변경하기 쉽도록 구현
검색 엔진 순차 검색, 이진 검색, 해시 검색 다양한 검색 알고리즘을 사용하여 검색 결과 제공

활용 분야 구체적인 전략 설명

 

이처럼 전략 패턴은 여러 가지 알고리즘을 쉽게 교체하고 관리할 수 있도록 해줍니다. 덕분에 유지보수가 훨씬 쉬워지고, 프로그램의 확장성도 높아지죠!

 

자주 묻는 질문 (FAQ)

Q1: 전략 패턴은 언제 사용해야 할까요?

 

A1: 알고리즘의 종류가 많고, 그 알고리즘들이 자주 변경될 가능성이 높은 경우에 전략 패턴을 사용하는 것이 좋습니다. 하지만 알고리즘의 수가 적고 변경될 일이 거의 없다면 오히려 코드를 복잡하게 만들 수 있으니 주의해야 합니다.

 

Q2: 전략 패턴의 단점은 무엇인가요?

 

A2: 전략 패턴의 가장 큰 단점은 클래스의 수가 많아질 수 있다는 것입니다. 알고리즘의 수가 많아지면 클래스의 수도 그만큼 늘어나서 코드 관리가 어려워질 수 있습니다.

 

Q3: 전략 패턴과 다른 디자인 패턴과의 차이점은 무엇인가요?

 

A3: 전략 패턴은 알고리즘을 캡슐화하는 데 초점을 맞추는 반면, 다른 디자인 패턴들은 객체의 생성, 상호 작용, 구조 등 다른 측면에 초점을 맞춥니다. 예를 들어 템플릿 메서드 패턴은 알고리즘의 뼈대를 제공하고, 전략 패턴은 알고리즘의 구현을 담당하는 클래스들을 분리하는 방식으로, 서로 다른 목적을 가지고 있습니다.

 

마무리:  전략 패턴, 이제 어렵지 않죠?  꾸준히 연습하면  훌륭한 파이썬 개발자가 되는 길이 눈앞에 보일 거예요!

 

키워드:파이썬, 디자인패턴, 전략패턴, 객체지향프로그래밍, 알고리즘, 유연성, 확장성, 코드,  프로그래밍, 개발,  소프트웨어,  설계