Ian's Archive 🏃🏻

thumbnail
Modern Java In Action 1장 정리
Cloud
2024.11.28.

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

코드를 JVM바이트 코드로 컴파일하는 특징 때문에 자바는 인터넷 애플릿 프로그램의 주요 언어가 되었다. JVM의 업데이트 덕분에 경쟁 언어는 더 부드럽게 실행될 수 있으며 자바와 상호동작을 할 수 있게 되었다. 또한 자바는 다양한 임베디드 컴퓨팅 분야를 성공적으로 장악하고 있다.

하지만 프로그래밍 언어 생태계에 변화의 바람이 불었다. 프로그래머는 빅데이터라는 도전에 직면하면서 멀티코어 컴퓨터나 컴퓨팅 클러스터를 이용해서 빅데이터를 효과적으로 처리할 필요성이 커졌다. 즉, 병렬 프로세싱을 활용해야 하는데 이전의 자바로는 충분히 대응할 수 없었다.

변화하는 환경에 빠르게 적응하며 자바는 변화하였다. 자바 8은 다양한 프로그래밍 도구 그리고 다양한 프로그래밍 문제를 더 빠르고 정확하며 쉽게 유지보수 할 수 있다는 장점을 제공한다. 병렬성을 활용하는 코드, 간결한 코드를 구현할 수 있도록 자바 8에서 제공하는 기능의 세가지 프로그래밍 개념을 자세히 설명한다.

1.2 세가지 프로그래밍 개념

1.2.1 스트림 처리

  • 자바 8에는 java.util.stream패키지에 스트림 API가 추가되었다.
  • 스트림 API는 파이프라인을 만드는데 필요한 많은 메서드를 제공한다.
  • 스트림 API의 핵심은 기존에는 한 번에 한 항목을 처리했지만 작업을 고수준으로 추상화해서 일련의 스트림을 만들어 처리가 가능
  • 즉, 스레드라는 복잡한 작업을 사용하지 않으면서 공짜로 병렬성 얻을 수 있다.

1.2.2 동적 파라미터화로 메서드에 코드 전달

  • 자바 8에서는 메서드를 다른 메서드의 인수로 넘겨주는 기능을 제공한다 -> 동작 파라미터화

1.2.3 병렬성과 공유 가변 데이터

  • 병렬성을 얻는 대신 포기해야 하는 부분이 존재한다.
  • 안전하게 실행할 수 있는 코드를 만들려면 공유된 가변 데이터에 접근하지 않아야 한다.
  • 이러한 함수를 순수함수라 부른다.

1.3 자바 함수

자바 8에서는 함수를 새로운 값의 형식으로 추가했다. 프로그래밍 언어의 핵심은 값을 바꾸는 것이다. 프로그래밍 언어에서는 이 값을 일급(first-class)값이라고 부른다. 자바 프로그래밍 언어에서는 기본값, 인스턴스만이 일급 시민이었다. 메서드와, 클래스는 이 당시 일급 시민이 아니었는데, 런타임에 메서드를 전달할 수 있다면, 즉 메서드를 일급 시민으로 만들면 프로그래밍에 유용하게 활용될 수 있다. 자바 8 설계자들은 이급 시민을 일급 시민으로 바꿀 수 있는 기능을 추가했다.

1.3.1 메서드 참조

익명 클래스를 통한 파일 리스팅

copyButtonText
File[] hiddenFiles = new File(".").listFiles(new FileFilter() {
  public boolean accept(File file) {
    return file.isHidden();
  }
});

메서드 참조를 이용한 파일 리스팅

copyButtonText
File[] hiddenFiles = new File(".").listFiles(File::isHidden);
  • 동작의 전달을 위해 익명 클래스를 만들고 메서드 구현하여 넘길 필요 없이, 준비된 함수를 메서드 참조 ::를 이용해 전달한다.

1.3.2 람다 : 익명 함수

자바 8에서는 기명(named) 메서드를 일급 값으로 취급할 뿐 아니라 람다(또는 익명함수)를 포함하여 함수도 값으로 취급할 수 있다.

1.4 스트림

컬랙션에서는 for-each루프를 이용해 각 요소를 반복하면서 작업을 수행했다. 이러한 방법을 외부 반복이라고 한다. 스트림 API를 이용하면 루프를 신경 쓸 필요가 없다.
스트림 API에서는 라이브러리 내부에서 모든 데이터가 처리된다. 이와 같은 반복을 내부 반복이라고 한다.

1.4.1 멀티 스레딩

자바8은 스트림 API로 컬렉션을 처리하면서 발생하는 모호함과 반복적인 코드문제멀티코어 활용의 어려움이라는 두가지 문제를 모두 해결했다. 내부적으로 코드를 나누고 합침

컬렉션은 어떻게 데이터를 저장하고 접근 할 것인지 중점을 두는 반면에
스트림은 데이터에 어떤 계산을 할 것인지 묘사하는 것에 중점을 둔다.

컬렉션을 필터링 할 수 있는 가장 빠른 방법은 컬렉션을 스트림으로 바꾸고, 병렬로 처리한 다음에, 리스트로 다시 복원하는 것(병렬로도 처리가능)

1.5 디폴트 메서드와 자바 모듈

자바 8에서 지원하는 디폴트 메서드를 이용해 기존 인터페이스를 구현하는 클래스를 바꾸지 않고도 인터페이스를 변경할 수 있다.

디폴트 메서드를 이용하면 기존의 코드는 건들이지 않고 원래의 인터페이스 설계를 자유롭게 확장할 수 있다.

1.6 함수형 프로그래밍이 가져온 다른 유용한 아이디어

자바 8에서는 NullPointer 예외를 피할 수 있도록 도와주는 Optional클래스를 제공한다.
Optional는 값이 없는 상황을 어떻게 처리할 지 명시적으로 구현하는 메소드를 포함한다.

Reference

모던 자바 인 액션

Thank You for Visiting My Blog, I hope you have an amazing day 😆
© 2023 Ian, Powered By Gatsby.