본문 바로가기

IT Book Summary/ModernJavaInAction

Part 1 기초 - Chapter 1 자바8, 9, 10, 11

무슨일이 일어나고 있는가?

 

1996년 JDK1.0 이후 자바는 계속해서 발전해왔고 2018 자바 10,11 이 릴리즈 되었다.

자바 역사를 통틀어 가장 큰 변화가 자바 8 에서 일어났다. 

 멀티코어 CPU 대중화와 같은 하드웨어적인 변화도 영향을 미쳤을 것이다.

이러한 병렬 실행환경을 쉽게 관리하고 에러가 덜 발생하게 단순하게 접근할 수 있는 방식으로 진화했다.

핵심 키워드는 간결한 코드, 멀티코어 프로세서의 쉬운 활용이라 말할수 있겠다.

 

 자바 언어와, 웹 프레임워크의 진화와 함께 우리는 대부분 최소 자바 8 이상으로 버전을 올렸지만, 이러한 모던 자바의 문법을 적극 활용하며 코딩하지 않았던것 같다. 자바 버전을 11로 올린다고 한들 내가 최신자바 문법을 활용하지 않는다면 무슨 소용인가? 

이제 라이브러리를 파보면 스트림과 람다 표현식으로 되어있고, 그 프레임워크를 사용하면서도 여전히 나는 오래된 문법에 정체되어 있고 소모적인 코딩방식을 구사하고 있어 더이상 모던 자바 문법을 공부하는 것을 미룰 수 없었다.

 단순한 메소드 사용법만을 익히는 것은 그리 오래 걸리지 않을것이다.

그러나 그 작동방법과 개념까지 잘 알고 활용하고 싶었다. 내가 이 책을 선택한 이유다.

 

Chapter 1에서는 포괄적으로 이 책이 어떠한 내용을 담고 있는지를 서술한다.

 

  • 스트림 API
  • 메서드에 코드를 전달하는 기법
  • 인터페이스의 디폴트 메서드

결국 자바 8 에서 추가된 스트림 API 덕분에 메서드에 코드를 전달하는 간결 기법(메서드 참조와 람다)과 인터페이스의 디폴트 메서드가 존재 할 수 있음을 알 수 있다. 이 기법은 함수형 프로그래밍에서 위력을 발휘할 것이다.

 

90년대 자바가 대중적인 프로그래밍 언어로 성장 할수 있는 요인은 두가지 이다 

하나는 캡슐화 덕분에 C에 비해 소프트웨어 엔지니어링적인 문제가 훨씬 적다는 것이고

다른하나는 write-once run-anywhere  객체지향 정신적인 모델 덕분이다.

 


이 책은 병렬성을 활용하는 코드, 간결한 코드를 구현할 수 있는 세가지 프로그래밍 개념을 설명한다.

 

1. 스트림 처리

스트림이란 한번에 한개씩 만들어지는 연속적인 데이터 항목들의 모임이다.

입력스트림에서 데이터를 한개씩 읽어들이면 출력스트림에서 데이터를 한개씩 기록한다. 

유닉스에서는 여러 명령을 병렬로 실행한다. 따라서 연결지어진 명령 cat 이 완료되지 않은 시점에서 sort가 행을 처리하기 시작할 수 있다.

ex) 자동차 생산 공장 라인

 

자바 8에서는 스트림 API가 추가 되었는데 스트림패키지에 정의된 Stream<T>는 T형식으로 구성된 일련의 항목을 의미한다.

유닉스가 명령어로 복잡한 파이프라인을 구성한 것처럼 스트림은 파이프라인은 만드는데 많은 메서드를 제공한다.

스레드라는 복잡한 작업을 사용하지 않고도 병렬성을 얻을 수 있다.

 

2. 동작 파라미터화로 메서드에 코드 전달하기

메서드를 다른 메서드의 인수로 넘겨주는 기능을 제공한다.

이러한 기능을 이론적으로 동작 파라미터화 라고 부른다.

 

3. 병렬성과 공유 가변 데이터

다른코드와 동시에 실행하더라도 안전하게 실행할 수 있는 코드를 만들려면 공유된 가변데이터에 접근하지 않아야 한다.

기존의 synchronized를 이용해 공유된 가변 데이터를 보호할 수 있으나 성능에 악영향을 미친다. (병렬성 무력화)

공유되지 않는 가변데이터, 메서드, 함수코드를 다른 메서드로 전달하는 기능은 함수형 프로그래밍의 핵심적 사항이다.

 

 


자바 8 에 추가된 새로운 개념을 보자

 

1. 자바 함수와 람다

프로그리밍 언어의 핵심은 값을 바꾸는 것이다. 

자바 프로그램에서 조작할 수 있는 일급 시민 first class 값은 첫번째로 기본값, 두번째로 객체값(객체의 함조) 이다. 

new 또는 팩토리메서드 또는 라이브러리 함수를 이용해서 객체의 값을 얻을 수 있다. 배열도 객체다. 

그런데 왜 함수가 필요할까?

메서드와 클래스는 그 자체로 값이 될 수는 없었다. 전달 할 수 없는 구조체는 이급 시민이다.

자바8 에서는 메서드 참조 :: (이 메서드를 값으로 사용하라의 의미)라는 기능이 추가되었다.

람다를 포함하여 함수도 값으로 취급할 수 있다.

 

2. 스트림

거의 모든 자바 어플리케이션은 컬렉션을 만들고 활용한다. 

스트림 API를 이용하면 컬렉션 API와는 상당히 다른 방식으로 데이터를 처리할 수 있다.

for-each 루프를 이용해 외부반복 작업을 이용했던 이전방식에 비해

스트림 API 는 라이브러리 내부반복에 의해 모든 데이터가 처리된다. 

'컬렉션을 처리하며 발생하는 모호함과 반복적인 처리문제' 와  '멀티코어 활용 어려움'의 문제까지 해결한다.

스트림은 스트림 내의 요소를 인수를 쉽게 병렬로 처리 할 수 있는 환경을 제공한다는 것이 핵심이다.

 

3.디폴트 메서드와 자바 모듈

요즘은 외부에서 만들어진 컴포넌트를 이용해 시스템을 구축하는 경향이 있다.

자바 9의 모듈 시스템은 모듈을 정의하는 문법을 제공하므로 이를 이용해 

패키지 모음을 포함하는 모듈을 정의할 수 있다.

또한 자바 8에 인터페이스를 쉽게 바꿀수 있도록, 구현하지 않아도 되는 디폴트 메서드를 지원한다.