Java 14부터 도입된 record는 새로운 종류의 클래스 타입으로, 데이터만 저장하는 객체를 간결하고 효율적으로 작성할 수 있게 해주는 기능입니다. Java에서 데이터를 다루기 위해 수많은 getter, setter, toString(), equals(), hashCode() 등의 메서드를 반복적으로 작성해야 하는 번거로움을 크게 줄여줍니다. 이번 글에서는 Java record의 개념과 특징을 살펴보고, 이를 통해 얻을 수 있는 장점과 간단한 코드 예제를 소개하겠습니다.
1. record란?
record는 불변(immutable) 데이터 객체를 쉽게 정의할 수 있는 데이터 전용 클래스입니다. 이 클래스는 선언하는 즉시 필드와 관련된 getter, equals(), hashCode(), toString() 등의 메서드를 자동으로 생성해줍니다. 이를 통해 기존에 번거롭게 작성해야 했던 보일러플레이트 코드(boilerplate code)를 제거하고, 코드의 간결성과 가독성을 높일 수 있습니다.
1.1. record의 기본 구조
record는 아래와 같이 매우 간단한 형태로 정의됩니다.
public record Person(String name, int age) {}
위 코드에서 Person은 이름(name)과 나이(age)라는 두 개의 필드를 가진 record입니다. 선언만으로도 다음과 같은 기능이 자동으로 제공됩니다:
- 필드 값에 대한 읽기 메서드 (name(), age())
- equals(), hashCode(), toString() 메서드 자동 생성
- 불변성: 필드는 기본적으로 final로 선언되어, 값을 변경할 수 없습니다.
2. record의 주요 특징과 장점
2.1. 불변성 (Immutability)
record의 모든 필드는 기본적으로 불변입니다. 한 번 생성된 record 객체의 필드는 변경할 수 없으므로, 안정성이 중요한 경우에 유용하게 사용할 수 있습니다. 이러한 불변성은 멀티스레딩 환경에서 특히 안전한 데이터를 다룰 때 도움이 됩니다.
Person person = new Person("John", 30);
// person.name = "Doe"; // 컴파일 오류: record의 필드는 변경할 수 없음
2.2. 간결한 코드
record는 데이터를 표현하는 데 필요한 보일러플레이트 코드를 자동으로 생성해줍니다. 전통적인 클래스와 비교했을 때, getter, toString(), equals(), hashCode() 등을 명시적으로 작성할 필요가 없어 코드가 매우 간결해집니다.
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;
}
@Override
public boolean equals(Object o) {
// equals() 구현...
}
@Override
public int hashCode() {
// hashCode() 구현...
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + '}';
}
}
위의 전통적인 클래스 구현과 달리, record는 훨씬 간결하게 작성됩니다
public record Person(String name, int age) {}
2.3. 자동 생성 메서드
record를 선언하면, 다음 메서드들이 자동으로 생성됩니다:
- 생성자(Constructor): 모든 필드를 초기화하는 기본 생성자가 자동으로 생성됩니다.
- Getter 메서드: 필드 이름과 동일한 이름의 메서드가 자동 생성됩니다.
- toString() 메서드: 필드 값을 포함한 문자열 표현이 자동으로 제공됩니다.
- equals() 메서드: 두 객체가 같은 값인지 비교하는 메서드가 자동 생성됩니다.
- hashCode() 메서드: 객체의 해시 코드를 계산하는 메서드가 자동 생성됩니다.
2.4. 가독성 및 유지보수성 향상
기존 클래스 방식에서는 여러 메서드를 수동으로 구현하다 보면 코드가 길어지고 복잡해지기 쉽습니다. 그러나 record를 사용하면 데이터 객체를 보다 간결하고 직관적으로 표현할 수 있어 가독성이 높아지고, 유지보수도 쉬워집니다.
3. record 사용 예제
3.1. 기본 사용법
다음은 Person record를 사용하는 간단한 예제입니다
public record Person(String name, int age) {}
public class RecordExample {
public static void main(String[] args) {
Person person = new Person("Alice", 25);
System.out.println(person.name()); // Alice
System.out.println(person.age()); // 25
System.out.println(person); // Person[name=Alice, age=25]
}
}
이 코드에서 Person record는 name과 age 필드를 가지고 있으며, getter 메서드와 toString()이 자동 생성됩니다.
3.2. 커스텀 메서드 추가
record에는 추가적인 메서드도 정의할 수 있습니다. 단, 필드는 불변이므로 필드를 수정하는 로직은 포함할 수 없습니다.
public record Person(String name, int age) {
public String greet() {
return "Hello, my name is " + name + " and I am " + age + " years old.";
}
}
위 코드에서는 greet() 메서드를 추가하여 name과 age를 이용한 인사 메시지를 출력할 수 있습니다.
4. record 사용 시 주의할 점
4.1. 불변성
record의 필드는 기본적으로 final이므로 생성 후 값을 수정할 수 없습니다. 이러한 특성 때문에 가변 상태를 유지해야 하는 객체에는 record가 적합하지 않습니다. 상태를 변경해야 하는 경우에는 전통적인 클래스를 사용하는 것이 좋습니다.
4.2. 상속 불가
record는 상속을 지원하지 않습니다. 즉, 다른 클래스를 상속받거나 record 자체를 상속하는 것이 불가능합니다. 이는 record가 데이터 보존 목적에 충실하기 때문에 복잡한 계층 구조보다는 단순한 데이터 객체로 사용하기에 적합하다는 의미입니다.
public record Employee(String name, int age) extends Person { } // 오류 발생: record는 상속 불가
Java의 record는 데이터를 간단하게 저장하고 처리할 수 있는 강력한 도구입니다. 불변성을 보장하면서도 getter, equals(), hashCode(), toString() 등의 메서드를 자동으로 생성해주어 코드를 간결하게 작성할 수 있습니다. 또한, 가독성 향상과 유지보수의 편리함까지 더해줘, 데이터 전용 객체를 다룰 때 매우 유용하게 활용할 수 있습니다.
다만, 불변성과 상속 불가라는 제한이 있으므로, 가변 데이터나 복잡한 상속 구조가 필요한 상황에서는 전통적인 클래스 사용을 고려해야 합니다. record의 간결함과 효율성을 활용해 여러분의 프로젝트에서 데이터 클래스를 더 쉽게 관리해보세요!
'JAVA' 카테고리의 다른 글
JDK 23에서 주목해야 할 기능 5가지: Java의 진화와 개발자 생산성 향상 (0) | 2024.09.12 |
---|---|
Java 22의 놀라운 새로운 기능! 개발 효율을 극대화하는 방법 (0) | 2024.09.11 |
효율적인 단위 테스트를 위한 무기! JUnit Parameterized Tests 활용법 (0) | 2024.09.11 |
Java 21의 새로운 기능 (0) | 2024.08.27 |
Zulu JDK: 무료로 장기 지원을 받을 수 있는 최고의 Java JDK (0) | 2024.08.21 |