아이템 47. 반환 타입으로는 스트림보다 컬렉션이 낫다. - ksw6169/effective-java GitHub Wiki
메소드에서 원소 시퀀스를 반환하는 타입을 고를 때 Java 8 이전에는 기본적으로 컬렉션 인터페이스를 사용하면 됐었다. 하지만 Java 8 이후부터는 스트림이 도입되면서 컬렉션과 스트림 중 어떤 것을 반환할 것인지 결정하기가 쉽지 않아졌다.
스트림은 반복(Iteration)을 지원하지 않는다. (for-each를 통한 반복 불가) 이유는 스트림이 Iterable
인터페이스를 확장(extends) 하지 않기 때문이다. 따라서 메소드를 호출한 후 for-each를 사용하려는 사람이 불편할 수 있다.
향상된 for문(The enhanced for statement) 의 동작
Java 5부터 추가된 향상된 for문은 다음과 같이 사용한다.
for (String s : list) { System.out.println(s); }이를 컴파일해보면 다음과 같이 변경되는 것을 확인할 수 있다.
Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String s = (String) iterator.next(); System.out.println(s); }향상된 for문은 Iterator 인터페이스를 구현한 클래스 혹은 배열만 사용 가능하다. 배열을 사용할 경우에는 컴파일 시 index를 활용한 기존 for문과 같이 변경시켜주는 것을 확인할 수 있다.
반대로 API가 Iterable 만 반환하면 이를 스트림 파이프라인에서 처리하는 프로그래머가 난감할 것이다.
- 사용자 대부분이 한 방식만 사용할 거라는 근거가 없다면 공개 API를 작성할 때는 스트림 파이프라인을 사용하려는 사람과 반복문을 사용하려는 사람을 모두 배려해야 한다.
- Collection 인터페이스는 Iterable의 하위 타입이고 stream 메소드도 제공하니 반복과 스트림을 동시에 지원한다.
- 따라서 원소 시퀀스를 반환하는 공개 API의 반환 타입에는 Collection이나 그 하위 타입을 쓰는 게 일반적이다.
- Arrays 역시 Arrays.asList와 Stream.of 메소드로 손쉽게 반복과 스트림을 지원할 수 있다.
- Effective Java 3/E
- [Java] For문(For Loop / Enhanced For Loop / For Each)ㅣJamie의 성장기