공부방/JAVA

[모던 자바 인 액션] chapter 1. 자바 8, 9, 10, 11???

" Modern Java In Action - 모던 자바 인 액션, 전문가를 위한 자바 8, 9, 10 기법 가이드 "
공부하며 정리한 글 입니다.

Chater1. 자바 8,9,10,11: 무슨 일이 일어나고 있는가?

자바는 1996년 발표된 이유로 새로운 기능이 계속 릴리즈 되어 발전되어왔고, 현재에도 많이 쓰이는 언어중 하나이다.

이러한 발전에 있어서 가장 큰 변화가 자바 8에서 일어났다.

 

1.1 역사의 흐름은 무엇인가?

위에서 말한것과 같이 현재 11까지 릴리즈된 상황에서 매번 변화가 있었지만 자바 8에서는 그 역사상 가장큰 변화가 있었다.

 

자바 8은 이제 좀 더 자연어에 가깝게 간단한 방식으로 코드를 구현할 수 있게 변화하였다.

 

예를 들어, 그동아 자바에서 어떤 객체(사과)의 무게를 비교하기위해서는 다음과 같이 작성하였다.

Collections.sort(inventory, new Comparator<Apple>() {
	public int compare(Apple a1, Apple a2) {
    	return a1.getWeight().compareTo(a2.getWeight());
    }
});

하지만, 이러한 코드는 자바8에 들어와 다음과 같이 작성될 수 있었다.

invetory.sort(comparing(Apple::getWeight));

2번째 코드가 좀더 자연어에 가깝다는 것을 느낄 수 있을 것이다.(정렬 -> 비교 -> 사과 -> 무게)

 

그리고, 멀티코어 Cpu와 같은 하드웨어적인 변화도 자바 8에 영향을 미쳤는데 기존 멀티 CPU가 대중화 되기 이전은 대부분의 자바 프로그램이 하나의 코어만을 사용하였다. 그렇기 때문에 나머지 코어를 사용하기 위해서는 스레드를 사용하는 것이 좋다고 이야기되곤 하였는데, 다만 스레드를 사용하게 되면 관리가 어려울 뿐 아니라 여러 문제가 있었다.

 

그 문제를 해결하기 위해 자바에서는 무던한 노력을 가했는데 다음과 같다

  1. 자바1 : 스레드와 락, 메모리 모델 지원 
  2. 자바5 : 스레드 풀, 병렬 실행 컬렉션 등 강력한 도구 도입
  3. 자바7 : 병렬실행에 도움을 줄수 있는 포크/조인 프레임워크

이러한 노력을 하였지만 사실상 개발자가 단순하게 활용하기에는 어려움이 있었다.

물론 자바 9에서는 리액티브 프로그래밍이라는 병렬 실행기법(RxJava를 표준 방식으로 지원)을 지원한다.

간결한 코드, 멀티코어 프로세서의 쉬운 활용

자바8에서의 변화는 이 2가지 목적성을 기반으로 하는데 그 기능은 다음과 같다

  1. 스트림 API
  2. 메서드에 코드를 전달하는 기법
  3. 인터페이스 디폴트 메서드

자바 8은 데이터베이스 질의 언어에서 표혁식을 처리하는 것처럼, 병렬연산을 지원하는 스트림이라는 새로운 API를 제공한다.

  • 데터터베이스 질의 언어에서 고수준 언어로 원하는 동작을 표현
    • 구현에서 최적의 저수준 실행방법을 선택하는 방식으로 동작

※ 즉, 스트림을 이용하면 에러를 자주 일으키며 멀티 CPU를 이용하는 것보다 비용이 훨씬 비싼 키워드 synchronized를 사용하지 않아도 된다.

 

또한, 스트림 API 덕분에 2) 메서드에 코드를 전달하는 간결기법(메서드 참조와 람다) 그리고 3) 인터페이스의 디폴트 메소드가 존재할 수 있음을 알수 있다.

다만, 스트림 API 때문에 메소드에 코드를 전달하는 기법이 생긴 것음 아니다. 다만 스트림 API 로 인해 이러한 추가 기능(기법)들이 생길 수 있었고 그 덕분에 자바 8 기법은 함수형 프로그래밍에서 위력을 발휘하게 된다.

 

1. 2 왜 아직도 자바는 변화하는가?

자바는 현재 자바11이 릴리즈 된 상태로 꾸준히 변화하고 있는데 그이유는 간단하다.

살아남기 위해서.... 현재 코딩 생태계(?)에 존재하는 언어는 700여개에 이른다고 한다. 그리고 계속해서 늘어나고 사장되고 있기도 하고 말이다.

 

그렇기 때문에 기존언어상태를 유지한다면 새로나온 언어에 밀려 도태되고 사장될 수밖에 없다.

 

그렇기 때문에 자바는 이 생태계에서 생존하고자 계속 발전하고 진화해오고 있는 것이다.

 

1.2.1 프로그래밍 언어 생태계에서의 자바의 위치

그럼 현재 자바는 어떠한 위치를 갖고있을까?

 

자바의 시작은 좋았다.

  • 많은 유용한 라이브러리를 포함하는 잘 설계된 객체지향
    • 객체지향의 캡슐화  엔지니어링적인 문제가 적음
    • WIMP 프로그래밍 모델에 쉽게 대응(개체지향의 정신적인 모델 - 모든것은 객체다)
  • 스레드와 락을 이용한 소소한 동시성 지원(하드웨어 중릭적인 메모리 모델 스레드는 싱글코어와 달리 예기치 못한 상황을 일으킬 수 있음)
  • 코드를 JVM 바이트 코드로 컴파일하는 특징 → 인터넷 애플릿 프로그램의 주요언어

변화의 바람

하지만 프로그래밍 언어 생태계에도 변화의 바람이 불었다.

바로, 빅데이터의 등장으로 멀티코어 컴퓨터나 컴퓨팅 클러스터를 이용해 효과적으로 처리할 필요성이 커진 것이다.

 

즉, 병령 프로세싱의 활용이 필요했으나 지금까지의 자바로는 충분한 대응이 어려웠다.