목록Dev. Study Note/Design Pattern (14)
Priv's Blog
1. 컴퓨터에 추가 장치 지원하기 컴퓨터는 키보드, 본체, 모니터가 존재한다. 컴퓨터를 구성하는 장치인 이 3가지 클래스(Keyboard, Body, Monitor)는 Computer 클래스가 포함하고 있다. 또한 컴퓨터의 가격을 결정하는 price 변수, 전력 소비량을 결정하는 power 변수가 존재하며, 이러한 속성과 연산이 존재한다. 키보드, 본체, 모니터는 각각 자신의 가격과 전력 소비량을 속성으로 가진다. 컴퓨터의 가격과 전력 소비량은 부품에 따라 계산되기 때문에 이를 위한 별도의 속성은 정의하지 않는다. Computer 클래스는 Keyboard, Body, Monitor 클래스의 객체를 부분으로 가진다. 즉, 각 객체의 참조를 필드로 정의할 필요가 있다. package P14; public c..
1. 엘리베이터 부품 업체 변경하기 엘리베이터를 구성하는 부품들은 여러 제조 업체들을 가진다. 엘리베이터의 여러 제조 업체 부품들을 사용하더라도 모두 동일한 동작을 지원하게 만드는 것이 바람직하다. 즉, 건물 A에서 LG 부품을 사용하고, 건물 B에서 현대 부품을 사용하더라도 엘리베이터 프로그램의 변경은 최소화되어야 한다는 것이다. LG와 현대 모터는 구체적인 로직은 달라도 엘리베이터 입장에서 보면 모터를 사용해 엘리베이터를 동작시킨다는 것 자체는 동일하다. 그러므로 추상 클래스로 Motor를 정의하고, LGMotor, HyundaiMotor를 하위 클래스로 정의할 수 있다. Door 또한 Motor와 마찬가지로 구성할 수 있다. 위의 구조에서 모터를 움직이게 만드는 핵심 기능인 move 메서드는 LG,..
1. 여러 가지 방식의 엘리베이터 스케줄링 방법 지원하기 엘리베이터가 여러 대 있을 경우, 사용자가 엘리베이터 버튼을 누를 때 여러 대의 엘리베이터 중 1대만 작동하도록 만들어야 한다. 이처럼 주어진 요청(목적지 층과 방향)을 전달받았을 때, 여러 엘리베이터 중 하나를 선택하는 것을 '스케줄링'이라고 부른다. 엘리베이터 스케줄링에는 여러 방법들이 존재한다. 목적지 층과 가깝고 해당 방향으로 움직이는 중인 엘리베이터를 호출하는 것도 하나의 방법일 것이다. 이 방법은 하나의 엘리베이터로 최대한 많은 이용자가 탑승할 수 있도록 만드는 방법이다. 그림 12-1에서 ElevatorManager 클래스는 이동 요청을 처리하는 스케줄링 클래스이다. 스케줄링 작업을 처리하는 ThroughputScheduler 객체를 ..
1. 여러 회사의 모터 지원하기 엘리베이터 제어 시스템에서 모터를 구동시킨다고 가정하자. 만약 엘리베이터가 현대 모터를 사용한다면, HyundaiMotor 클래스에 move 메서드를 정의할 수 있을 것이다. move 메서드를 실행할 때는 문이 제대로 닫혔는지를 검사해야 한다. 즉, HyundaiMotor 클래스는 Door 클래스와 연관 관계가 있다. 또한 모터는 엘리베이터가 이동 중이 아닐 때만 구동되어야 한다. MotorStatus, DoorStatus, Direction은 Enumeration 인터페이스로, 각각 모터의 상태와 문의 상태, 이동 방향을 나타낸다. package P11; enum DoorStatus { CLOSED, OPEND } enum MotorStatus { MOVING, STOP..
1. 도로 표시 방법 조회하기 내비게이션에서 도로를 표시하는 기능을 가정하자. 기본적인 기능은 도로를 선으로 표시하는 것이겠지만, 내비게이션의 종류마다 차선을 표시해주기도 한다. 즉, 차선 표시 기능은 핵심/기본 기능이 아니라 추가 기능이다. RoadDisplay 클래스는 핵심/기본 기능인 도로를 표시하는 기능을 담당한다. RoadDisplayWithLane 클래스는 차선을 표시하는 추가 기능을 담당한다. 여기서 RoadDisplayWithLane 클래스 역시 도로를 표시하므로, RoadDisplay 클래스의 하위 클래스에 해당한다. package P10; public class RoadDisplay { public void Draw() { System.out.println("기본 도로 표시"); } }..
1. 여러 방법으로 성적 출력하기 입력된 성적 값을 출력하는 프로그램을 작성한다고 가정하자. 입력된 성적을 저장하는 ScoreRecord 클래스, 점수 목록을 출력하는 DataSheetView 클래스가 필요하다. ScoreRecord 클래스의 addScore 메서드가 실행될 때는 성적을 출력하기 위해 ScoreRecord 클래스가 DataSheetView 객체를 참조해야 한다. ScoreRecord 클래스의 addScore 메서드가 호출되면, ScoreRecord 클래스는 자신의 필드인 scores 객체에 점수를 추가한다. 그런 다음, DataSheetView 클래스의 update 메서드를 호출함으로써 성적을 출력하도록 요청한다. DataSheetView 클래스는 ScoreRecord 클래스의 getSc..
1. 만능 버튼 만들기 버튼을 눌렀을 때 램프의 불이 켜지는 프로그램을 개발한다고 가정하자. 이를 위해서는 버튼 클릭을 인식하는 Button 클래스, 불을 켜는 Lamp 클래스가 필요하다. 또한 버튼이 눌렸을 때 램프를 켜기 위하여 Button 클래스는 Lamp 객체를 참조해야 한다. 이 두 클래스의 관계를 클래스 다이어그램으로 표현하면 다음과 같다. 이를 코드로 작성하면 다음과 같다. package P8; public class Button { private Lamp lamp; public Button(Lamp lamp) { this.lamp = lamp; } public void pressed() { lamp.turnOn(); } } package P8; public class Lamp { publi..
1. 상태 머신 다이어그램 많은 시스템들은 다양한 상태가 있고, 그 상태에 따라 다양한 행동을 한다. UML에서도 이러한 상태와 그 상태의 변화를 모델링하는 도구로써 상태 머신 다이어그램을 제공한다. 아래 그림 7-1은 선풍기의 상태를 나타낸 것이다. 이 다이어그램에서 모서리가 둥근 사각형은 상태를 나타내고, 상태 사이에 화살표를 사용해 상태 전이를 나타냈다. 여기서 상태란, 객체가 시스템에 존재하는 동안(객체의 라이프 타임 동안) 객체가 가질 수 있는 어떠한 조건이나 상황을 의미한다. 예를 들면 객체가 어떤 상태에 있는 동안 어떤 행동을 수행하거나 특정 이벤트가 발생하기를 기다릴 수 있다. 기본 상태 머신 다이어그램에서 흔히 볼 수 있는 것은 시작과 종료 상태이다. 위 그림 7-1에서 왼쪽 하단에 있는..