3. 배경
• 간결한 코드를 위한 개발자들의 Needs
• 멀티코어 CPU 대중화 (하드웨어적)
4. 배경
• 간결한 코드를 위한 개발자들의 Needs
익명클래스를
이용하는 방법
메서드 레퍼런스를
이용하는 방법
5. 배경
• 멀티코어 CPU 대중화 (하드웨어적)
– 기존에는 멀티코어를 활용하기 위해 Thread를 사용했
다.
• Java 1 : Thread, Lock
• Java 5 : Thread Pool, Concurrent Collection
• Java 7 : Fork-Join Framework
– 자바8에서는 병렬처리를 지원하는 Stream API 지원
• 비싼 자원인 Synchronized 키워드를 사용하지 않음
• 병철 처리 코드를 JVM으로 넘김 (추상화)
• parallelStream()
6. 자바 함수
• 자바8에서는 함수를 새로운 값의 형식으로 추가했다.
(함수를 값으로 넘길 수 있다는 의미)
– Primitive Data Type : int, boolean, float
– Reference Data Type : String, new 키워드로 생성한 각종
객체들
– Method (메소드 레퍼런스) : 메소드 블럭의 메모리상 주소
값
– Function (익명함수 or 람다) : 익명함수 블록의 메모리상
주소값
• 람다와 메소드 레퍼런스를 이용하여 스트림의 기능이
구현된다.
7. 메서드 레퍼런스
File 클래스에 isHidden() 메서드가 존재하고 있지
만 복잡하게 FileFilter 클래스로 감싼후 new 키워드
를 이용하여 인스턴스를 만들어 객체로 만든 후 파
라메터로 전달한다.
File 클래스가 가지고 있는 isHidden() 메서드
를 직접 파라메터로 전달한다.
9. 람다 (익명함수)
• 람다 코드가 길어진다면 메서드로 만들고
메서드 레퍼런스로 넘기는 방식으로 구현
하자.
• 예제로 나온 필터와 같은 집합연산은 직접
구현하지 말고 가급적이면 스트림 API를
사용하자.
10. 스트림 (Stream)
• 스트림이란 한번에 한개씩 만들어지는 연
속적인 데이터 항목들의 모임
• 자바8에서는 우리가 하려는 작업을 고수
준으로 추상화해서 일련의 스트림으로 만
들어 처리할 수 있다.
• 스트림 파이프라인을 이용하면 추상화된
병렬처리를 할 수 있다.
12. 디폴트 메서드
• 기존의 구현을 고치지 않고도 이미 공개된 인터페이스를 변경할 수
있을까?
– Interface의 태생적 한계
• 디폴트 메서드는 특정 메서드 구현을 인터페이스가 포함하는 것
• 자바8에서는 Default 키워드 지원
• 디폴트 메서드를 이용하면 기존의 인터페이스 설계를 자유롭게 확
장할 수 있다.
• 개발자가 디폴트 메서드를 직접 구현할 일은 거의 없어야 한다.
• 디폴트 메서드는 프로그램 구현에 도움을 주는 것이 아니라 미래에
프로그램이 쉽게 변화 할 수 있는 환경을 제공하는 것이다.
• 다중상속?
13. 동작 파라메터화
• 전략 패턴 (Stratege Pattern)
• 알고리즘(전략)을 미리 정의해 둔 다음 런
타임에 알고리즘을 선택하는 패턴
14.
15. 필요한 전략을 런타임에 결정할 수 있다.
그런데 전략을 반드시 클래스로 만들어야 할까?
16. 진짜로 필요한 코드
진짜로 필요한 코드
필요한 전략을 런타임에 결정할 수 있다.
그런데 전략을 반드시 클래스로 만들어야 할까?
진짜 실행에 필요한 알고리즘보다
코드를 보내기 위해 작성된 불필요한 코드량이 더 많다.