ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ☕️ 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 표현식 기능 업데이트

    1. Switch문 값 직접 반환
    2. yield 예약어 이용한 값 리턴 방식 추가
    3. 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를 반환한다.
    • 변경 불가능

     

    📖 참고자료

    New Features in Java 17 | Baeldung

    Java Text Blocks | Baeldung

    Sealed classes in java 17

    The Evolution Of Switch Statement From Java 7 to Java 17

    '☕️ 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

    댓글

Designed by Tistory.