-
☕️ Java 17☕️ java 2023. 10. 25. 03:48
우아한테크코스 6기 프리코스에 참여하게 되어 요구사항인 Java 17 을 이용하게 되었다.
기존에는 Java 11을 주로 사용했던 나로써 이번 기회에 Java 17에 대해 더 알아보고 사용하고자 정리해보려고 한다 🔥
☕ Java 17
💡 Java 17 Version
- 2021년 9월 새로 공개한 LTS(Long-Term Support) 버전⭐ Java 17의 기능
Java 11과 비교했을 때 Java 17에서 사용할 수 있는 몇 가지 기능들에 대해 살펴보자.
- Text Block
- Record
- Sealed Classes
- Switch Expression
- Stream.toList()
1️⃣ Text Block
JDK 15부터 정식 지원하는 기능
3개의 큰 따옴표를 통해 Java 문자열을 보다 가독성있게 작성할 수 있게 해준다.
Java 11 버전에서 JSON 형식의 문자열을 표현하기 위해서는 다음과 같이 코드를 작성해야 한다.
String jsonString = "{\\n" + " \\"name\\": \\"Beomsic\\"\\n" + "}";
Java 17에서는 텍스트 블록을 통해 다음과 같이 표현할 수 있다.
String jsonString = """ { "name": "Beomsic" } """;
2️⃣ Record
Record Data Class
- JDK 14버전 부터 공개된 Immutable 객체를 생성하는 새로운 유형의 클래스
💡 Record 특징
- 기존 getter, toString, equals, hashCode 메소드를 자동을 구현
- 모든 인스턴스 필드를 초기화해주는 생성자가 생성된다.
- 모든 field가 private final로 선언되어 setter는 제공되지 않는다.
- 기본 생성자는 제공하지 않아 필요한 경우 직접 생성해야 ㅎ
→ DTO와 같은 Data Object 용도로 활용하면 편리하고 간결하게 사용할 수 있을 것 같다.
이번, 우아한테크코스의 숫자게임에서 Data Obejct로 사용하던 BallCount 라는 Object를 record로 간단히 변경해 사용해 보았다.
// 변경전 public class BallCount { private final int strike; private final int ball; public BallCount(final int strike, final int ball) { this.strike = strike; this.ball = ball; } public int getStrike() { return strike; } public int getBall() { return ball; } }
// record public record BallCount(int strike, int ball) { }
- 불필요한 코드를 제거할 수 있었다.
3️⃣ Sealed Class
- Sealed class는 상속하거나(extends), 구현(implements)할 하위 클래스를 제한하거나 선택할 수 있다.
- 지정한 클래스만 상속/구현이 가능하도록 제한하는 기능
- 목록에 없는 경우 해당 클래스를 확장할 수 없다.
- 의도치 않은 클래스가 상속받았을 경우 컴파일 시점에서 체크할 수 있다.
public sealed class Device permits Computer, Mobile { }
- Sealed 클래스 코드만 봐도 어떤 클래스가 구현 / 상속했는지 쉽게 파악할 수 있다.
🎯 목표
- 개발자가 코드를 작성하면서 어떤 Super Class의 Sub Class를 명확하게 인지할 수 있도록 하는 것을 목표로 한다.
💡 특징
- super-class에 sealed 키워드를 사용한다.
- permits 키워드를 통해 이를 확장할 수 있는 클래스, sub-class를 선언한다.
- sealed 된 클래스를 활용하기 위해서는 같은 모듈 혹은 같은 패키지안에 존재 해야한다.
4️⃣ Switch Expression
Switch 표현식 기능 업데이트
- Switch문 값 직접 반환
- yield 예약어 이용한 값 리턴 방식 추가
- Case 문 람다식 지원
숫자게임에서 실제로 switch 문을 적용해보았다.
switch (command) { case RESTART -> baseBallGame = new BaseBallGame(); case EXIT -> { ... return; } default -> throw new IllegalArgumentException(String.format("잘못된 명령어 입니다. - %s", command)); }
5️⃣ Stream.toList()
기존 Collectors.toList() 를 .toList()로 표현할 수 있게 되었다.
Java 11
List<Integer> numbers = List.of(1, 2, 3, 4, 5); List<Integer> result = numbers.stream() .filter(number -> number > 1) .collect(Collectors.toList());
Java 17
List<Integer> numbers = List.of(1, 2, 3, 4, 5); List<Integer> result = numbers.stream() .filter(number -> number > 1) .toList(); // 변경 System.out.println(result);
⚠️ Collectors.toList() 와 .toList() 가 완전히 똑같은 형태의 구현체로 반환되지 않는다!!!
javadoc에 아래와 같이 나와있다.
📖 There are no guarantees on the type, mutability, serializability, or thread-safety of the List returned
⇒ 서로 return type이 다르다.
Collectors.toList()
- ArrayList를 반환
- 불변 타입이 아니다.
toList()
- Collectors.UnmodifiableList 또는 Collectors.UnmodifiableRandomAccessList를 반환한다.
- 변경 불가능
📖 참고자료
'☕️ java' 카테고리의 다른 글
🔗 Java 문자열와 구분자 (1) 2023.10.30 Multiple Assertions (1) 2023.10.29 🆚 AssertJ과 JUnit 의 Assertions 비교 (1) 2023.10.25 @ParameterizedTest (0) 2023.10.25 👀 Unit Test 네이밍 컨벤션 (0) 2023.10.24