
서로의 입장이 같은 10명이 모여 공동 작업을 하고 있는데, 좀처럼 정리가 되지 않는 상황을 상상해보자. 이 때 입장이 다른 ‘중개인'이 등장하여 개개인의 상황을 보고 받고 상황을 정리해주면 되지 않을까? 회원들은 모두 중개인에게만 보고를 하고, 중개인만이 회원에게 지시를 내릴 수 있게 하면 회원들끼리 옥신각신할 일이 없어진다. 미디에이터는 의지할 수 있는 ‘중개인'을 상상하는 편이 더 이해하기 쉽다. 중개인은 모임의 회원으로부터 올라온 보고를 기초로 대국적인 판단을 해서 각 회원에게 지시를 내린다. 미디에이터 패턴에서 ‘중개인'을 mediator(조정자), ‘각 회원'을 colleague(동료)라고 칭한다. GoF 책에서 사용하는 용어다. 미디에이터 패턴이 어떤 상황에서 써야하는지 감이 잘 안잡힌다. ..

불변 클래스란 간단하게 말하면 그 인스턴스의 내부 값을 수정할 수 없는 클래스입니다. 불변 인스턴스에 간직된 정보는 고정되어 객체가 파괴되는 순간까지 절대 달라지지 않는 셈이죠. 자바 플랫폼 라이브러리에도 다양한 불변 클래스가 존재합니다. String, 기본 타입의 박싱된 클래스들, BigInteger, BigDecimal이 여기 속합니다. 이 클래스들을 불변으로 설계한 데에는 다음과 같은 이유가 있습니다. 불변 클래스는 가변 클래스보다 설계, 구현 및 사용하기 쉬우며 오류가 생길 여지도 적고 훨씬 안전합니다. 클래스를 불변으로 만드려면 지켜야하는 규 [1]. 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않는다. [2]. 클래스를 확장할 수 없도록 한다. 하위 클래스에서 부주의하게 혹은 나쁜 의도로..

프로그램이라는 것은 점점 커지는 영향이 있다. 많은 클래스가 만들어져 서로 관계를 맺으면서 복잡하게 된다. 클래스를 사용할 경우에는 클래스 간의 관계를 정확히 이해하고 정확한 순서대로 메서드를 호출할 필요가 있다. 커다란 프로그램을 사용해서 처리를 실행하려면 상호 관련된 많은 클래스를 적절하게 제어해야 한다. 그렇다면 그 처리를 실행하기 위한 ‘창구'를 준비해 두는 것이 좋다. 그렇게 하면 많은 클래스를 개별적으로 제어하지 않아도 그 ‘창구'에 대해서만 요구하면 역할이 끝나기 때문이다. 이러한 ‘창구’가 바로 파사드 패턴이다. 파사드는 ‘건물의 정면'이라는 의미를 가지는데, 파사드 패턴은 복잡하게 얽혀 있는 것을 정리해서 높은 레벨의 인터페이스(API)를 제공한다. 파사드 역할은 시스템의 외부에 대해서는..

