Item 47 - 반환 타입으로는 스트림보다 컬렉션이 낫다.
서론 자바7 까지는 메서드에서 원소 시퀀스 반환 시, 반환 타입으로 컬렉션 인터페이스, Iterable, 배열을 써왔다. 보통 컬렉션 인터페이스를 많이 사용한다. Iterable 인터페이스 for-each 문에서만 쓰일 경우 반환된 원소 시퀀스가 일부 Collec...
서론 자바7 까지는 메서드에서 원소 시퀀스 반환 시, 반환 타입으로 컬렉션 인터페이스, Iterable, 배열을 써왔다. 보통 컬렉션 인터페이스를 많이 사용한다. Iterable 인터페이스 for-each 문에서만 쓰일 경우 반환된 원소 시퀀스가 일부 Collec...
스트림 스트림 패러다임의 핵심은 계산을 일련의 변환(transformation)으로 재구성하는 것이다. 각 변환 단계는 가능한 이전 단계의 결과를 받아 처리하는 순수 함수 여야 한다. 순수함수란? 오직 입력만이 결과에 영향을 주는 함수 다른 가변상태를 참조 하지 않고, 함수 스스로도 다른 상태를 변경하지 않는다. 예를 들...
스트림 API 스트림은 다량의 데이터 처리 작업(순차/병렬)을 위해 자바 8에서 등장했다. 스트림 API 핵심 추상 개념 두 가지 핵심적인 추상 개념을 제공한다. 스트림 데이터 원소의 유한 또는 무한 시퀀스를 나타낸다. 스트림 파이프라인 스트림 원소들로 수행하는 연산단계를 표현하는 ...
자바가 람다를 지원하면서 상위 클래스의 기본 메서드를 재정의해 원하는 동작을 구현하는 템플릿 메서드 패턴의 매력은 크게 줄었다. 모던 자바에서는 템플릿 메서드 패턴 대신 함수 객체를 받는 정적 팩터리나 생성자를 제공하는 방식으로 해법을 제시하고 있다. LinkedHashMap의 removeEldestEntry를 재정의하여 Cache를 구현해보자. ...
메서드 참조의 장점 람다의 가장 큰 장점은 간결함이다. 그런데 함수객체를 람다보다 더 간결하게 만드는 방법이 있다. 바로 메서드 참조(Method Reference)다. 자바8 Map merge 메서드 default V merge(K key, V value, BiFunction<? super V, ? super V, ? ext...
익명 클래스(Annonymous Class) 예전에는 함수 객체를 만드는 주요 수단으로 익명 클래스를 많이 사용했다. 함수객체란 ? 추상 메서드 하나만 담은 인터페이스(드물게는 추상 클래스)의 인스턴스 정렬을 위한 비교함수로 익명클래스를 사용한 예시 // 익명 클래스를 함수 객체로 사용 - 낡은 기법! Collections.sort(words...
마커 인터페이스 아무 메서드도 선언하지 않은 인터페이스이다. 자바의 대표적인 마커 인터페이스로는 Serializable, Cloneable, Remote 등이 있다. 대부분의 경우, 마커 인터페이스를 단순한 타입 체크를 하기 위해 사용한다. Serializable 인터페이스를 활용한 예시를 통해 마커 인터페이스를 이해해보자. pac...
java.lang.Override 애너테이션 @Override 애너테이션은 상위 타입의 메서드를 재정의 할 때 사용한다. @Override 를 일관되게 사용하면, 여러가지 버그를 예방할 수 있다. import java.lang.annotation.*; /** * Indicates that a method declaration is i...
명명패턴 전통적으로 도구나 프레임워크가 다뤄야 할 프로그램 요소에는 딱 구분되는 명명 패턴을 적용해왔다. 테스트 프레임워크인 Junit3 버전을 확인해보자. junit3.junit.framework.TestSuite 클래스 public class TestSuite implements Test { private boolean isTest...