템플릿 메서드에서는 상위 클래스에서 처리의 골격을 만들고, 하위 클래스에서 구체적인 처리의 내용을 만들었다. 템플릿 메서드 패턴을 인스턴스 생성의 장면에 적용한 것이 팩토리 메서드 패턴이다. 팩토리 메서드 패턴이란 factory는 ‘공장'이라는 의미다. 인스턴스를 생성하는 공장을 템플릿 메서드 패턴으로 구성한 것이 팩토리 메서드 패턴이 된다. 팩토리 메서드 패턴에서는 인스턴스를 만드는 방법을 상위 클래스 측에서 결정하지만 구체적인 클래스 이름까지는 결정하지 않는다. 따라서 인스턴스 생성을 위한 골격(framework)과 실제의 인스턴스 생성의 클래스를 분리해서 생각할 수 있다. 신분증명서 카드(ID 카드)를 만드는 예제 코드 Product 추상 클래스 : (framework 패키지 내 존재) use() ..
‘개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴' 책을 보고 정리한 글입니다. 빌딩의 장비들의 전원을 관리하는 제어 프로그램을 생각해보자. 이 프로그램을 만들기 위해 개별 장비의 전원을 켜고 끄는 기능을 제공하는 인터페이스를 정의하고, 장비 별로 알맞은 콘크리트 클래스를 구현했다. 개별 장비가 아닌 장비들을 하나로 묶어서 관리할 수 있도록 하기 위해 다음과 같이 DeviceGroup 클래스를 추가하였다. 위 타입을 이용해서 장비들의 전원을 제어하는 코드는 다음과 같이 Device 타입과 DeviceList 타입을 구분해서 처리할 것이다. public class PowerController { public void turnOn(Long deviceId) { Device device = findDev..
‘개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴' 책을 보고 정리한 글입니다. 비행기를 조정하고 미사일을 발사해서 적을 미사일로 잡는 슈팅 게임을 가정하자. 이런 게임은 흔히 다음과 같은 여러 종류의 적이 출현할 수 있다. 특별 공격으로 작은 분신을 만들어 내는 보스 강력한 미사일을 발사하는 보스 미사일을 발사하는 적기 자폭하는 적기 장애물 또한, 적마다 공격력과 방어력이 달라질 수 있다. 위 같은 적을 구현하기 위해 Boss, SmallFight, Obstacle 클래스 및 하위 클래스를 구성했다. 실제 게임 플레이를 진행하는 Stage 클래스는 몇 단계인지에 따라 서로 다른 적기, 장애물 또는 보스를 생성해야 한다. 이를 처리하기 위해 Stage 클래스의 코드는 다음과 같다. public cl..
‘개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴' 책을 보고 정리한 글입니다. 직원 정보, 직원의 이력 정보, 그리고 직원에 대한 평가 정보를 읽어 와 화면에 보여주는 GUI 프로그램을 생각해보자. 데이터를 화면에 출력해 주는 GUIViewer 클래스는 각 데이터를 제공하는 Dao 객체에 직접 접근하는 구조를 갖게 될 것이다. HR팀으로부터 화면뿐만 아니라 XML이나 엑셀로 동일한 데이터를 추출해 달라는 요구사항이 들어왔다. 이를 구현하기 위해 다음과 같이 XMLExporter 클래스와 ExcelExporter 클래스를 구현하였다. 문제점 [1]. 코드 중복 위 구조에서 발생할 수 있는 문제점 중 가장 큰 것은 GUIViewer, XMLExporter, ExcelExporter 사이에서 코드 중복..
‘개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴' 책을 보고 정리한 글입니다. 제품 목록을 보여주는 GUI 프로그램은 다음 사진처럼 목록 중 일부를 화면에 보여주고, 스크롤을 할 때 나머지 목록을 화면에 표시할 수 있다. 제품 목록을 구성할 때 관련된 모든 이미지를 로딩하도록 구현할 수 있는데, 이 경우 불필요하게 메모리를 사용하는 문제가 발생할 수 있다. 예를 들어, 목록 하단에 위치한 이미지는 실제로 스크롤을 하기 전까지는 화면에 보이지 않음에도 불구하고 목록을 구성할 때 메모리에 이미지 정보를 로딩하게 된다. 특히 이미지를 로컬 파일 시스템이 아닌 웹에서 읽어 온다면 이미지 로딩으로 인해 제품 목록을 보여주기까지 대기 시간이 길어지게 된다. 위같은 문제를 해결하는 방법은 이미지가 실제로 화면..
‘개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴' 책을 보고 정리한 글입니다. 상속은 기능을 확장하는 방법을 제공한다. 상속을 이용한 기능 확장 방법이 쉽긴 하지만, 다양한 조합의 기능 확장이 요구될 때 클래스가 불필요하게 증가하는 문제가 발생된다. 예를 들어 버퍼 기능과 압축 기능을 함께 제공해야 한다거나, 압축한 뒤 암호화 기능을 제공해야 한다면 클래스가 증가하고 계층 구조가 복잡해진다. 이런 경우에 사용할 수 있는 패턴이 데코레이터 패턴이다. 데코레이터 패턴은 상속이 아닌 위임을 하는 방식으로 기능을 확장해 나간다. FileOut 인터페이스는 파일 출력 기능을 정의하고 있고, 실제 파일 출력 기능은 FileOutImpl 클래스가 구현한다. 여기서 중요한 건 기능 확장을 위해 FileOutIm..
‘개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴' 책을 보고 정리한 글입니다. 단일 상품을 판매하는 자판기에 들어갈 소프트웨어를 개발해 달라는 요구가 있다고 해보자. 이 자판기의 동작 방식은 다음과 같다. 자판기 프로그램의 조건에 따른 코드를 다음과 같이 작성하였다. public class VendingMachine { public static enum State {NOCOIN, SELECTABLE} private State state = State.NOCOIN; public void insertCoin(int coin) { switch (state) { case NOCOIN: increaseCoin(coin); state = State.SELECTABLE; break; case SELECTABL..
- Total
- Today
- Yesterday
- 백준
- MSA
- 클린 아키텍처
- Kotlin
- kkoon9
- 코테
- 정규표현식
- AWS
- 클린 코드
- 프로그래머스
- 이팩티브 자바
- node.js
- programmers
- 디자인패턴
- kotest
- Java
- 테라폼
- BOJ
- 이펙티브 자바
- 알고리즘
- BAEKJOON
- C++
- JPA
- 디자인 패턴
- Algorithm
- Olympiad
- 객체지향
- Effective Java
- Spring Boot
- Spring
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |