본문 바로가기
개인공부

java record 개념 및 사용법

by 리승우 2023. 3. 23.
  • record란?
    • Java14부터 도입된 기능
    • 데이터를 저장하는 불변 클래스를 쉽게 작성할 수 있도록 하는 새로운 기능
  • record없이 기존의 방법은?
    • 데이터를 저장하기 위해 클래스를 정의, 필드를 정의, 생성자를 정의, getter메서드를 정의하는 등, 번거로운 작업들을 해야 했음. 아래는 이름, 성, 나이를 가지고 있는 Person객체를 정의하는 일반적인 방법의 코드임
    public class Person {
        private String firstName;
        private String lastName;
        private int age;
    
        public Person(String firstName, String lastName, int age) {
            this.firstName = firstName;
            this.lastName = lastName;
            this.age = age;
        }
    
        public String getFirstName() {
            return firstName;
        }
    
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Person{" +
                    "firstName='" + firstName + '\\'' +
                    ", lastName='" + lastName + '\\'' +
                    ", age=" + age +
                    '}';
        }
    }
    
  • record를 사용한다면?
    아래와 같은 코드로 매우 매우 매우 간편하게 작성할 수 있음
    public record Person(String firstName, String lastName, int age) {
    }
    
    위의 코드는 Person이라는 record를 정의함.
    record는 이름, 성, 나이를 생성자에서 바로 정의함
    이렇게 정의된 record는 생성자, getter, equals, hashcode, toString등을 자동으로 생성함
    ⇒ record를 사용하면 코드가 간결해지고 가독성이 향상됨!

 

Person record를 생성하고 출력하는 건 아래와 같음

Person person = new Person("John", "Doe", 30);
System.out.println(person);
System.out.println(person.firstName());

 

출력 내용

Person[firstName=John, lastName=Doe, age=30]
John

 

record는 어디에 사용해야하는가?

record는 불변 객체를 간단하게 만들 수 있기 때문에, 보통 DTO(Data Transfer Object)나 VO(Value Object)등과 같은 데이터 전송 객체나 값 객체를 만들 때 자주 사용됨

 

단, record는 간단한 데이터 전송 객체나 값 객체를 정의할 때 주로 사용되기 때문에, 복잡한 비즈니스 로직이 들어가는 클래스는 record로 구현하기보다는 일반 클래스로 구현하는 것이 좋음

record의 단점은?

기존 Java Bean과의 호환성이 부족함 Java Bean에서는 getter와 setter 메서드를 사용하여 클래스의 속성값을 읽고 쓰는 방식으로 접근하는 것이 일반적임. 하지만 record에서는 자동으로 생성되는 생성자와 getter메서드를 사용하여 접근함.

따라서, Java Bean을 사용하는 코드와 호환성을 유지하기 위해서는 record 대신 Java Bean을 사용해야 함.

 

record는 불변 객체를 생성하는 것에 최적화되어 있기 때문에, 상태를 변경해야 하는 경우에는 사용하기 어려움

 

 

  • record 활용 코드 예시1
public class Test {
    private record Student(String name, int age){
        public boolean isAdult() {
            return age >= 20;
        }
    }

    public static void main(String[] args) {
        Student student = new Student("학생1", 15);
        System.out.println(student);
        System.out.println(student.name());

        if (student.isAdult()) {System.out.println("I'am Adult!");} 
        else {System.out.println("I'am Not.....");}
    }
}

---------------------------------------------------------------------
**출력값**
Student[name=학생1, age=15]
학생1
I'am Not.....

 

  • record 활용 코드 예시2
    RequestBody로 들어오는 PatternRequestDto를 record화 시켜서 불변클래스를 간편하게 생성
package com.joara.auth.api;

@RestController
@Log4j2
public class SampleApi {
    private record PatternRequestDto(String pattern, String target) {}
    private record GsonTestDto(
            @JsonProperty("me.name") String name,
            @JsonProperty("me.email") String email) {}

    @PostMapping("/pattern")
    public boolean test(@RequestBody PatternRequestDto body) {
        AntPathMatcher matcher = new AntPathMatcher();
        return matcher.match(body.pattern(), body.target());
    }

    @PostMapping("/gson")
    public GsonTestDto gson(@RequestBody GsonTestDto body) {
        return body;
    }
}

댓글