[Java8 In Action] #1 기초 |
Java8 In Action 내용을 보며 정리한 내용입니다.
정리자는 기존에 Java8 을 한차례 rough 하게 공부한 적이 있고, Kotlin 역시 공부한 적이 있습니다.
위의 prerequisite 가 있는 상태에서 추가적인 내용만 정리한 내용이므로, 제대로 공부를 하고 싶다면 책을 구매해서 보길 권장합니다!
1.1. 왜 아직도 자바는 변화하는가?
-
C, C++ 는 프로그래밍 안전성은 부족하지만 작은 런타임 풋프린트(foot print)덕분에 운영체제와 다양한 임베디드 시스템에서 여전히 인기를 끌고 있다. 하지만, C, C++ 의 낮은 안정성 떄문에 프로그램이 예기치 않게 종료되거나 바이러스 등이 침투할 수 있는 보안 구멍이 있을 수 있다. 실제로 런타임 풋프린트에 여유가 있는 앱에서는 자바, C# 같이 안전한 형식의 언어가 C, C++ 를 압도하고 있다.
-
특정 분야에서 장점을 가진 언어는 다른 경쟁 언어를 도태시킨다. 단지 새로운 하나의 기능 떄문에 기존 언어를 버리고 새로운 언어와 툴 체인으로 바꾼다는 것은 쉽지 않은 일이다. 하지만 새로운 프로그래밍을 배우는 사람은( 기존 언어가 재빠르게 진화하지 않는다면 ) 자연스럽게 새로운 언어를 선택하게 되며 기존 언어는 도태된다.
1.1.1. 프로그래밍 언어 생태계에서 자바의 위치
1.1.2. 스트림 처리
1.1.3. 동작 파라미터화로 메서드에 코드 전달하기
1.1.4. 병렬성과 공유 가변 데이터
-
스트림을 사용함으로써 “병렬성을 공짜로 얻을 수 있다.”
그러나 세상에 공짜는 없다 병렬성을 얻는 대신 코드의 동작 방식을 조금 바꿔야 한다.
처음에는 이런 변화가 불편하게 느껴질 수 있으나 일단 익숙해지면 이 방식을 더 선호하게 될 것이다.
스트림 메서드로 전달하는 코드는 다른 코드와 동시에 실행하더라도 안전하게 실행될 수 있어야 한다.
안전하게 실행된다는 것은 가변 데이터에 접근하지 않는 것이다.
이런 함수를 순수함수(pure 함수), 부작용 없는 함수(side-effect-free 함수), 상태 없는 함수(stateless 함수) 라 부른다.
1.1.5. 자바가 진화해야 하는 이유
1.2. 자바 함수
-
프로그래밍 언어의 핵심은 값을 바꾸는 것이다. 역사적으로 그리고 전통적으로 프로그래밍 언어에서는 이 값을 일급(first-class) 값이라고 부른다.
자바 프로그래밍 언어의 다양한 구조체(메서드, 클래스 같은)가 값의 구조를 표현하는데 도움이 될 수 있다.
하지만 프로그램을 실행하는 동안 이러한 모든 구조체를 자유롭게 전달할 수는 없다. 이렇게 전달할 수 없는 구조체는 이급 시민(이급 값)에 해당한다.
1.2.1. 메서드와 람다를 일급 시민으로
람다: 익명 함수
-
자바 8 에서는 기명(named) 메서드를 일급값으로 취급할 뿐 아니라 람다(또는 익명함수, anonymous functions)를 포함하여 함수도 값으로 취급할 수 있다.
1.2.2. 코드 넘겨주기 : 예제
1.2.3. 메서드 전달에서 람다로
-
Java 의 람다는 다음과 같은 syntax 를 갖는다.
filterApples( inventory, (Apple a) -> “green”.equals(a.getColor()) );
1.3. 스트림
-
컬렉션을 for-each 루프를 이용해서 요소를 처리하는 것을 외부 반복(external iteration)이라 한다.
반면 스트림 API 를 이용하면 루프를 신경쓸 필요가 없다. 스트림 API 에서는 라이브러리 내부에서 모든 데이터가 처리되며 이와 같은 반복을 내부 반복(internal iteration)이라 한다.
1.3.1. 멀티스레딩은 어렵다.
-
두 CPU 를 가진 환경에서 리스트를 필터링할 때 한 CPU 는 리스트의 앞부분을 처리하고, 다른 CPU 는 리스트의 뒷부분을 처리하도록 요청할 수 있다.
이 과정을 포킹 단계(forking step)라고 한다.
그리고 각각의 CPU 는 자신이 맡은 절반의 리스트를 처리한다.
마지막으로 하나의 CPU 가 두 결과를 정리한다.
1.4. 디폴트 메서드
-
프로그래머가 직접 디폴트 메서드를 구현하는 상황은 흔치 않다.
디폴트 메서드는 특정 프로그램을 구현하는 데 도움을 주는 기능이 아니라 미래에 프로그램이 쉽게 변화할 수 있는 환경을 제공하는 기능이다.
1.5. 함수형 프로그램에서 가져온 다른 유용한 아이디어
1.6. 요약
-
언어 생태계의 모든 언어는 변화해서 살아남거나 그대로 머물면서 사라지게 되는 상황에 놓인다. 지금은 자바의 위치가 견고하지만 코볼과 같은 언어의 선례를 떠올리면 자바가 영원히 지배적인 위치를 유지할 수 있는 것은 아닐 수 있다.
-
자바8은 프로그램을 더 효과적이고 간결하게 구현할 수 있는 새로운 개념과 기능을 제공한다.
-
기존의 자바 프로그래밍 기법으로 멀티코어 프로세서를 온전히 활용하기 어렵다.
-
함수는 일급값이다. 메서드를 어떻게 함수형값으로 넘겨주는지, 익명 함수(람다)를 어떻게 구현하는지 기억하자.
-
자바8의 스트림 개념 중 일부는 컬렉션에서 가져온 것이다. 스트림과 컬렉션을 적절하게 활용하면 스트림의 인수를 병렬로 처리할 수 있으며 더 가독성이 좋은 코드를 구현할 수 있다.
-
인터페이스에서 디폴트 메서드를 이용하면 메서드 바디를 제공할 수 있으므로 인터페이스를 구현하는 다른 클래스에서 해당 메서드를 구현하지 않아도 된다.
-
함수형 프로그래밍에서 null 처리 방법과 패턴 매칭 활용 등 흥미로운 기법을 발견할 수 있었다.
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[Java8 In Action] #3 람다 표현식 (0) | 2018.12.23 |
---|---|
[Java8 In Action] #2 동적 파라미터화 코드 전달하기 (0) | 2018.12.22 |
[Java] Semaphore 에 대해 알아보자. (0) | 2018.12.20 |
Java bytecode 분석 (0) | 2018.12.19 |
[android] AutoFill Service 란 녀석이 나타났다. (0) | 2018.12.09 |
댓글