728x90
CS
전략(Strategy) 패턴
- 전략 패턴은 실행(런타임) 중에 알고리즘 전략을 선택하여 객체 동작을 실시간으로 바뀌도록 할 수 있게 하는 행위 디자인 패턴이다. 여기서 전략이란 일종의 알고리즘이 될 수도 있으며, 기능이나 동작이 될 수도 있는 특정한 목표를 수행하기 위한 행동 계획을 말한다.
- 즉, 어떤 일을 수행하는 알고리즘이 여러가지 일때, 동작들을 미리 전략으로 정의함으로써 손쉽게 전략을 교체할 수 있는, 알고리즘 변형이 빈번하게 필요한 경우에 적합한 패턴이다.
전략 패턴 구조
- 전략 알고리즘 객체들
- 알고리즘, 행위, 동작을 객체로 정의한 구현체
- 전략 인터페이스
- 모든 전략 구현체에 대한 공용 인터페이스
- 컨텍스트(Context)
- 알고리즘을 실행할 때마다 해당 알고리즘과 연결된 전략 객체의 메소드를 호출한다.
- 클라이언트
- 특정 전략 객체를 컨텍스트에 전달 함으로써 전략을 등록하거나 변경하여 전략 알고리즘을 실행한 결과를 누린다.
전략 패턴은 OOP의 집합체
- GoF의 디자인 패턴 책에서는 전략 패턴을 다음과 같이 정의한다.
- 동일 계열의 알고리즘군을 정의하고
- 각각의 알고리즘을 캡슐화하여
- 이들의 상호 교환이 가능하도록 만든다.
- 알고리즘을 사용하는 클라이언트와 상관없이 독립적으로
- 알고리즘을 다양하게 변경할 수 있게 한다.
전략 패턴 특징
- 전략 패턴 사용 시기
- 전략 알고리즘의 여러 버전 또는 변형이 필요할 때 클래스화를 통해 관리
- 알고리즘 코드가 노출되어서는 안되는 데이터에 액세스 하거나 데이터를 활용할 때 (캡슐화)
- 알고리즘의 동작이 런타임에 실시간으로 교체 되어야 할 때
- 전략 패턴의 주의점
- 알고리즘이 많아질 수록 관리해야할 객체의 수가 늘어난다는 단점이 있다.
- 만일 어플리케이션 특성이 알고리즘이 많지 않고 자주 변경되지 않는다면, 새로운 클래스와 인터페이스를 만들어 프로그램을 복잡하게 만들 이유가 없다.
- 개발자는 적절한 전략을 선택하기 위해 전략 간의 차이점을 파악하고 있어야 한다.(복잡도가 높다.)
비슷한 디자인 패턴 비교 - Strategy vs Temaplate Method
- 패턴 유사점
- 전략 패턴과 템플릿 메서드 패턴은 알고리즘을 때에 따라 적용한다는 컨셉으로써, 둘이 공통점을 가지고 있다.
- 전략 및 템플릿 메서드 패턴은 개방형 폐쇄 원칙을 충족하고 코드를 변경하지 않고 소프트웨어 모듈을 쉽게 확장할 수 있도록 하는데 사용할 수 있다.
- 패턴 차이점
- 전략 패턴은 합성(composition)을 통해 해결책을 강구하며, 템플릿 메서드 패턴은 상속(inheritance)을 통해 해결책을 제시한다.
- 그래서 전략 패턴은 클라이언트와 객체 간의 결합이 느슨한 반면, 템플릿 메서드 패턴에서는 두 모듈이 더 밀접하게 결합된다.(결합도가 높으면 안좋다.)
- 전략 패턴에서는 대부분 인터페이스를 사용하지만, 템플릿 메서드 패턴에서는 주로 추상 클래스나 구체적인 클래스를 사용한다.
- 전략 패턴에서는 전체 전략 알고리즘을 변경할 수 있지만, 템플릿 메서드 패턴에서는 알고리즘의 일부만 변경되고 나머지는 변경되지 않은 상태로 유지된다.(템플릿에 종속)
- 따라서 단일 상속만이 가능한 자바에서 상속 제한이 있는 템플릿 메서드 패턴보다는, 다양하게 많은 전략을 implements 할 수 있는 전략 패턴이 협업에서 많이 사용된다.
참조
https://inpa.tistory.com/entry/GOF-💠-전략Strategy-패턴-제대로-배워보자
C++
객체
객체란?
- 변수들과 참고 자료들로 이루어진 소프트웨어 덩어리이다.
- 이때 객체가 현실 세계에서의 존재하는 것들을 나타내기 위해서는 추상화(abstraction) 라는 과정이 필요하다. 어떠한 객체는 자기 만의 정보를 나타내는 변수들과, 이를 가지고 어떠한 작업을 하는 함수들로 둘러싸고 있다고 보면 된다. 참고로, 이러한 변수나 함수들을 보통 인스턴스 변수(instance variable)와 인스턴스 메소드(instance method) 라고 부르게 되는데, 알고있는 변수와 함수와 동일하다고 생각하면 된다.
- 외부에서 직접 인스턴스 변수의 값을 바꿀 수 없고 항상 인스턴스 메소드를 통해서 간접적으로 조절하는 것을 캡슐화(Encapsulation) 라고 부른다.
클래스
- C++에서 객체를 만들 수 있는 장치를 클래스(Class)라고 한다. 이와 같은 클래스를 이용해서 만들어진 객체를 인스턴스(instance)라고 부른다.
- 클래스 내부의 변수와 클래스를 멤버 변수(member variable)과 멤버 함수(member function)라고 부른다.
- 즉, 인스턴스로 생성된 객체에서는 인스턴스 변수, 인스턴스 함수, 그리고 그냥 클래스 상에서는 멤버 변수, 멤버 함수라고 부른다.
접근 지시자
- 외부에서 이러한 멤버들에 접근을 할 수 있는가 없는가를 지시해 주는 것이다.
- private 키워드의 경우, 아래에 쓰여진 것들은 모두 객체 내에서 보호되고 있다 라는 의미이다. private 되고 있는 모든 것들은 자기 객체 안에서만 접근할 수 있을 뿐 객체 외부에서는 접근할 수 없게 된다.
- 반면에 public 키워드의 경우, 공개된 것으로 외부에서 마음껏 이용할 수 있다.
- 키워드를 명시하지 않았다면 기본적으로 private로 설정된다.
728x90
'언어 > C++' 카테고리의 다른 글
Call by Value/Call by Reference (0) | 2024.11.24 |
---|---|
추상 클래스/인터페이스 (0) | 2024.11.22 |
Set / Unordered Set (0) | 2024.06.18 |
STL 컨테이너 (0) | 2024.06.16 |
포인터 변수와 참조, Malloc과 New (0) | 2024.06.12 |