본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Java8 In Action] #1 기초

by 돼지왕 왕돼지 2018. 12. 21.
반응형

[Java8 In Action] #1 기초



Java8 In Action 내용을 보며 정리한 내용입니다.

정리자는 기존에 Java8 을 한차례 rough 하게 공부한 적이 있고, Kotlin 역시 공부한 적이 있습니다.

위의 prerequisite 가 있는 상태에서 추가적인 내용만 정리한 내용이므로, 제대로 공부를 하고 싶다면 책을 구매해서 보길 권장합니다!


anonymous function, default method, external iteration, first-class value, forking step, internal iteration, java8 in action, LAMBDA, lambda syntax, pure 함수, runtime foot print, side-effect-free 함수, stateless 함수, 값을 바꾸는 것, 공유 가변 데이터, 내부 반복, 동작 파라미터화, 디폴트 메서드, 람다, 병렬성, 부작용 없는 함수, 상태 없는 함수, 순수 함수, 스트림, 스트림 처리, 이급 값, 이급 시민, 익명 함수, 일급값, 자바 함수, 자바의 위치


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 처리 방법과 패턴 매칭 활용 등 흥미로운 기법을 발견할 수 있었다.





반응형

댓글