티스토리 뷰

Language/Java

[JAVA8] 람다 표현식

JayStevency 2017. 1. 24. 16:00

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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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 31
글 보관함