더북(TheBook)

배열 타입으로도 생성자 레퍼런스를 만들 수 있다. 예를 들어, int[]::new는 파라미터가 한 개(배열의 길이)인 생성자 레퍼런스다. 이 레퍼런스는 람다 표현식 x -> new int[x]에 해당한다.

배열 생성자 레퍼런스는 자바의 한계를 극복하는 데 유용하다. 자바에서는 제네릭 타입 T의 배열을 생성할 수 없다. 다시 말해, 표현식 new T[n]new Object[n]으로 소거되기 때문에 오류다. 이 점은 라이브러리 제작자에게 문제가 된다. 예를 들어, 버튼의 배열을 원한다고 하자. Stream 인터페이스는 Object 배열을 리턴하는 toArray 메서드를 포함한다.


Object[] buttons = stream.toArray();


 

하지만 이 코드로는 충분하지 않다. 사용자는 Object의 배열이 아니라 버튼의 배열을 원한다. 스트림 라이브러리는 이 문제를 생성자 레퍼런스를 이용해 해결한다. toArray 메서드에 Button[]::new를 전달해보자.

Button[] buttons = stream.toArray(Button[]::new);

 

toArray 메서드는 이 생성자를 호출해 올바른 타입의 배열을 얻는다. 그러고 나서 해당 배열을 채워넣어 리턴한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.