![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/xQDZw/btq5Dac5r9g/U0yKzlQhBFMiA197WrDAk1/img.png)
람다 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것이라고 할 수 있다. 즉, 컴파일러의 추론에 의지해서 코드를 단순화하는 것이다. 람다 표현식의 기본 구조는 다음과 같다. (i) -> i + 10; (인자 리스트) -> { 바디 }의 형태를 가진다. 위의 예제처럼 바디가 한 줄로 표현될 경우 { }와 return문을 생략할 수 있다. 하지만 여러 줄이라면 { }와 return문을 명시적으로 선언해줘야 한다. (x, y) -> { System.out.println("x + y"); return x + y; } 인자 리스트 1. 인자가 없을 경우 구현해야 하는 추상 메서드가 파라미터를 아무것도 받지 않는 경우에 사용한다. Supplier getSomeNumber = () -> 10; 2. 인자가..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/cpL8u4/btq5tbqznHO/eNgbBwKYhjfdNgZxEvxIp0/img.png)
명명 패턴이란 변수나 함수의 이름을 일관된 방식으로 작성하는 패턴을 말한다. 이러한 명명 패턴은 전통적으로 도구나 프레임워크에서 특별히 다뤄야 할 프로그램 요소에 구분을 위해 사용되어 왔다. 예를 들면 JUnit3 에서는 테스트 메서드 이름을 test로 시작하게끔 했다. 이러한 명명 패턴 방식은 효과적이지만 단점도 크다. 명명 패턴의 단점 1. 오타가 나면 안 된다. 만약 test로 시작되어야 할 메서드 이름이 오타로 인해 tset로 작성되었다면, 명명 패턴에는 벗어나지만 프로그램 상에서는 문제가 없기 때문에 테스트 메서드로 인식하지 못하고 테스트를 수행하지 않는다. 2. 명명 패턴을 의도한 곳에서만 사용할 거라는 보장이 없다. 개발자는 JUnit3의 명명 패턴인 'test'를 메서드가 아닌 클래스의 이..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/MnngD/btq5fw8IiAe/WiHM20CMPb2qX6D9mLIimk/img.png)
열거 타입은 거의 모든 상황에서 타입 안전 열거 패턴(typesafe enum pattern)보다 우수하다. 단, 예외가 있다. 열거 타입은 확장을 할 수가 없다는 점이다. 즉, 타입 안전 열거 패턴은 확장을 통해 다음 값을 추가하고 다른 목적으로 사용할 수 있는 반면, 열거 타입은 그렇게 할 수없다. 하지만 대부분 상황에서 열거 타입을 확장하는 것은 좋지 않은 생각이다. 일반적으로 열거 타입 확장이 안 좋은 이유 확장한 타입의 원소는 기반 타입의 원소로 취급하지만 그 반대는 아니다. 기반 타입과 확장된 타입들의 원소 모두를 순회할 방법도 마땅치 않다. 확장성을 높이려면 고려할 요소가 늘어나 설계와 구현이 복잡해진다. 그렇다면 열거 타입 확장이 필요한 경우는 무엇일까? 확장할 수 있는 열거 타입은 연산 ..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bsTIXL/btq4YsMld1Z/991SfpwOS1cNG0B73qG6r0/img.png)
배열이나 리스트에서 원소를 꺼낼 때 ordinal 메서드로 인덱스를 얻는 코드가 있다면 EnumMap을 활용해 해당 코드를 개선해야 한다. ordinal 메서드로 인덱스를 얻는 코드는 동작은 하지만 많은 문제점을 내포하고 있기 때문이다. ordinal 인덱싱의 문제점 식물의 생애주기를 열거 타입으로 표현한 다음 클래스를 예로 문제점을 살펴보자. class Plant{ enum LifeCycle { ANNUAL, PERENNIAL, BIENNIAL } final String name; final LifeCycle lifeCycle; public Plant(String name, LifeCycle lifeCycle) { this.name = name; this.lifeCycle = lifeCycle; } @..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/dFd68o/btq4nNRG2VI/Z8MfuBExtDUV6bgQWWP2X0/img.png)
열거 타입은 해당 상수가 몇 번째 위치에 존재하는지 반환하는 ordinal() 메서드를 제공한다. ordinal() 메서드는 Enum 클래스 내부에 존재하는 상수인 ordinal을 반환한다. Enum의 API 문서를 보면 ordinal에 대해 이렇게 쓰여 있다. "대부분의 프로그래머는 이 메서드를 쓸 일이 없다. 이는 EnumSet과 EnumMap 같이 열거 타입 기반의 범용 자료구조에 쓸 목적으로 설계되었다." 따라서 이런 용도가 아니라면 ordinal 메서드를 절대 사용해서는 안된다. ordinal 메서드를 사용하면 안 되는 이유 열거 타입 상수와 연결된 정수 값이 필요하면 orrdinal 메서드를 이용하고 싶을 수 있다. 예를 들어, 합주단의 종류를 연주자가 1명인 솔루부터 10명인 디텍트까지 정의..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/dCG45w/btq4hIIUaGk/mH3I6gXkSJ1rAVxTHJYKg1/img.png)
Java에서 열거 타입을 지원하기 전에는 정수 상수를 한 묶음 선언해서 사용하는 정수 열거 패턴을 사용했다. 하지만 정수 열거 패턴에는 많은 단점이 존재한다. 정수 열거 패턴의 단점 다음과 같은 정수 열거 패턴이 있다. 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_TEMPLE = 1; public static final int ORANGE_BLOOD = 2; 이 패턴의 단점은 무엇일까? 1...
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/cEZeBW/btq4bXTAHgw/AWBuljcwgGcaAksLPoMXRk/img.png)
Java가 제공하는 주요 함수형 인터페이스 java.util.function은 Java에서 자주 사용되는 함수형 인터페이스를 미리 정의해둔 패키지이다. 대표적으로 다음과 같은 함수형 인터페이스가 존재한다. Function BiFunction Consumer Supplier Predicate UnaryOperator BinaryOperator 각 함수형 인터페이스에 대해 알아보자. Function T 타입을 받아서 R 타입을 리턴하는 함수형 인터페이스이다. Integer 타입을 받아서 Integer 타입을 리턴하는 간단한 예제를 살펴보자. public static void main(String[] args) { Function plus10 = (i) -> i + 10; System.out.println(p..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/b9Vr9Y/btq3UFZA3FH/2k5rcNvEVj7fV5jpoTpwC0/img.png)
타입 안전 이종 컨테이너 패턴 컨테이너 대신 키를 매개변수화하고 컨테이너에 값을 넣거나 뺄 때 매개변수화한 키를 함께 제공하는 것을 타입 안전 이종 컨테이너 패턴이라고 한다. 하나의 컨테이너에서 매개변수화되는 대상은 컨테이너 자신이다. 따라서 하나의 컨테이너에서 매개변수화할 수 있는 타입의 수가 제한된다. 이보다 유연한 수단이 필요할 때 타입 안전 이종 컨테이너 패턴을 사용할 수 있다. 이제 타입 안전 이종 컨테이너 패턴의 예제를 살펴보자. // 타입 안전 이종 컨테이너 패턴 - API public class Favorites{ public void putFavorite(Class type, T instance); public T getFavorite(Class type) } 각 타입의 Class 객체를..