JAVA 객체 지향 디자인 패턴 - 5 - 행동
포스트
취소

JAVA 객체 지향 디자인 패턴 - 5 - 행동

  • Behavioral Chain of Responsibility, Command, Interpreter, Iterator, Mediator, Memento, Observer State, Strategy, Template Method, Visitor 객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴으로, 가령 한 객체가 혼자 수행할 수 없는 작업을 여러 개의 객체로 어떻게 분배하는지, 또 그렇게 하면서도 객체 사이의 결합도를 최소화하는 것에 중점을 둔다.

Strategy 스트래티지 패턴은 전략을 쉽게 바꿀 수 있도록 해주는 디자인 패턴이다. 여기에서 전략이란 어떤 목적을 달성하기 위해 일을 수행하는 방식, 비즈니스 규칙, 문제를 해결하는 알고리즘 등으로 이해할 수 있다. 프로그램에서 전략을 실행할 때는 쉽게 전략을 바꿔야 할 필요가 있는 경우가 많이 발생한다. 특히 게임 프로그래밍에서 게임 캐릭터가 자신이 처한 상황에따라 공격이나 행동하는 방식을 바꾸고 싶을 때 스트래티지 패턴은 매우 유용하다

State 실세계의 많은 개체는 자신이 처한 상태에 따라 일을 다르게 수행한다. 비가 오거나 눈이 오거나 사람이 많이 붐비는 장소에 있거나에 따라 걷는 방식과 말하는 방식이 달라지는 것과 마찬가지 이치다. 이를 표현하는 가장 직접적이고 직관적인 방법은 일을 수행할 때의 상태에 따라 상태 하나하나가 어떤 상태인지 검사해 일을 다르게 수행하게끔 하는 것이다. 이는 분명 복잡한 조건식이 있는 코드를 산추랗ㄹ 것이고, 결과적으로 코드를 이해하거나 수정하기 어렵게 만든다. 이런 방식과는 달리 스테이트 패턴은 어떤 행위를 수행할 때 상태에 행위를 수행하도록 위임한다. 이를 위해 스테이트 패턴에서는 시스템의 각 상태를 클래스로 분리해 표현하고, 각 클래스에서 수행하는 행위들을 메서드로 구현한다. 그리고 이러한 상태들을 외부로부터 캡슐화하기 위해 인터페이스를 만들어 시스템의 각 상태를 나타내는 클래스로 하여금 실체화하게 한다.

Command 커맨드 패턴은 이벤트가 발생했을 때 실행될 기능이 다양하면서도 변경이 필요한 경우에 이벤트를 발생시키는 클래스를 변경하지 않고 재사용하고자 할 때 유요하다. 예를 들어 ‘file open’ 이라는 메뉴 항목이 선택되었을 때 실행될 기능과 ‘file close’ 라는 메뉴 항목이 선택되었을 때 실행되는 기능은 다를 것이다. 이런 경우 메뉴아이템 클래스에서 직접 구체적인 기능을 구현한다면 파일오픈 메뉴 항목을 위한 메뉴아이템 클래스와 파일 클로스 메뉴 항목을 위한 메뉴아이템 클래스를 각각 구현해야한다. 메뉴아이템 클래스는 하나이므로 파일 오픈과 파일 클로즈 메뉴 항목을 재사용하기 어려울 수 있기 때문이다. 이런 경우에는 커맨드 패턴을 활용하면 메뉴아이템 클래스를 재사용할 수 있다. 먼저 파일오픈 메뉴의 기능과 파일클로즈 메뉴의 기능을 담당하는 클래스가 커맨드라는 인터페이스를 구현하도 한다. 그리고 메뉴아이템 클래스가 커맨드 인터페이스를 사용하도록 설계하면 메뉴아이템 클래스는 파일오픈 메뉴 항목과 파일클로즈 메뉴 항목에서 그대로 재사용할 수 있게 된다.

Observer 옵저버 패턴은 데이터의 변경이 발생했을 경우 상대 클래스나 객체에 의존하지 않으면서 데이터 변경을 통보하고자 할 때 유용하다. 예를 들어 새로운 파일이 추가되거나 기존 파일이 삭제되었을 때 탐색기는 이를 즉시 표시할 필요가 있다. 탐색기를 복수 개 실행하는 상황이나 하나의 탐색기에서 파일 시스템을 변경했을 때는 다른 탐색기에게 즉각적으로 이 변경을 통보해야한다. 다른 예로 차량의 연료가 소진될 때까지의 주행 가능 거리를 출력하는 클래스, 연료량이 부족하면 경고 메시지를 보내는 클래스, 연료량이 부족하면 자동으로 근처 주유소를 표시하는 클래스 등에 연료량의 변화를 통보하는 경우가 있다. 이런 경우에 연료량 클래스는 연료량에 관심을 가지는 구체적인 클래스 (주행 가능 거리 출력, 연료량 부족 경고, 근처 주유소 검색) 위의 것들에 직접 의존하지 않는 방식으로 설계하는 것이 바람직하다.

Template Method 템플릿 메소드 패턴은 전체적으로는 동일하면서 부분적으로는 다른 구문으로 구성된 메서드의 코드 중복을 최소화할 때 유용하다. 다른 관점에서 보면 동일한 기능을 상위 클래스에서 정의하면서 확장/변화가 필요한 부분만 서브 클래스에서 구현할 수 있도록 한다. 앞선 예제처럼 모터 클래스의 무브 메소드는 현대모터와 엘지모터에서 동일한 기능을 구현하면서 각 하위 클래스에서 구체적으로 정의할 필요가 있는 부분, 즉 무브모터 메소드부분만 각 하위 클래스에서 오버라이드되도록 한다. 이러한 경우 모터 클래스의 무브 메소드를 템플릿 메소드라고 부르고, 무브 메소드에서 호출되면서 하위 클래스에서 오버라이드될 필요가 있는 무브모터 메소드를 프리미티브 또는 훅 메서드라 부른다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.