soominkim Study
article thumbnail
Published 2023. 1. 27. 22:56
[Java] Record Class Java
728x90

Record?

불변(Immutable) 데이터 객체를 쉽게 생성할 수 있도록 하는 새로운 유형의 클래스로 JDK14에서 preview로 등장하여 JDK16에서 정식 스펙에 포함되었다. Record 개념이 등장하기 전에는 불변 데이터 객체를 생성하려면 많은 코드를 작성해야 했다. 

 

1. 기존 불변 데이터 객체

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

상태를 보유하는 불변 객체를 생성하기 위해서는 위와 같은 코드를 작성해야했고 이는 여기서 끝이 아닌 추가적인 작업들이 필요했다. 추가적인 작업으로는 다음과 같다.

  • 모든 필드에 final을 사용하여 명시적으로 정의
  • 필드 값을 모두 포함한 생성자
  • 모든 필드에 대한 접근자 메서드
  • 로깅 출력을 제공하기 위한 toString 재정의
  • 두 개의 인스턴스를 비교하기 위한 hashCode, equals 재정의

이러한 작업들과 함께 작성자들 개인 차이에 따라 상속을 방지하기 위해 클래스 자체를 final로 선언하기도 한다. 그렇다면 Record Class가 등장하고 어떻게 달라졌을까?

 

2. Record Class

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

레코드 클래스를 사용하면 기존 1과 같은 코드가 훨씬 간결한 방식으로 동일한 불변 데이터 객체로 정의할 수 있다는 것을 알 수 있다. 사용법 class 자리에 record 키워드를 넣어주고 매개변수로 상태를 보유하는 불변 객체를 넣어준다.  레코드 클래스는 다음과 같은 편의성을 제공한다.

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

아래의 예제코드를 출력해보자. 

package Record;

public class RecordClass {

	public static void main(String[] args) {
		Person person = new Person("Jetty",20);
		System.out.println(person.name()+"/"+person.age());
		System.out.println("Object Informaion: "+person.toString());
	}

}

출력에 성공했다면 다음 예제를 출력해보자.

package Record;

public class RecordClass {

	public static void main(String[] args) {
		Person person = new Person("Jetty", 20);
		Person person2 = new Person("Jetty", 20);
		Person person3 = new Person("Daddy", 20);

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

}

 

또한 레코드 클래스는 기본적인 동작을 재정의 할 수 있다.

package Record;

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

IllegalArgumentException를 알고싶다면 더보기를 클릭한다.

더보기

IllegalArgumentException

java.lang.IllegalArgumentException은 적합하지 않거나(illegal) 적절하지 못한(inappropriate) 인자를 메소드에 넘겨주었을 때 발생합니다.

 

참고.

Comparison method violates its general contract!

Arrays.sort Collections.sort를 사용한 경우 Comparator가 다음을 지키지 않은 경우에도 발생합니다.

  1. 모든 x, y에 대해서, sgn(compare(x, y)) == -sgn(compare(y, x))
    • compare(x, y)가 예외를 던지는 경우, compare(y, x)도 예외를 던져야 합니다.
  2. ((compare(x, y)>0) && (compare(y, z)>0))이면 compare(x, z)>0
  3. compare(x, y)==0이면 모든 z에 대해서, sgn(compare(x, z))==sgn(compare(y, z))

여기서 sgn(expression)은 expression이 음수면 -1, 양수면 1, 0이면 0을 의미합니다.

레코드 클래스를 위와 같이 정의하고 아래의 예제를 실행해보자.

package Record;

public class RecordClass {

	public static void main(String[] args) {
		Person person = new Person("Jetty", -1);
		System.out.println(person.name() + "/" + person.age());
		System.out.println("Object Informaion: " + person.toString());
	}

}

실행했을 경우 값이 나오지 않고 레코드 클래스 파일로 넘어간다.

 

728x90

'Java' 카테고리의 다른 글

[Java] BufferedReader / Bufferedwriter  (0) 2023.03.24
[Java] AtomicLong  (0) 2023.01.27
[Java] 상속(Inheritance)  (0) 2023.01.24
[Java] Arrays.sort  (0) 2023.01.12
[Java] indexOf/lastIndexOF  (0) 2023.01.12
profile

soominkim Study

@soominkim

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그