열거 타입은 일정 개수의 상수 값을 정의한 다음, 그 외의 값은 허용하지 않는 타입입니다. 사계절, 태양계의 행성, 카드게임의 카드 종류 등을 생각하시면 이해가 빠르실 겁니다. 정수 열거 패턴 기법 (옛날 방식) 자바에서 열거 타입을 지원하기 전에는 다음 코드처럼 정수 상수를 한 묶음 선언해서 사용했었습니다. // 상당히 취약한 정수 열거 패턴 public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH = 2; public static final int ORANGE_NAVEL = 0; public static final int ORANGE_T..
클래스가 일을 실행할 때에는 자신의 클래스나 다른 클래스의 메서드를 호출한다. 메서드를 호출한 결과는 객체의 상태에 반영되지만, 일의 이력은 어디에도 남지 않는다. 이 때 ‘이 일을 실행하시오' 라는 ‘명령'을 표현하는 클래스가 있으면 편리하다. 실행하고 싶은 일을 ‘메서드를 호출'하는 동적인 처리로 표현하는 것이 아닌, 명령을 나타내는 클래스의 인스턴스로 하나의 ‘물건'처럼 표현할 수 있기 때문이다. 이력을 관리하고 싶을 때에는 그 인스턴스의 집합을 관리하면 된다. 명령의 집합을 저장해 두면 같은 명령을 재실행할 수도 있고, 복수의 명령을 모아 새로운 명령으로 재이용할 수도 있다. Command는 Event(사건)라고도 부른다. ‘이벤트 구동 프로그래밍'에서 사용되는 ‘이벤트'와 같은 의미다. 마우스를..
‘대리인'이란 의미로, 일을 해야 할 본인을 대신(대리)하는 사람을 뜻한다. 본인이 아니라도 가능한 일을 맡기기 위해서 대리인을 세운다. 대리인은 어디까지나 대리에 지나지 않기 때문에 할 수 있는 일에는 한계가 있다. 대리인이 할 수 있는 범위를 넘는 일이 발생하면, 대리인은 본인한테 와서 상담을 한다. 객체지향에서는 ‘본인', ‘대리인' 모두 객체가 된다. 즉, 바빠서 일을 할 수 없는 본인 객체 대신에 대리인 객체가 어느 정도 일을 처리하게 된다. 다음 링크는 프록시 패턴의 예제 코드다. GitHub - kkoon9/Java-Design-Pattern: Java 언어로 배우는 디자인 패턴 입문 예제 코드 Java 언어로 배우는 디자인 패턴 입문 예제 코드. Contribute to kkoon9/Jav..
‘플라이급'이란 의미로, 권투에서 가장 체중이 가벼운 체급을 나타낸다. 이 디자인 패턴은 객체를 ‘가볍게' 하기 위한 것이다. 여기서 말하는 무게는 ‘메모리의 사용량'을 의미한다. 많은 메모리를 사용하는 객체를 ‘무겁다'고 표현한다. Java에서는 new Something() 처럼, Something 클래스의 인스턴스를 만들 수 있다. 이 때, 그 인스턴스를 저장하기 위해서 메모리가 확보된다. Something 클래스의 인스턴스가 많이 필요할 때에, new를 많이 하면 메모리의 사용량이 커지게 된다. 플라이웨이트 패턴에서 사용하는 기법을 간단하게 표현하면 다음과 같다. 🐻 인스턴스를 가능한 대로 공유시켜서 쓸데없이 new하지 않도록 한다. 인스턴스가 필요할 때 항상 new하는 것이 아니라, 이미 만들어져..
객체 지향 프로그래밍에서는 프로그램 할 대상을 ‘클래스’로 표현한다. 당연하게도 어떤 것을 클래스로 표현할지는 설계자가 생각해야 한다. 클래스에 대응하는 구체적인 ‘사물'이 현실에서 존재할수도 존재하지 않을수도 있다. 경우에 따라서는 ‘이런 것이 클래스가 될 수 있나?’라고 놀랄 정도의 것을 클래스로 하는 경우도 있다. 현실세계에서 우리는 다양한 사물의 ‘상태'에 대해서 생각한다. 그러나 상태를 ‘사물’로 생각할 일이 없기 때문에, 상태를 클래스로 표현한다는 것도 쉽게 이해가 안 될 수 있다. 이번 포스팅에서는 ‘상태'를 클래스로 표현하는 방법에 대해 다룬다. 상태를 클래스로 표현하면 클래스를 교체해서 ‘상태의 변화'를 표현할 수 있고, 새로운 상태를 추가해야 될 때 무엇을 프로그램하면 좋을지 분명해진다..
제네릭은 Set, Map 등의 컬렉션과 ThreadLocal, AtomicReference 등의 단일원소 컨테이너에도 흔히 쓰입니다. 이런 모든 쓰임에서 매개변수화되는 대상은 (원소가 아닌) 컨테이너 자신입니다. 따라서 하나의 컨테이너에서 매개변수화할 수 있는 타입의 수가 제한됩니다. 컨테이너의 일반적인 용도에 맞게 설계된 것이니 문제될 건 없습니다. 예컨대 Set에는 원소의 타입을 뜻하는 단 하나의 타입 매개변수만 있으면 되며, Map에는 키와 값을 타입을 뜻하는 2개만 필요한 식입니다. 하지만 더 유연한 수단이 필요할 때도 종종 있습니다. 예컨대 데이터베이스의 행(row)은 임의 개수의 열(column)을 가질 수 있는데, 모두 열을 타입 안전하게 이용할 수 있다면 멋질 것입니다. 다행히 쉬운 해법이..
가변인수(varargs) 메서드(아이템 53)와 제네릭은 자바 5 때 함께 추가되었으니 서로 잘 어우러지리라 기대하겠지만, 슬프게도 그렇지 않습니다. 가변인수는 메서드에 넘기는 인수의 개수를 클라이언트가 조절할 수 있게 해주는데, 구현 방식에 허점이 있습니다. 가변인수 메서드를 호출하면 가변인수를 담기 위한 배열이 자동으로 하나 만들어집니다. 그런데 내부로 감춰야 했을 이 배열을 그만 클라이언트에 노출하는 문제가 생겼습니다. 그 결과 varargs 매개변수에 제네릭이나 매개변수화 타입이 포함되면 알기 어려운 컴파일 경고가 발생합니다. 아이템 28에서 실체화 불가 타입은 런타임에는 컴파일타임보다 타입 관련 정보를 적게 담고 있음을 배웠습니다. 그리고 거의 모든 제네릭과 매개변수화 타입은 실체화되지 않습니다..
아이템 28에서 이야기했듯 매개변수화 타입은 불공변입니다. 즉, 서로 다른 타입 Type1과 Type2가 있을 때 List은 List의 하위 타입도 상위 타입도 아닙니다. List은 List의 하위 타입이 아니라는 뜻인데, 곰곰이 따져보면 사실 이쪽이 말이 됩니다. List에는 어떤 객체든 넣을 수 있지만 List에는 문자열만 넣을 수 있습니다. 즉, List은 List가 하는 일을 제대로 수행하지 못하니 하위 타입이 될 수 없습니다. ⇒ 리스코프 치환 원칙에 어긋납니다. (아이템 10) SOLID [3]. 리스코프 치환 원칙 ‘개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴' 책을 보고 정리한 글입니다. 리스코프 치환 원칙은 개방 폐쇄 원칙을 받쳐 주는 다형성에 관한 원칙을 제공한다. 리스코프 치..
- Total
- Today
- Yesterday
- 테라폼
- Spring Boot
- MSA
- Algorithm
- 정규표현식
- programmers
- node.js
- Java
- 객체지향
- Olympiad
- 알고리즘
- JPA
- 이팩티브 자바
- Effective Java
- BOJ
- 이펙티브 자바
- 클린 코드
- 백준
- 디자인패턴
- Spring
- 디자인 패턴
- AWS
- kotest
- 프로그래머스
- 클린 아키텍처
- 코테
- Kotlin
- kkoon9
- C++
- BAEKJOON
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |