본문 바로가기
Web Programming

Java 17 주요 특징 with 예제 샘플 코드

by 맑은안개 2023. 1. 29.

1. record ( From java 14 )

record는 간결하면서, 변경 불가한 객체를 위한 새로운 타입입니다. record를 사용하면 기존에 장황했던 코드를 몇 줄의 간결한 코드로 축약할 수 있습니다. 👍

다음 샘플 코드를 통해 기존 방식과의 차이점을 알아봅니다.

public class Human {
    private String name;
    private int age;
    private String address;
 
    public Human(String name, int age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    public String getAddress() {
        return address;
    }
 
    public void setAddress(String address) {
        this.address = address;
    }
 
    @Override
    public String toString() {
        return "Human [name=" + name + ", age=" + age + ", address=" + address + "]";
    }
}

record 를 사용하면 다음과 같이 간략해집니다.

public record Human(String name, int age, String address) {}

- record는 불변객체로써 setter method가 없습니다. 

- toString, equals, hashCode 함수가 자동으로 생성됩니다.

2. sealed ~ permits

sealed 키워드를 사용하여 interface를 implement하는 클래스를 제한(permit)할 수 있습니다.

설명하니 약간 어려워 보이는데, 다음의 예제를 보면 간단히 이해할수 있습니다. 😁

sealed interface Shape permits Circle, Square, Rectangle {
    int getArea();
}
final class Circle implements Shape {
    int radius;
    Circle(int radius) {
        this.radius = radius;
    }
    public int getArea() {
        return (int) (Math.PI * radius * radius);
    }
}
final class Square implements Shape {
    int side;
    Square(int side) {
        this.side = side;
    }
    public int getArea() {
        return side * side;
    }
}
final class Rectangle implements Shape {
    int width, height;
    Rectangle(int width, int height) {
        this.width = width;
        this.height = height;
    }
    public int getArea() {
        return width * height;
    }
}

- permits 절에 명시된 클래스 외에 클래스는 Shape를 implement할 수 없습니다.

- 이는 위의 예제에서 처럼 특정 클래스에 제한된 확장을 갖게 하고 싶을때 유용하게 사용됩니다.

3. Text Blocks

개인적으로 제일 기다려온 기능입니다. 문자열 가공 혹은 디스플레이에 있어 개행 값을 표현하기 위해 \n 을 무수히 써가며 StringBuilder 같은 클래스를 썼던걸 기억하나요? 네. 17버전에서는 멀티라인 문자열 표현이 """ 을 사용하여 표현가능합니다. 파이썬과 비슷하죠?

String html = """
    <html>
        <body>
            <p>Hello, World!</p>
        </body>
    </html>
""";

4. Pattern Matching

Java의 모든 객체는 Object 를 상속받습니다. Object객체의 타입을 switch에서 구분햘 수 있습니다.

Object obj = ...;
switch (obj) {
    case 0:
        System.out.println("zero");
        break;
    case String s:
        System.out.println(s.length());
        break;
    case int i:
        System.out.println(i);
        break;
    default:
        System.out.println("unknown");
}

 

반응형