도서/자바의 신

[도서/자바의 신] #32 Java 8에 추가된 것들은?

yulee_to 2023. 1. 2. 21:27

자바의 신

✔️이 글은 [자바의 신 - 이상민 지음] 도서를 바탕으로 정리한 글입니다. 


Optional

Optional은 null인 객체를 편리하게 처리하기 위해서 만든 클래스로 java.util 패키지에 속해있다. 

 

Optional 클래스 선언부

public final class Optional<T> extends Object

final로 선언되어 있어 추가적인 확장이 불가능하다. 

 

Optional 객체 생성 방법

  • Optional.empty() : 데이터가 없는 객체를 생성
  • Optional.ofNullable() : null이 추가될 수 있는 객체를 생성
  • Optional.of() : 반드시 데이터가 들어가는 객체를 생성

 

Optional 객체가 비어있는지 확인하는 메소드는 isEmpty()가 아닌 isPresent()다. 

 

 

객체에 저장된 값을 꺼내는 메소드

  • get() : 값이 없으면 null 리턴
  • orElse() : 값이 없는 경우 기본값 지정
  • orElseGet() : Supplier<T> 인터페이스 활용
  • orElseThrow() : 데이터가 없는 경우 예외를 발생시킬 때 사용, Supplier<T> 인터페이스 활용

 

null 객체를 처리하다 발생하는 NullPointerException을 처리하기 위해 Optional을 사용하지만 Optional 클래스에 값을 잘못 넣으면 NoSuchElementException이 발생한다. 

 

Default method

Java8부터는 default 메소드라해서 인터페이스 안에 구현해 놓을 수 있는 메소드를 의미한다. 

이는 "하위 호완성"을 위해서 제공된 기능인데, 이미 만들어져있는 인터페이스에 새로운 메소드를 만들어야 하는 경우가 생겼을 때 인터페이스임에도 구현해 놓을 수 있는 default 메소드 기능을 사용하여 이전에 사용한 코드에 문제를 발생시키지 않게 해준다. 

사용방법은 메소드 선언부에 default 키워드를 써주면 된다. 

 

날짜 관련 클래스들

Java8 이전에는 날짜 처리를 위해 Date나 SimpleDataFormatter 클래스를 써왔는데 이는 쓰레드에 안전하지 않고, 불변객체도 아니어서 지속적으로 값이 변경 가능했다. 또 연도는 1900년부터, 달은 1부터, 일은 0부터 시작하는 등의 복잡함 때문에 Java 8에서는 java.time이라는 패키지를 만들었다.

 

시간을 나타내는 클래스

  • Local : 시간대가 없는 시간. 1시면 어느 지역의 1시인지 구분 안됨
  • Offset : UTC(그리니치 시간대)와의 오프셋(차이)을 가지는 시간. 한국은 "+09:00"
  • Zoned : 시간대를 갖는 시간. 한국은 "Asia/Seoul"

 

Local은 시간을 의미하고, Locale은 지역을 의미하는 클래스이다. 사용자가 있는 지역에 맞춰 시간을 표시하기 위해 ZonedDataTime과 LocalDate가 추가된 것이다. 

 

Java8에는 요일 상수를 저장한 DayOfWeek라는 enum 클래스도 추가되었는데, 요일을 가져다 getDisplayName() 이라는 메소드를 이용해 지역에 맞는 요일 값을 출력할 수 있다. 이 때 지역 정보인 Locale을 함께 전달해줘야하고, TextStyle로는 FULL, SHORT, NARROW 스타일을 지정해줄 수 있다. 

 

병렬 배열 정렬(Parallel array sorting)

배열을 정리하는 가장 간편한 방법은 java.util 패키지의 Arrays 클래스를 사용하는 것이다. 

 

Arrays 클래스의 static 메소드들

  • binarySearch() : 배열 내에서의 검색
  • copyOf() : 배열의 복제
  • equals() : 배열의 비교
  • fill() : 배열 채우기
  • hashCode() : 배열의 해시코드 제공
  • sort() : 정렬, 단일 쓰레드로 수행
  • toString() : 배열의 내용 출력
  • parallelSort() : 정렬, 필요에 따라 여러 개의 쓰레드로 나뉘어 작업, Fork-Join 프레임웍이 내부적으로 사용됨

 

StringJoiner

Java 8에서 StringJoiner라는 클래스가 추가되었다. java.util 패키지에 포함되어 있으며, 순차적으로 나열되는 문자열을 처리할 때 사용한다. 배열의 구성요소 사이에만 값을 넣어주고 그 앞 뒤에 값을 넣어주고 싶을 때 StringJoiner를 사용하면 된다.

 

예를 들어 {A, B, C}가 저장된 배열이 있으면 StringJoiner(",") 생성자로 만들어준 객체에 배열의 값을 순서대로 add() 메소드로 넘겨주면  StringJoiner 객체에 "A,B,C" 문자열이 저장된다. 생성자의 매개변수로 3개를 넘겨주면 첫번째는 배열 구성요소 사이에 들어갈 값, 두번째는 맨 앞에 들어갈 prefix, 세번째는 맨 뒤에 들어갈 suffix 값으로 지정된다. 

728x90