멀티코어 CPU 대중화와 같은 하드웨어적인 변화는 Java의 변화에 영향을 미치게 되었고, Java는 병렬 실행 환경을 쉽게 관리하고 에러가 덜 발생하는 방향으로 진화하기 위해 노력했다.
🙄 Java 8은 간결한 코드, 멀티코어 프로세서의 쉬운 활용이라는 두 가지 요구사항을 기반으로 한다.
✔ Java 8에서 제공하는 새로운 기술
- 스트림 API
- 메서드에 코드를 전달하는 기법
- 인터페이스의 디폴트 메서드
✔ Java 8 설계의 밑바탕을 이루는 세 가지 프로그램이 개념
😎 스트림 처리
스트림이란 한 번에 한 개씩 만들어지는 연속적인 데이터 항목들의 모임이다.
A, B, C, D = 파이프 라인
데이터 -> A -> B -> C -> D -> 결과 데이터
Java 8에서는 java.util.stream 패키지에 스트림 API가 추가되었다. 해당 API는 파이프 라인을 만드는 데 필요한 많은 메서드를 제공한다.
스트림 API의 핵심은 기존에는 한 번에 한 항목을 처리했다면, 이제는 우리가 하려는 작업을 고수준으로 추상화하여 일연의 스트림으로 만들어 처리할 수 있다는 것이다. 추가로, 스트림 파이프라인을 사용하여 스레드라는 복잡한 작업을 사용하지 않으면서 입력 부분을 여러 CPU 코어에 쉽게 할당할 수 있게 되어 쉽게 병렬성을 얻을 수 있게 되었다.
😎 동적 파라미터화로 메서드에 코드 전달하기
코드 일부를 API로 전달하는 기능이다. 한 마디로, 메서드(A)를 다른 메서드(B)로 전달할 수 있는 방법을 제공한다.
😎 병렬성과 공유 가변 데이터
스트림 메서드로 전달하는 코드는 다른 코드와 동시에 실행하더라도 안전하게 실행될 수 있어야 한다. Java 8 스트림을 이용하면, 기존의 Java 스레드 API보다 쉽게 병렬성을 활용할 수 있다.
✔ 메서드와 람다를 일급 시민으로
일급 시민이란?
- 매개변수로서 전달될 수 있는가?
- 반환 값이 될 수 있는가?
- 변수에 담을 수 있는가?
위 세 가지 조건을 만족하는 것을 일급 시민이라 한다.
📒 메서드 참조
예시) 파일 리스트를 가져올 때, 숨겨진 파일만을 가져오고자 한다.
File[] hiddenFiles = new File(".").listFiles(new FileFilter() {
public boolean accept(File file) {
return file.isHidden();
}
});
문제점: File 클래스에 이미 isHidden이라는 메서드가 존재하는데, 이를 굳이 FileFilter로 isHidden을 복잡하게 감싼 다음 FileFilter를 인스턴스화 한다.
File[] hiddenFiles = new File(".").listFiles(File::isHidden);
isHidden이라는 함수가 이미 존재되어 있으므로, Java 8의 메서드 참조를 이용해서 listFiles에 메서드 자체를 직접 전달한다. 이렇게 메서드를 이급 값이 아닌 일급 값으로 사용한다.
'Java' 카테고리의 다른 글
HashMap vs HashSet (0) | 2022.12.11 |
---|---|
[Java] 함수형 프로그래밍 (0) | 2022.09.04 |