본문 바로가기
자바

[Java] 자바의 레코드(Record)

by 책 읽는 개발자_테드 2021. 9. 9.
반응형

레코드란?

 불변(immutable) 데이터 객체를 쉽게 생성할 수 있도록 하는 새로운 유형의 클래스

 JDK14에서 preview로 등장하여 JDK16에서 정식 스펙으로 포함

 

기존의 불변 데이터 객체

public class Person {
    private final String name;
    private final int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

 상태(name, age)를 보유하는 불변 객체를 생성하기 위한 많은 코드를 작성함

     - 모든 필드에 final을 사용하여 명시적으로 정의

     - 필드 값을 모두 포함한 생성자 

     - 모든 필드에 대한 접근자 메서드(getter) 

     - 상속을 방지하기 위해 클래스 자체를 final로 선언하기도함

     - 로깅 출력을 제공하기 위한 toString 재정의

     - 두 개의 인스턴스를 비교하기 위한 hashCode, equals 재정의

 

레코드를 이용한 불변 객체

public record Person(String name, int age) {
}

ㆍ레코드 클래스를 사용하면 훨씬 간결한 방식으로 동일한 불변 데이터 객체 정의할 수 있음

     - 이름(Person), 헤더(String name, int age), 바디({})

ㆍ컴파일러는 헤더를 통해 내부 필드를 추론

     - 생성자를 작성하지 않아도 되고 toString, equals, hashCode 메소드에 대한 구현을 자동으로 제공

▶ 예시 - Person 레코드 클래스의 사용법

public class RecordDemo {
    public static void main(String[] args){
        Person person = new Person("Ted", 100);
        System.out.println("이름:"+ person.name() + " 나이:"+person.age());
        System.out.println("객체 정보:"+person.toString());
        Person person2 = new Person("Ted", 100);
        Person person3 = new Person("Dean", 200);

        if (person.equals(person2)) System.out.println("person, person2는 같은 사람");
        else System.out.println("person, person2는 다른 사람");

        if (person.equals(person3)) System.out.println("person, person3는 같은 사람");
        else System.out.println("person, person3는 다른 사람");
    }
}

결과

ㆍ기본적인 동작을 재정의할 수 있음

▶ 예시 - 나이 제한하기

public record Person(String name, int age) {
    public Person{
        if(age < 0) {
            throw new IllegalArgumentException("Age cannot be negative");
        }
    }
}

ㆍ레코드의 제한

     - 레코드는 암묵적으로 final 클래스(상속불가)이고, abstract 선언 불가

     - 다른 클래스를 상속(extends) 받을 수 없음, 인터페이스 구현(implements)은 가능

출처

https://www.baeldung.com/java-15-new

https://mostadmired.tistory.com/133

https://openjdk.java.net/jeps/384

 

반응형

댓글