티스토리 뷰
05 : 생성자 레퍼런스
생성자 레퍼런스 사용 방식
메서드의 이름이 new라는 점을 제외 하면 메서드 레퍼런스와 사용 방식이 유사하다. 예를 들면, Button::new는 Button 생성자를 가리키는 레퍼런스이다. 하지만 어느 생성자를 가르키는지는 문맥에 따라 다르다고 한다.
1 2 3 | List<String> labels = ...; Stream<Button> stream = labels.stream().map(Button::new); List<Button> buttons = stream.collect(Collectors.toList()); |
문자열 리스트가 있다고 하면, 다음과 같은 호출을 이용해 각 문자열을 대상으로 생성자를 호출 함으로써 문자열 리스트를 버튼 배열로 변환한다. map 메서드가 리스트의 각 요소를 대상으로 Button(String) 생성자를 호출 한다. Button 생성자는 여러 개 이지만 컴파일러는 문자열로 생성자가 호출되는 문맥으로 부터 추정해 String 파라미터 한 개를 받는 생성자를 선택한다.
배열 타입으로도 생성자 레퍼런스를 만들수 있다. 예를 들면, int[]::new는 파라미터가 한 개(배열의 길이)인 생성자 레퍼런스이다. 이 레퍼런스는 x->new int[x]에 해당한다.
자바에서 제네릭 타입 T의 배열은 상성 할수 없다. 즉 new T[n] 은 new Object[n]으로 소거 되기 때문에 오류가 난다. 이점은 라이브러리 제작에 문제가 된다.
예를 들면, 버튼 배열을 만들고자할때 Stream 인터페이스는 Object 배열을 리턴하는 toArray 메서드를 포함한다.
Object[] buttons = stream.toArray();
하지만 사용자는 Object의 배열이 아니라 버튼 배열을 원하기 때문에 스트림 라이브러리로 이문제를 생성자 레퍼런스로 해결한다.
Button [] buttons = stream.toArray(Button[]::new);
toArray 메서드는 이 생성자를 통해 올바른 타입의 배열을 얻는다 . 그러고선 해당 배열을 채워서 리턴한다.
<소스코드>
'Language > Java' 카테고리의 다른 글
[JAVA8] 람다 표현식 (0) | 2017.01.29 |
---|---|
[JAVA8] 람다 표현식 (0) | 2017.01.24 |
[JAVA8] 람다 표현식 (0) | 2017.01.18 |
[JAVA8] 람다 표현식 (0) | 2017.01.18 |
[JAVA8] 람다 표현식 (0) | 2017.01.18 |