스터디에서 정리해주신 내용을 (거의)그대로 옮겨적은 내용입니다.
=========================================================
Java17에서 도입된 'record'는 데이터 클래스를 간결하고 효율적으로 정의하기 위한 새로운 기능
불변성을 기본적으로 지원하며, 가독성과 유지보수성을 크게 향상 시킴
Record의 주요 특징
1. 간결한 문법
- record 키워드를 사용하여 데이터 클래스를 간단히 정의할 수 있음
public record Person(String name, int age) {}
- 자동으로 생성자, getter, equals, hashCode, toString 메서드 제공
2. 불변성(Immutability)
- 모든 필드는 final로 선언되어, 생성 이후 값 변경 불가
- 멀티스레드 환경에서 안전하게 사용 가능
3. 자동 생성 메서드
- 컴파일러가 다음 메서드들을 자동으로 생성
- equals(Object o)
- hashCode()
- toString()
Person person = new Person("Kim", 33);
System.out.println(person); // 출력: Person[name=Kim age=33]
4. 클래스 상속 불가
- Record는 암묵적으로 final로 선언되어 상속 불가
- 인터페이스 구현은 가능
5. 사용 용도
- 데이터 전송 객체(DTO), 값 객체(Value Object)등 데이터를 담는 용도로 적합
Record와 기존 방식 비교
특징 | 기존 클래스 | Record |
코드 길이 | 생성자, getter, equals, hashCode, toString 메서드 작성 필요 | 자동 생성 |
불변성 지원 | 직접 final 선언 및 불변성을 보장하는 코드 작성 필요 | 기본적으로 불변성 제공 |
상속 가능 여부 | 클래스 상속 가능 | 상속 불가 |
외부 라이브러리 의존성 | Lombok 등 라이브러리 필요 | 필요 없음 |
Record 사용 예제
1. 기본 사용
public record Student(String name, int age) {}
public class Main {
public static void main(String[] args) {
Strudent student = new Student("Alice", 20);
System.out.println(student.name()); // Kim
System.out.println(student.age()); // 33
System.out.println(student); // Student[name=Kim, age=33]
}
}
2. 커스텀 생성자 정의
public record Student(String name, int age) {
public Student {
if(age < 0) {
throw new IllegalArgumentException("Age cannot be negative");
}
}
}
3. 인터페이스 구현
public record Employee(String name, int id) implements Comparable<Employee> {
@Override
public int compareTo(Employee other){
return Integer.compare(this.id, other.id);
}
}
Lombok과 Record 비교
- Lombok은 외부 라이브러리로 추가 설정 및 IDE 플러그인이 필요, Record는 Java 표준 기능으로 별도 설정이 필요없음.
- Lombok은 가변 객체를 포함한 다양한 옵션 제공, Record는 간결하며 불변성 기본 제공