이따금 인스턴스 필드들을 모아놓는 일 외에는 아무 목적도 없는 퇴보한 클래스를 작성하려 할 때가 있습니다. class Point { public double x; public double y; } 이런 클래스는 데이터 필드에 직접 접근할 수 있으니 캡슐화의 이점을 제공하지 못합니다. (아이템 15) API를 수정하지 않고는 내부 표현을 바꿀 수 없고, 불변식을 보장할 수 없으며, 외부에서 필드에 접근할 때 부수 작업을 수행할 수도 없습니다. 철저한 객체 지향 프로그래머는 이런 클래스를 상당히 싫어해서 필드들을 모두 private으로 바꾸고 public 접근자(getter)를 추가합니다. class Point { public double x; public double y; public Point(doubl..

어설프게 설계된 컴포넌트와 잘 설계된 컴포넌트의 가장 큰 차이는 바로 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼느냐 차이입니다. 잘 설계된 컴포넌트는 모든 내부 구현을 완벽하게 숨겨, 구현과 API를 깔끔하게 분리합니다. 오직 API를 통해서만 다른 컴포넌트와 소통하며 서로의 내부 동작 방식에는 전혀 신경을 쓰지 않습니다. 정보 은닉, 혹은 캡슐화라고 하는 이 개념은 소프트웨어 설계의 근간이 되는 원리입니다. 정보 은닉의 장점 정보 은닉의 장점은 굉장히 많습니다. 그 중 대부분은 시스템을 구성하는 컴포넌트들을 서로 독립시켜서 개발, 테스트, 최적화, 적용, 분석, 수정을 개별적으로 할 수 있게 해주는 것과 연관되어 있습니다. 정보 은닉의 장점은 다음과 같습니다. 시스템 개..

Comparable 인터페이스의 유일무이한 메서드인 compareTo를 알아봅시다. compareTo는 Object의 메서드가 아닙니다. 성격은 두 가지만 빼면 Object의 equals와 같습니다. compareTo는 단순 동치성 비교에 더해 순서까지 비교할 수 있으며, 제네릭합니다. Comparable을 구현했다는 것은 그 클래스의 인스턴스들에는 자연적인 순서가 있음을 뜻합니다. 그래서 Comparable을 구현한 객체들의 배열은 다음처럼 손쉽게 정렬할 수 있습니다. Arrays.sort(a); 검색, 극단값, 계산, 자동 정렬되는 컬렉션 관리도 역시 쉽게 할 수 있습니다. 예컨대 다음 프로그램은 명령줄 인수들을 (중복은 제거하고) 알파벳순으로 출력합니다. String이 Comparable을 구현한 ..

Cloneable은 복제해도 되는 클래스임을 명시하는 용도의 믹스인 인터페이스(아이템 20)지만, 아쉽게도 의도한 목적을 제대로 이루지 못했습니다. 가장 큰 문제는 clone 메서드가 선언된 곳이 Cloneable이 아닌 Object이고, 그마저도 protected라는 데 있습니다. 그래서 Cloneable을 구현하는 것만으로는 외부 객체에서 clone 메서드를 호출할 수 없습니다. 리플렉션(아이템 65)을 사용하면 가능하지만, 100% 성공하는 것도 아닙니다. 해당 객체가 접근이 허용된 clone 메서드를 제공한다는 보장이 없기 때문입니다. 하지만 이를 포함한 여러 문제점에도 불구하고 Cloneable 방식은 잘 동작하게끔 해주는 구현 방법과 언제 그렇게 해야 하는지를 알려주고, 가능한 다른 선택지에 ..

책임 떠넘기기라는 단어는 부정적인 의미가 강하지만 꼭 필요한 경우도 있다. 어떤 요청이 발생했을 때 그 요청을 처리할 객체를 직접 결정할 수 없는 경우, 복수의 객체를 사슬(chain)처럼 연결해 두면, 그 객체의 사슬을 차례로 돌아다니면서 목적한 객체를 결정하는 방법을 생각할 수 있다. 이 패턴을 사용하면 ‘요청하는 쪽'과 ‘처리하는 쪽'의 연결을 유연하게 해서 각 객체를 부품으로 독립시킬 수 있다. 상황에 따라서 요청을 처리할 객체가 변하는 프로그램에도 대응할 수 있다. 다음 링크는 책임 떠넘기기 패턴의 예제 코드다. GitHub - kkoon9/Java-Design-Pattern: Java 언어로 배우는 디자인 패턴 입문 예제 코드 Java 언어로 배우는 디자인 패턴 입문 예제 코드. Contrib..
- Total
- Today
- Yesterday
- C++
- kkoon9
- Spring
- 프로그래머스
- 클린 아키텍처
- Kotlin
- 백준
- 디자인 패턴
- Algorithm
- BOJ
- 클린 코드
- AWS
- 테라폼
- Spring Boot
- kotest
- 코테
- programmers
- Java
- 디자인패턴
- 정규표현식
- JPA
- Olympiad
- BAEKJOON
- 이펙티브 자바
- Effective Java
- node.js
- 이팩티브 자바
- 객체지향
- MSA
- 알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |