되돌리기 기능인 undo를 생각해보자. 객체 지향의 프로그램에서 undo 기능을 실행하려면 인스턴스가 가지고 있는 정보를 저장해 둘 필요가 있다. 단, 저장만 해서는 쓸모가 없고 저장한 정보로부터 인스턴스를 원래의 상태로 되돌려야 한다. 인스턴스를 복원하려면 인스턴스 내부의 정보를 자유롭게 액세스할 수 있어야 한다. 하지만 원하지 않는 액세스를 허용하면 클래스 내부 구조에 의존한 코드가 프로그램의 여기저기로 흩어질 수 있어 클래스의 수정을 어렵게 한다. 메멘토 패턴을 사용하여 인스턴스의 상태를 나타내는 역할을 도입해서 캡슐화의 파괴에 빠지지 않고 저장과 복원을 실행할 수 있다. memento는 ‘기념품', ‘유물', ‘추억거리' 라는 의미를 가진다. 어떤 시점의 인스턴스의 상태를 확실하게 기록해서 저장해..
서로의 입장이 같은 10명이 모여 공동 작업을 하고 있는데, 좀처럼 정리가 되지 않는 상황을 상상해보자. 이 때 입장이 다른 ‘중개인'이 등장하여 개개인의 상황을 보고 받고 상황을 정리해주면 되지 않을까? 회원들은 모두 중개인에게만 보고를 하고, 중개인만이 회원에게 지시를 내릴 수 있게 하면 회원들끼리 옥신각신할 일이 없어진다. 미디에이터는 의지할 수 있는 ‘중개인'을 상상하는 편이 더 이해하기 쉽다. 중개인은 모임의 회원으로부터 올라온 보고를 기초로 대국적인 판단을 해서 각 회원에게 지시를 내린다. 미디에이터 패턴에서 ‘중개인'을 mediator(조정자), ‘각 회원'을 colleague(동료)라고 칭한다. GoF 책에서 사용하는 용어다. 미디에이터 패턴이 어떤 상황에서 써야하는지 감이 잘 안잡힌다. ..
보통 new 키워드를 사용해서 클래스 이름을 지정하여 인스턴스를 생성한다. 그러나 클래스 이름을 지정하지 않고 인스턴스를 생성할 때도 있다. 다음과 같은 경우에는 클래스로부터가 아닌 인스턴스를 복사해서 새로운 인스턴스를 만든다. [1]. 종류가 너무 많아 클래스로 정리되지 않는 경우 취급하는 오브젝트의 종류가 너무 많아서 각각을 별도의 클래스로 만들어 다수의 소스 파일로 작성하는 경우 [2]. 클래스로부터 인스턴스 생성이 어려운 경우 생성하고 싶은 인스턴스가 복잡한 작업을 거쳐 만들어지기 때문에 클래스로부터 만들기가 어려운 경우 ex) 그래픽 에디터에서 사용자가 마우스를 조작해서 만든 도형을 나타내는 인스턴스가 있다고 가정해보자. 사용자의 조작으로 인스턴스를 프로그래밍해서 만드는 것은 곤란하다. 사용자의..
프로그램을 실행할 때 보통은 많은 인스턴스가 생성된다. 예를 들어 문자열을 표시하는 java.lang.String 클래스의 인스턴스는 문자열 1개에 대해서 1개가 생성된다. 그렇기 때문에 문자열이 1,000개 등장하는 프로그램이라면 1,000개의 인스턴스가 만들어진다. 그러나, ‘클래스의 인스턴스가 단 하나만 필요'한 경우가 있다. 그것은 시스템 안에서 1개 밖에 존재하지 않는 것을 프로그램으로 표현하고 싶을 때가 있다. ex) 컴퓨터 자체를 표현한 클래스, 현재의 시스템 설정을 표현한 클래스, 윈도우 시스템을 표현한 클래스 물론, 주의를 기울여 프로그래밍해서 new MyClass()가 1회만 실행되도록 작성하면 MyClass의 인스턴스는 1개만 생성된다. 그러나 ‘프로그래머가 주의를 기울여서 1개만 생..
템플릿 메서드에서는 상위 클래스에서 처리의 골격을 만들고, 하위 클래스에서 구체적인 처리의 내용을 만들었다. 템플릿 메서드 패턴을 인스턴스 생성의 장면에 적용한 것이 팩토리 메서드 패턴이다. 팩토리 메서드 패턴이란 factory는 ‘공장'이라는 의미다. 인스턴스를 생성하는 공장을 템플릿 메서드 패턴으로 구성한 것이 팩토리 메서드 패턴이 된다. 팩토리 메서드 패턴에서는 인스턴스를 만드는 방법을 상위 클래스 측에서 결정하지만 구체적인 클래스 이름까지는 결정하지 않는다. 따라서 인스턴스 생성을 위한 골격(framework)과 실제의 인스턴스 생성의 클래스를 분리해서 생각할 수 있다. 신분증명서 카드(ID 카드)를 만드는 예제 코드 Product 추상 클래스 : (framework 패키지 내 존재) use() ..
‘개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴' 책을 보고 정리한 글입니다. 빌딩의 장비들의 전원을 관리하는 제어 프로그램을 생각해보자. 이 프로그램을 만들기 위해 개별 장비의 전원을 켜고 끄는 기능을 제공하는 인터페이스를 정의하고, 장비 별로 알맞은 콘크리트 클래스를 구현했다. 개별 장비가 아닌 장비들을 하나로 묶어서 관리할 수 있도록 하기 위해 다음과 같이 DeviceGroup 클래스를 추가하였다. 위 타입을 이용해서 장비들의 전원을 제어하는 코드는 다음과 같이 Device 타입과 DeviceList 타입을 구분해서 처리할 것이다. public class PowerController { public void turnOn(Long deviceId) { Device device = findDev..
‘개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴' 책을 보고 정리한 글입니다. 제품 목록을 보여주는 GUI 프로그램은 다음 사진처럼 목록 중 일부를 화면에 보여주고, 스크롤을 할 때 나머지 목록을 화면에 표시할 수 있다. 제품 목록을 구성할 때 관련된 모든 이미지를 로딩하도록 구현할 수 있는데, 이 경우 불필요하게 메모리를 사용하는 문제가 발생할 수 있다. 예를 들어, 목록 하단에 위치한 이미지는 실제로 스크롤을 하기 전까지는 화면에 보이지 않음에도 불구하고 목록을 구성할 때 메모리에 이미지 정보를 로딩하게 된다. 특히 이미지를 로컬 파일 시스템이 아닌 웹에서 읽어 온다면 이미지 로딩으로 인해 제품 목록을 보여주기까지 대기 시간이 길어지게 된다. 위같은 문제를 해결하는 방법은 이미지가 실제로 화면..
‘개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴' 책을 보고 정리한 글입니다. 상속은 기능을 확장하는 방법을 제공한다. 상속을 이용한 기능 확장 방법이 쉽긴 하지만, 다양한 조합의 기능 확장이 요구될 때 클래스가 불필요하게 증가하는 문제가 발생된다. 예를 들어 버퍼 기능과 압축 기능을 함께 제공해야 한다거나, 압축한 뒤 암호화 기능을 제공해야 한다면 클래스가 증가하고 계층 구조가 복잡해진다. 이런 경우에 사용할 수 있는 패턴이 데코레이터 패턴이다. 데코레이터 패턴은 상속이 아닌 위임을 하는 방식으로 기능을 확장해 나간다. FileOut 인터페이스는 파일 출력 기능을 정의하고 있고, 실제 파일 출력 기능은 FileOutImpl 클래스가 구현한다. 여기서 중요한 건 기능 확장을 위해 FileOutIm..
- Total
- Today
- Yesterday
- JPA
- 클린 아키텍처
- Olympiad
- 이팩티브 자바
- MSA
- Effective Java
- 정규표현식
- kkoon9
- 객체지향
- 디자인 패턴
- 클린 코드
- Spring Boot
- 코테
- node.js
- BOJ
- 프로그래머스
- kotest
- BAEKJOON
- 테라폼
- 이펙티브 자바
- Java
- Kotlin
- C++
- Spring
- Algorithm
- AWS
- 알고리즘
- 디자인패턴
- 백준
- programmers
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |