Java Record

Haechan Kim·2023년 6월 15일
0

Modern Java

목록 보기
3/5
post-thumbnail

Record란?

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

JDK 14에서 등장, 16에서 정식 스펙으로 포함.

자바 불변 객체 (Immutable Object)

객체 지향에서 불변 객체란 생성 후 그 상태 바꿀 수 없는 객체 말함.
재할당 가능하지만, 한번 할당하면 내부 데이터 변경 불가능한 객체.
String, Integer, Boolean 등.
String str = "aa" , str = "bb" 는 값 변경아니야? -> "bb"라는 새로운 객체 만들고 그 객체를 str이 참조하게 하는 것.

  • 불변 아닌 클래스
    외부에서 age, name 변경 가능
class MutablePerson {
	public String name;
    public int age;
    
    public MutablePerson(String name, int age) {
    	this.name = name;
        this.age = age;
    }
}
  • 불변 클래스
    외부에서 값 변경 불가
class ImmutablePerson {
	public final String name;
    public final int age;

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

기존의 불변 데이터 객체

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;
    }
}

상태(age, name)를 보유하는 객체 생성 위해 많은 코드 필요함.

  • 모든 필드에 final 명시
  • 필드 값 모두 포함한 생성자

레코드 이용한 불변 객체

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

레코드 클래스 사용하면 훨씬 간결하게 불변 데이터 객체 정의 가능!
컴파일러는 헤더 통해 내부 필드 추론.
생성자 작성 필요 없고 toString, equals, hasCode 메소드에 대한 구현 자동 제공.

// 사용 예시
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는 다른 사람");
    }
}

<참고>

0개의 댓글