[CHAPTER 1] 자바 8,9,10,11 : 무슨 일이 일어나고 있는가?
자바 8 : 간결한 코드, 멀티코어 프로세서의 쉬운 활용
- 스트림 API
- 메서드에 코드를 전달하는 기법
- 인터페이스의 디폴트 메서드
Behavior parameterization(동작 파라미터화) - 자바 8 이전 상황에서는 익명 클래스를 이용해서 동작 구현
공짜로 병렬성을 얻을 수 있다. 스트림 파이프라인을 이용해 입력 부분을 여러 CPU 코어에 쉽게 할당 할 수 있다.
스트림 메서드로 전달하는 코드는 다른 코드와 동시에 실행하더라도 안전하게 실행도리 수 있어야한다.
다른 코드에 동시에 실행하더라도 안전하게 실행 할 수 있는 코드를 만들려면 공유된 가변 데이터(shared mutable data)에 접근하지 않아야한다. 이러한 함수를 순수(pure) 함수, 부작용 없는(side-effect-free) 함수, 상태 없는(stateless) 함수라 부른다.
함수형 프로그래밍에서는 우리가 하려는 작업이 최우선시되며 그 작업을 어떻게 수행하는지는 별개의 문제로 취급한다.
(ex)
하려는 작업 : A에서 B로 이동할 수 있는 모든 경로
수행 방법 : 자료구조를 탐색하면서 컴포넌트 수정
프로그래밍 언어에서 함수라는 용어는 메서드, 특히 정적 메서드와 같은 의미로 사용된다.
자바의 함수는 이에 더해 수학적인 함수처럼 사용되며 부작용을 일으키지 않는 함수를 의미한다.
일급 시민(first-class citizens)
predicate(프레디케이트)
수학에서는 인수로 값을 받아 true나 false를 반환하는 함수를 프레디케이트라고 한다.
자바 8에서도 Function<Apple, Boolean> 같이 코드를 구현할 수 있지만 Predicate<Apple>을 사용하는 것이 더 표준적인 방식이다.
또한 boolean을 Boolean으로 변환하는 과정이 없으므로 더 효율적이기도 하다.
스트림 API에서는 라이브러리 내부에서 모든 데이터가 처리된다.
스트림 동작 과정
두 CPU를 가진 환경에서 리스트를 필터링할 때 한 CPU는 리스트의 앞부분을 처리하고, 다른 CPU는 리스트의 뒷부분을 처리하도록 요청할 수 있다. 이 과정을 포킹 단계(forking step)라고 한다.
그리고 각각의 CPu는 자신이 맡은 절만의 리스트를 처리한다.
마지막으로 하나의 CPU가 두 결과를 정리한다.
자바의 병렬성과 공유되지 않은 가변 상태
자바 8은 라이브러리에서 분할을 처리한다. 즉 큰 스트림을 병렬로 처리할 수 있도록 작은 슽릠으로 분할 한다.
자바 9의 모듈 시스템, 자바 8에서는 인터페이스를 쉽게 바꿀 수 있도록 디폴트 메서드 지원
[CHAPTER 2] 동작 파라미터화 코드 전달하기
익명 클래스를 이용하면 클래스 선언과 인스턴스화를 동시에 할 수 있다. 즉, 즉석에서 필요한 구현을 만들어서 사용할 수 있다.
[CHAPTER 13] 디폴트 메서드
인터페이스를 정의하는 두 가지 방법
- 인터페이스 내부에 정적 메서드 사용
- 인터페이스의 기본 구현을 제공할 수 있도록 디폴트 메서드 사용
기존 인터페이스를 구현하는 클래스는 자동으로 인터페이스에 추가된 새로운 메서드의 디폴트 메서드를 상속받게 된다. 기존의 코드 구현을 바꾸도록 강요하지 않으면서도 인터페이스를 바꿀 수 있다.
default 키워드 : 해당 메서드가 디폴트 메서드
디폴트 메서드를 사용하는 이유는 뭘까? 주로 라이브러리 설계자들이 사용한다.
디폴트 메서드를 이용하면 자바 API의 호환성을 유지하면서 라이브러리를 바꿀 수 있다.
디폴트 메서드는 다중 상속 동작이라는 유연성을 제공한다
바이너리 호환성 : 새로 추가된 메서드를 호출하지만 않으면 새로운 메서드 구현이 없어도 기존 클래스 파일 구현이 잘 동작한다는 의미
디폴트 메서드는 누가 구현할까? 인터페이스를 구현하는 클래스에서 구현하지 않은 메서드는 인터페이스 자체에서 기본으로 제공한다.
디폴트 메서드를 이용하는 방식
- 선택형 메서드
- 동작 다중 상속
여러 인터페이스를 동시에 구현할 때 해결 규칙
1. 클래스나 슈퍼클래스에서 정의한 메서드가 디폴트 메서드보다 우선권을 갖는다.
2. 서브 인터페이스가 이긴다. 즉, B가 A를 상속 받는다면 B가 A를 이긴다.
3. 1,2로 우선순위가 결정되지 않을 경우 여러 인터페이스를 상속받는 클래스가 명시적으로 디폴트 메서드를 오버라이드하고 호출해야한다. 그렇지 않으면 컴파일 에러가 발생한다.
[CHAPTER 14] 자바 모듈 시스템
추론하기 쉬운 소프트웨어를 만드는데 도움을 주는 관심사 분리(sepration of concerns)와 정보 은닉(information hidding)
관심사 분리 : 프로그램을 고유 기능으로 나누는 동작
- 개별 기능을 따로 작업할 수 있으므로 팀이 쉽게 협업할 수 있다.
- 개별 부분을 재사용하기 쉽다.
- 전체 시스템을 쉽게 유지보수할 수 있다.
정보 은닉 : 세부구현을 숨김
- 세부 구현을 숨김으로 프로그램의 어떤 부분을 바꿨을 때 다른 부분까지 영향을 미칠 가능성을 줄인다.
- 코드를 관리하고 보호
- 캡슐화(encapsulation) : 특정 코드 조각이 애플리케이션의 다른 부분과 고립되있음을 의미
캡슐화된 코드의 내부적인 변화가 의도치 않게 외부에 영향을 미칠 가능성이 줄어든다.
'JAVA' 카테고리의 다른 글
Java 성능 관리 (0) | 2020.12.09 |
---|---|
[Java] boolean, Boolean (0) | 2020.07.21 |
Java Inner Class (0) | 2020.05.29 |
Java 초기화 (0) | 2020.05.28 |
Java garbage collector (0) | 2020.05.15 |