레코드 (Java 16+)
Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 87개 중 51번째.
간단한 데이터를 담는 클래스를 만들 때는 반복적인 보일러플레이트 코드를 자주 작성합니다. private fields, constructor, getter, toString(), equals(), 그리고 hashCode()가 그것입니다. Java 16에서는 이러한 번거로움을 없애기 위해 레코드를 도입했습니다.
record는 변경할 수 없는 데이터를 담도록 설계된 특수한 클래스입니다. record 키워드 뒤에 components 목록을 작성하여 선언합니다:
record Person(String name, int age) { }
// 그 한 줄이 자동으로 제공합니다:
// - private final 필드: name과 age
// - 생성자: Person(String name, int age)
// - 접근자 메서드: name()과 age()
// - toString(), equals(), 그리고 hashCode()record를 사용하는 것은 간단합니다:
Person p = new Person("Alice", 30);
System.out.println(p.name()); // Alice
System.out.println(p.age()); // 30
System.out.println(p); // Person[name=Alice, age=30]accessor methods는 get 접두사를 사용하지 않습니다. 단순히 fields의 이름을 따서 지정됩니다. 레코드는 암시적으로 final이므로 확장할 수 없습니다. 모든 fields도 final이므로 레코드는 본질적으로 변경할 수 없습니다.
필요한 경우 compact constructor에 custom methods를 추가하고 자동 생성된 메서드를 재정의할 수 있습니다. 또한 다음과 같이 compact constructor에 유효성 검사를 추가할 수도 있습니다.
record Person(String name, int age) {
public Person {
if (age < 0) throw new IllegalArgumentException("Age cannot be negative");
}
}Record는 DTO, API 응답 또는 상용구 코드를 작성하지 않고 단순하고 변경 불가능한 데이터 컨테이너가 필요한 모든 상황에 적합합니다.
챌린지
쉬움Java record의 우아함을 보여 주는 영화 티켓 예약 시스템을 만들어 보겠습니다. record가 사용자 지정 메서드와 검증을 추가할 수 있으면서도 반복적인 보일러플레이트 코드를 어떻게 제거하는지 확인할 수 있습니다.
코드를 세 개의 파일로 구성합니다.
Movie.java: 영화를 나타내는 record를 만듭니다. 세 가지 components인title(String),genre(String),durationMinutes(int)를 사용합니다. 재생 시간을 읽기 쉬운 형식인[hours]h [minutes]m으로 반환하는getFormattedDuration()라는 custom method를 추가합니다(예: 142분은2h 22m이 됩니다). integer division과 modulo를 사용하여 시간과 남은 분을 계산합니다.Ticket.java: 영화 티켓을 나타내는 record를 만듭니다. 세 가지 components인movie(Movie),seatNumber(String),price(double)를 사용합니다. price를 검증하는 compact constructor를 추가합니다. price가 0보다 작거나 같으면IllegalArgumentException을Price must be positivemessage와 함께 발생시킵니다. 또한 다음과 같은 여러 줄 문자열을 반환하는printTicket()라는 custom method도 추가합니다.========== TICKET ========== Movie: [movie title] Genre: [movie genre] Duration: [formatted duration from movie] Seat: [seatNumber] Price: $[price] ============================Main.java: 예약 시스템을 완성합니다! 다섯 개의 inputs를 받습니다. 영화 제목 (String), genre (String), 분 단위 재생 시간 (int), 좌석 번호 (String), 티켓 가격 (double)입니다.처음 세 inputs로 Movie record를 만든 다음, movie, 좌석 번호, price로 Ticket record를 만듭니다. 티켓에서
printTicket()을 호출한 결과를 출력합니다.
다음 순서로 다섯 개의 inputs를 받습니다: 영화 제목, genre, duration (분), 좌석 번호, price.
전통적인 class와 비교했을 때 record가 얼마나 더 간결한지 확인해 보세요. constructor, getter, toString(), equals(), hashCode()를 작성할 필요가 없습니다. compact constructor를 사용하면 field 할당을 반복하지 않고도 validation을 추가할 수 있으며, 필요할 때 custom methods도 여전히 추가할 수 있습니다!
직접 해보기
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 입력 읽기
String title = scanner.nextLine();
String genre = scanner.nextLine();
int durationMinutes = Integer.parseInt(scanner.nextLine());
String seatNumber = scanner.nextLine();
double price = Double.parseDouble(scanner.nextLine());
// TODO: title, genre, durationMinutes로 Movie 레코드 생성
// TODO: movie, seatNumber, price로 Ticket 레코드 생성
// TODO: printTicket() 메서드를 사용하여 티켓 출력
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조직접 연습해 보세요: 온라인 Java 컴파일러