언어/Java

[Java] record

JM Lee 2024. 4. 12. 02:50
728x90

자바에서 record는 JDK 14부터 도입된 새로운 데이터 구조이다. Record는 불변(immutable)한 데이터를 표현하기 위한 간단하고 강력한 방법을 제공한다. Record는 주로 Entity, DTO 등의 데이터를 저장하고 접근하기 위한 목적으로 사용되며, 간결하게 작성할 수 있고 자동으로 생성자, 접근자 메서드, equals(), hashCode(), toString() 등을 제공한다. 이를 통해 코드의 가독성을 높이고 실수를 줄일 수 있다.

 

코드가 정말 간단하게 줄어듦을 아래와 같이 확인할 수 있다.

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

 

위 추상 클래스가 아래와 같이 바뀐다. 상당히 간결해졌음을 볼 수 있다.

public record Person(
	String name,
    int age
) {}
# {}은 선택사항이나, 나중에 여기에 내용을 채울 수 있고(확장 가능성), 
# 클래스 인터페이스와 마찬가지로 놓기 때문(일관성).

 

이 record는 위 추상 클래스에서도 볼 수 있듯이 private final을 사용한 불변하(immutable), 상속 불가능한 데이터들을 위한 구조다. 이러한 불변성의 원인에 대해선 다음과 같다고 생각하는데, 간단히 참고만 하면 좋다.

  1. 불변성 보장: 불변 데이터는 여러 스레드에서 안전하게 공유될 수 있다. 이는 동시성 이슈를 방지하고 프로그램의 안정성을 높이는 데 도움이 된다.
  2. Thread-Safe한 코드 작성: 불변 데이터는 스레드 간의 경쟁 조건(race condition)이나 상태 변화에 따른 문제를 방지한다. 이로써 프로그래머는 스레드 안전성에 대한 추가적인 고민 없이도 안전한 코드를 작성할 수 있다.
  3. 단순화된 사용법: 불변 데이터는 객체가 생성된 후에 상태가 변하지 않기 때문에 추적 및 디버깅이 더욱 쉽다. 코드의 복잡성을 줄이고 예측 가능한 동작을 유지할 수 있다.
  4. Functional Programming 지원: 불변 데이터는 함수형 프로그래밍의 핵심 개념 중 하나다. Record의 불변성은 함수형 프로그래밍의 원칙을 따르고 이러한 스타일로 코드를 작성하는 데 도움이 된다.

 

또한 record를 생성할 시 다음과 같은 특징도 있다.

 

필수 모든 인자 생성자 (Required All-Argument Constructor)

  • Record를 선언하면, 자동으로 모든 필드를 초기화하는 생성자가 생성된다. 이 생성자는 모든 필드를 인자로 받아서 객체를 생성한다. 이 생성자는 record의 불변성을 유지하기 위해 필수적으로 제공된다.
/// 필수 모든 인자 생성자 예시

public record Person(String name, int age) {
    // 필수 모든 인자 생성자가 자동으로 생성됨
}

public class Main {
    public static void main(String[] args) {
        // 필수 모든 인자 생성자를 사용하여 Person 객체 생성
        Person person = new Person("John", 30);

        // 생성된 객체의 필드에 접근
        System.out.println("Name: " + person.name()); // "John"
        System.out.println("Age: " + person.age());   // 30
    }
}

 

필드명을 따른 Getter 메서드 (Field-named Getter)

  • Getter 메서드는 일반적인 Java 클래스와 다르게 getXXX() 형식이 아니라 필드의 이름을 따서 생성된다. 예를 들어, 필드명이 name인 경우에는 name() 메서드가 생성된다. 이러한 형태의 Getter 메서드는 각 필드를 직접적으로 접근할 수 있도록 더 직관적인 인터페이스를 제공한다. 이는 코드를 더 읽기 쉽고 간결하게 만들어주다.
public class Person {
    private String name;
    private int age;
    private String address;

    // 생성자, Getter 및 Setter 메서드 생략

    // Getter 메서드 - 필드명을 따른 Getter 메서드
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getAddress() {
        return address;
    }
}

'언어 > Java' 카테고리의 다른 글

[JAVA] 스레드  (0) 2024.04.13
[Java] JVM 개요  (0) 2024.04.11
Java static  (0) 2024.04.07
[Java] 추상 클래스란?  (0) 2024.04.07
Java 객체 속성 설정 관련 공부  (1) 2024.04.06