
인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 합니다. 달리 말해, 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 것입니다. 인터페이스는 오직 이 용도로만 사용해야 합니다. 이 지침에 맞지 않는 예로 소위 상수 인터페이스라는 것이 있습니다. 상수 인터페이스란 메서드 없이, 상수를 뜻하는 static final 필드로만 가득 찬 인터페이스를 말합니다. 그리고 이 상수들을 사용하려는 클래스에서는 정규화된 이름(qualified name)을 쓰는 걸 피하고자 그 인터페이스를 구현하곤 합니다. 다음의 예를 봅시다. public interface PhysicalConstants { // 아보가드로 수 (1/몰) static ..

자바 8 전에는 기존 구현체를 깨드리지 않고는 인터페이스에 메서드를 추가할 방법이 없었습니다. 인터페이스에 메서드를 추가하면 보통은 컴파일 오류가 나는데, 추가된 메서드가 우연히 기존 구현체에서 이미 존재할 가능성은 아주 낮기 때문입니다. 자바 8에 와서 기존 인터페이스에 메서드를 추가할 수 있도록 디폴트 메서드를 소개했지만, 위험이 완전히 사라진 것은 아닙니다. 디폴트 메서드를 선언하면, 그 인터페이스를 구현한 후 디폴트 메서드를 재정의하지 않은 모든 클래스에서 디폴트 구현이 쓰이게 됩니다. 이처럼 자바에도 기존 인터페이스에 메서드를 추가하는 길이 열렸지만 모든 기존 구현체들과 매끄럽게 연동되리라는 보장은 없습니다. 자바 7까지의 세상에서는 모든 클래스가 "현재의 인터페이스에 새로운 메서드가 추가될 일..

자바가 제공하는 다중 구현 메커티즘은 인터페이스와 추상 클래스, 이렇게 두가지입니다. 자바 8부터 인터페이스도 디플트 메서드를 제공할 수 있게 되어 이제는 두 메커니즘 모두 인스턴스 메서드를 구현 형태로 제공할 수 있습니다. 자바 8에 추가된 기술 [4] deafult 메서드와 static 메서드 자바 8에는 다양한 기술들을 살펴보려고 하는데, 그 네 번째는 default 메서드와 static 메서드다. 자바 8부터 인터페이스의 추가할 수 있는 새로운 기능이다. API이나 스프링 코드가 이 기능 덕분에 kkoon9.tistory.com 둘의 가장 큰 차이는 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다는 점입니다. 자바는 단일 상속만 지원하니, 추상 클래스..

되돌리기 기능인 undo를 생각해보자. 객체 지향의 프로그램에서 undo 기능을 실행하려면 인스턴스가 가지고 있는 정보를 저장해 둘 필요가 있다. 단, 저장만 해서는 쓸모가 없고 저장한 정보로부터 인스턴스를 원래의 상태로 되돌려야 한다. 인스턴스를 복원하려면 인스턴스 내부의 정보를 자유롭게 액세스할 수 있어야 한다. 하지만 원하지 않는 액세스를 허용하면 클래스 내부 구조에 의존한 코드가 프로그램의 여기저기로 흩어질 수 있어 클래스의 수정을 어렵게 한다. 메멘토 패턴을 사용하여 인스턴스의 상태를 나타내는 역할을 도입해서 캡슐화의 파괴에 빠지지 않고 저장과 복원을 실행할 수 있다. memento는 ‘기념품', ‘유물', ‘추억거리' 라는 의미를 가진다. 어떤 시점의 인스턴스의 상태를 확실하게 기록해서 저장해..

아이템 18에서는 상속을 염두에 두지 않고 설계했고 상속할 때의 주의점도 문서화해놓지 않은 '외부' 클래스를 상속할 때의 위험을 경고했습니다. 아이템[18]. 상속보다는 컴포지션을 사용하라 상속은 코드를 재사용하는 강력한 수단이지만, 항상 최선은 아닙니다. 잘못 사용하면 오류를 내기 쉬운 소프트웨어를 만들게 됩니다. 상위 클래스와 하위 클래스를 모두 같은 프로그래머가 통 kkoon9.tistory.com 💡 여기서 '외부'란 프로그래머의 통제권 밖에 있어서 언제 어떻게 변경될지 모른다는 뜻입니다. 그렇다면 상속을 고려한 설계와 문서화란 정확히 무얼 뜻할까요? 우선, 메서드를 재정의하면 어떤 일이 일어나는지를 정확히 정리하여 문서로 남겨야 합니다. 달리 말하면, 상속용 클래스는 재정의할 수 있는 메서드들을..

상속은 코드를 재사용하는 강력한 수단이지만, 항상 최선은 아닙니다. 잘못 사용하면 오류를 내기 쉬운 소프트웨어를 만들게 됩니다. 상위 클래스와 하위 클래스를 모두 같은 프로그래머가 통제하는 패키지 안에서라면 상속도 안전합니다. 확장할 목적으로 설계되었고 문서화도 잘된 클래스(아이템 19)도 마찬가지로 안전합니다. 하지만 일반적인 구체 클래스를 패키지 경계를 넘어, 다른 패키지의 구체 클래스를 상속하는 일은 위험합니다. 상기하자면, 이 책에서의 '상속'은 (클래스가 다른 클래스를 확장하는) 구현 상속을 의미합니다. 💡 이번 아이템에서 논하는 문제는 (클래스가 인터페이스를 구현하거나 인터페이스가 다른 인터페이스를 확장하는) 인터페이스 상속과는 무관합니다. 메서드 호출과 달리 상속은 캡슐화를 깨뜨립니다. 다르..

observer는 관찰하는 사람, 즉 ‘관찰자’라는 의미다. 옵저버 패턴에서는 관찰 대상의 상태가 변화하면 관찰자에게 알려준다. 옵저버 패턴은 상태 변화에 따른 처리를 기술할 때 효과적이다. 다음 링크는 옵저버 패턴의 예제 코드다. GitHub - kkoon9/Java-Design-Pattern: Java 언어로 배우는 디자인 패턴 입문 예제 코드 Java 언어로 배우는 디자인 패턴 입문 예제 코드. Contribute to kkoon9/Java-Design-Pattern development by creating an account on GitHub. github.com 옵저버 패턴의 등장인물 Subject(관찰 대상자)의 역할 - NumberGenerator ‘관찰되는 대상'을 나타낸다. Subjec..

서로의 입장이 같은 10명이 모여 공동 작업을 하고 있는데, 좀처럼 정리가 되지 않는 상황을 상상해보자. 이 때 입장이 다른 ‘중개인'이 등장하여 개개인의 상황을 보고 받고 상황을 정리해주면 되지 않을까? 회원들은 모두 중개인에게만 보고를 하고, 중개인만이 회원에게 지시를 내릴 수 있게 하면 회원들끼리 옥신각신할 일이 없어진다. 미디에이터는 의지할 수 있는 ‘중개인'을 상상하는 편이 더 이해하기 쉽다. 중개인은 모임의 회원으로부터 올라온 보고를 기초로 대국적인 판단을 해서 각 회원에게 지시를 내린다. 미디에이터 패턴에서 ‘중개인'을 mediator(조정자), ‘각 회원'을 colleague(동료)라고 칭한다. GoF 책에서 사용하는 용어다. 미디에이터 패턴이 어떤 상황에서 써야하는지 감이 잘 안잡힌다. ..
- Total
- Today
- Yesterday
- Spring Boot
- node.js
- 프로그래머스
- 테라폼
- 클린 코드
- BOJ
- 알고리즘
- JPA
- 디자인패턴
- AWS
- MSA
- 정규표현식
- Olympiad
- BAEKJOON
- C++
- Spring
- Kotlin
- Java
- 이펙티브 자바
- 디자인 패턴
- 코테
- 객체지향
- 백준
- Effective Java
- kkoon9
- 이팩티브 자바
- Algorithm
- 클린 아키텍처
- kotest
- 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 |