OOP

OOP/Design Pattern

20. 전략(Strategy) 패턴

전략(Strategy) 패턴: 행위패턴 객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화 하는 인터페이스를 정의하여, 객체의 행위를 동적으로 바꾸고 싶은 경우 직접 행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장하는 패턴 필요에 따라 변경이 필요한 알고리즘을 인터페이스를 통해 통째로 외부로 분리시켜, 전략 클래스를 만들어(캡슐화), 이를 필요에 따라 동적으로 바꿔서 사용할 수 있게 하는 디자인 패턴이다. 여기서 알고리즘이 뜻하는 바는 독립적인 책임으로 분리가 가능한 기능을 말한다. 이를 대체 가능한 전략이라고 보기 때문에 패턴 이름이 전략패턴이다. 전략패턴은 디자인의 꽃이라 불릴만큼 중요한 패턴이다. Context: Strategy의 메소드를 호..

OOP/Design Pattern

19. 스테이트(State) 패턴

스테이트(State) 패턴: 행위패턴 객체가 상태에 따라 행위를 다르게 할 때, 직접 상태를 체크하여 상태에 따른 행위를 호출하는 것이 아니라 상태를 객체화하여 필요에 따라 다르게 행동하도록 위임하는 디자인 패턴 객체의 상태에 따라 조건문을 사용할 때, 스테이트 패턴을 적용해 볼 수 있다. 가령 사람이 가만히 서 있는 상태와 앉아 있는 상태, 걷는 상태가 있다고 했을 때, 사람 객체에 state 필드를 만들어 상태를 확인하는 것이 아닌, 이 상태들을 모두 객체화하는 것이다. 외부로부터 캡슐화하기 위해 state 인터페이스를 만들고 각 상태를 구현한다. PersonState(state 인터페이스) package behavioral.state; public interface PersonState { publ..

OOP/Design Pattern

18. 옵저버(Observer) 패턴

옵저버(Observer) 패턴: 행위패턴 클래스 간의 복잡한 관계들을 캡슐화하여 하나의 클래스에서 관리하도록 처리하는 패턴, 일대다(one-to-many) 의존성을 정의한다. 어떤 객체의 상태가 변할 때 그와 연관된 객체들에게 알림을 보내는 디자인 패턴이 옵저버 패턴이라고 할 수 있다. 실시간으로 한 객체의 변경사항을 다른 객체에 전파할 수 있으며, 느슨한 결합으로 시스템이 유연하고 객체간의 의존성을 제거할 수 있다. 하지만 너무 많이 사용하게 되면, 상태 관리가 힘들 수 있다. 또 데이터 배분에 문제가 생기면 큰 문제로 이어질 수 있다. 주로 분산 이벤트 핸들링 시스템을 구현하는 데 사용된다. 쉽게 말해 subject에 observer을 등록하여 정보를 받는(notify) 패턴. Subject : Ob..

OOP/Design Pattern

17. 메멘토(Memento) 패턴

메멘토(Memento) 패턴: 행위패턴 객체의 상태 정보를 저장하고 사용자의 필요에 의하여 원하는 시점의 데이터를 복원 할 수 있는 패턴 특정 시점에서의 객체 내부 상태를 객체화함으로써 이후 요청에 따라 객체를 해당 시점의 상태로 돌릴 수 있는 기능을 제공하는 패턴. 포토샵 되돌리기나 뒤로가기를 떠올리면 이해가 쉬울 것이다. Originator : 현재 상태를 표현하는 State를 가지고 있으며, Memento 객체를 통해 현재 상태를 변경 Memento : Originator의 상태를 나타내는 클래스, Memento를 이용하여 Originator의 상태를 변경 ​CareTaker : Memento를 순서대로 저장하여 관리하는 클래스, Stack이나 List 같은 자료구조를 사용해도 무방 PhotoSha..

OOP/Design Pattern

16. 중재자(Mediator) 패턴

중재자(Mediator) 패턴: 행위패턴 클래스 간의 복잡한 관계들을 캡슐화하여 하나의 클래스에서 관리하도록 처리하는 패턴 중재자 패턴을 사용하면 객체 간 통신은 중재자 객체 안에 함축된다. 객체들은 더 이상 다른 객체와 서로 직접 통신하지 않으며 대신 중재자를 통해 통신한다. 이를 통해 통신 객체 간 의존성을 줄일 수 있으므로 결합도를 감소시킨다. M:N 관계를 해당 패턴을 사용하면 M:1 관계로 만들어 복잡도를 내리므로 유지 보수 및 확장성에 유리하다. 느슨한 결합(loose coupling)을 유지할 수 있고 전체적인 흐름을 읽기 편해진다. Mediator: 객체 간의 상호참조를 위한 인터페이스. Colleague: 다른 Colleague와의 상호참조를 위한 인터페이스. ConcreteMediato..

OOP/Design Pattern

15. 이터레이터(iterator) 패턴

이터레이터(iterator) 패턴: 행위패턴 컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체안에 들어있는 모든 항목에 접근할 수 있게 해 주는 방법을 제공해 주는 패턴 반복자 패턴이라고도 부른다. 컬렉션 객체 안에 들어있는 모든 항목에 접근하는 방식이 통일되어 있으면 어떤 종류의 집합체에 대해서도 사용할 수 있는 다형적인 코드를 만들수 있다. 반복자 패턴의 본질은 기반이 되는 표현을 노출시키지 않고 연속적으로 객체 요소에 접근하는 방법을 제공하는 것이다. Iterator 집합체의 요소들을 순서대로 검색하기 위한 인터페이스 정의 ConcreateIterator Iterator 인터페이스를 구현함 Aggregate 여러 요소들로 이루어져 있는 집합체 ConcreateAggregate Aggreagate ..

OOP/Design Pattern

14. 인터프리터(Interpreter) 패턴

인터프리터(Interpreter) 패턴 : 행위패턴 문법규칙을 클래스로 표현한 구조, 일련의 규칙으로 정의된 문법적 언어를 해석하는 패턴 해석자 패턴이라고도 불린다. 반복되는 문제 패턴을 언어 또는 문법으로 정의한다. 자바소스 코드를 JVM이 이해할 수 있도록 바이트 코드로 바꿔주는 자바 컴파일러와 정규 표현식이 대표적인 예시이다. Context : Expression에서 사용하는 공통된 정보가 담겨있다. 문장을 저장하고 관리하는 클래스 Expression: 표현하는 문법을 나타낸다. Context가 들어 있는 것을 볼 수 있다. TerminalExpression: 종료되는 Expression NonTerminalExpression: Expression들을 재귀적으로 참조하고 있는 Expression, ..

OOP/Design Pattern

13. 커맨드(Command) 패턴

커맨드(Command) 패턴: 행위패턴 요청에 대한 모든 정보가 포함된 독립실행형 객체로 변환하는 디자인 패턴. 쉽게 말해 Client가 보낸 요청을 객체로 캡슐화한다는 의미이다. 이 변환은 다양한 요청들이 있는 메서드들을 인수화할 수 있도록 하며, 요청의 실행을 지연 또는 대기열에 넣을 수 있도록 하고, 또 실행 취소할 수 있는 작업을 지원할 수 있다. 어떤 객체(A)에서 다른 객체(B)의 메서드를 실행하려면 그 객체(B)를 참조하고 있어야 하는 의존성이 발생한다. 그러나 커맨드 패턴을 적용하면 의존성을 제거할 수 있다. 또한 기능이 수정되거나 변경이 일어날 때 A 클래스 코드를 수정없이 기능에 대한 클래스를 정의하면 되므로 시스템이 확장성이 있으면서 유연해진다. 발송자(Invoker) : 요청들을 시..

OOP/Design Pattern

12. 프록시(Proxy) 패턴

프록시(Proxy) 패턴: 구조패턴 프록시(Proxy)를 번역하면 대리자, 대변인의 의미를 갖고 있다. 대리자, 대변인은 누군가를 대신해서 그 역할을 수행하는 존재이다. 이는 프로그램에도 똑같이 적용된다. 즉, 프록시에게 어떤 일을 대신 시키는 것이다. 일반적으로 프록시는 다른 무언가와 이어지는 인터페이스의 역할을 하는 클래스이다. 프록시는 어떠한 것(이를테면 네트워크 연결, 메모리 안의 커다란 객체, 파일, 또 복제할 수 없거나 수요가 많은 리소스)과도 인터페이스의 역할을 수행할 수 있다. 일반적으로 사용하는 프록시라는 용어와 디자인 패턴에서 말하는 프록시 패턴을 구분해야 한다. 전자는 윗 설명처럼 클라이언트와 사용 대상 사이에 대리 역할을 맡은 오브젝트를 두는 방법을 의미하지만, 후자는 프록시를 사용..

OOP/Design Pattern

11. 플라이웨이트(Flyweight) 패턴

플라이웨이트(Flyweight) 패턴: 구조패턴 동일하거나 유사한 객체들 사이에 가능한 많은 데이터를 서로 공유하여 사용하도록 하여 메모리 사용량을 최소화하는 디자인 패턴이다. 특정 클래스의 인스턴스 한 개만 가지고 여러 개의 가상 인스턴스를 제공하고 싶을 때 사용한다. 쉽게 말해 인스턴스를 가능한 대로 공유하여 메모리 낭비를 줄이는 방법이다. 중요한 점은 중복되는 객체는 공유해서 사용하자는 것! Flyweight 공유에 사용할 클래스들의 인터페이스를 선언 ConcreteFlyweight Flyweight의 구체 클래스 (실제 공유될 객체) FliweightFactory Flyweight 인스턴스를 생성 또는 공유해주는 역할 Client 플라이웨이트틀 사용하는 사용자 Weapon(Flyweight) pa..

지구우중
'OOP' 카테고리의 글 목록