자바 8에서 새로이 제공하는 기술
스트림 API
병렬 연산 지원
→ 메서드에 코드 전달
간결하게 동작 파라미터화 구현 가능
자바 8 이전: 익명 클래스 이용하여 동작 파라미터화 구현 가능 but 자바 8이 간단 명료
→ 인터페이스의 디폴트 메서드
자바의 변화
스트림 처리 (Stream Processing)
스트림
한 번에 한 개씩 만들어지는 연속적인 데이터 항목들의 모임
스트림 API의 핵심
기존 한 번에 한 항목 처리 |
자바 8 작업을 고수준으로 추상화 → 일련의 스트림으로 만들어 처리 가능 👍🏻 스레드를 사용하지 않으면서 병렬성 얻을 수 있음 |
내부 반복
루프를 신경쓰지 않아도 됨. 라이브러리 내부에서 모든 데이터가 처리되는 내부 반복
외부 반복 *ex. for-each
각 요소를 반복하면서 작업을 수행
언제 유용한가?
가변 공유 상태가 없는, 반복되는 패턴의 기능을 병렬화
- 필터링
- 추출
- 그룹화
동작 파라미터화 (Behavior Parameterization)
sort
comparing 메서드 구현 후
기존 Comparator 객체를 만들어 sort에 넘기는 방법 |
자바 8 메서드를 다른 sort의 인수로 넘김 |
자바 함수
자바 8 → 함수를 새로운 값의 형식으로 추가
함수와 메서드 차이
함수 특정 목적을 위하여 독립적으로 설계된 코드, 호출되어 사용 가능 |
메서드 객체의 기능을 클래스 내부에 구현하는 함수 |
일급 시민
값 = 일급 시민 (일급 값)
일급 시민 ex. String, Integer, HashMap
메서드와 클래스 같은 다양한 구조체가 값의 구조를 표현하는 데에 도움이 되지만, 모든 구조체를 자유롭게 전달할 수 없음
→ 전달할 수 없는 구조체 = 이급 시민
메서드 참조, ::
해당 메서드를 값으로 사용
이전
File[] hiddenFiles = new File(".").listFiles(
**new FileFileter()** {
public boolean accept(File file) {
return file.**isHidden()**;
}
});
Java 8
❓ File 클래스에 isHidden 메서드가 존재하는데, 왜 복잡하게 FileFilter로 isHidden을 감싸 인스턴스화 하는가?
File[] hiddenFiles = new File(".").listFiles(**File::isHidden**);
람다, 익명 함수
이용할 수 있는 클래스나 메서드가 없을 때 사용하면 간결하게 코드 구현 가능
코드 넘겨주기 ex
𝑸. 사과를 필터링하는 두 가지 조건이 있을 때,
기존에는 각 조건에 대한 필터링 메서드를 따로 만들어야 했다면, 자바 8 이후에는
1. 메서드를 값으로 전달
메서드를 값으로 전달할 수 있으므로, 필터링 메서드를 하나만 만든 후 필터링 조건이 포함된 메서드(이를테면 isGreen)를 인수로 받을 수 있음
Predicate란? 인수로 값을 받아 true/false를 반환하는 함수
2. 람다
한두 번만 사용하는 메서드를 매번 정의하는 문제를 해결할 수 있는 방법
but
람다가 길어지면 이름을 가진 메서드를 정의하는 것이 바람직함 (코드의 명확성 우선시)
디폴트 메서드
미래에 프로그램이 쉽게 변화할 수 있는 환경을 제공
구현 클래스에서 구현하지 않아도 되는 메서드를 인터페이스에 추가 가능
메서드 본문 = 클래스 구현 X, 인터페이스의 일부로 포함됨
자바 8에서 List에서 직접 sort 메서드를 호출할 수 있는 이유
List 인터페이스에 디폴트 메서드 정의가 추가되었기 때문
→ Collections.sort (정적 메서드) 호출
default void sort(comparator<? super E> c) {
Collections.sort(this, c);
}