12월7일-레코드 클래스와 빌더 패턴, 성능 비교&&장단점

Yullgiii·2023년 12월 7일
0
post-thumbnail

레코드 클래스와 빌더 패턴

간결하게 데이터를 담는 클래스를 생성할 수 있다는 장점이 있다. 그러나 레코드 클래스는 빌더 패턴을 자동으로 제공하지 않는다. 빌더 패턴은 복잡한 객체를 생성할 때 사용되는 패턴으로, 객체의 생성 과정을 단계별로 나눠서 코드의 가독성을 높이고 오류를 줄일 수 있게 해준다. 따라서 빌더 패턴을 적용하려면 별도의 빌더 클래스를 만들어야 한다.

예를 들어, 아래의 레코드 클래스를 보자.

public record User(String name, String email, int age) {}

이 레코드 클래스에 빌더 패턴을 적용하려면 아래와 같이 별도의 빌더 클래스를 만들어야 한다.

public class UserBuilder {
    private String name;
    private String email;
    private int age;

    public UserBuilder setName(String name) {
        this.name = name;
        return this;
    }

    public UserBuilder setEmail(String email) {
        this.email = email;
        return this;
    }

    public UserBuilder setAge(int age) {
        this.age = age;
        return this;
    }

    public User build() {
        return new User(name, email, age);
    }
}

위의 예제에서는 User 레코드 클래스와 이에 대응하는 UserBuilder 빌더 클래스를 만들었다. UserBuilder 클래스는 User 레코드 클래스의 각 필드에 대응하는 setter 메소드와 User 객체를 생성하는 build() 메소드를 제공 이를 통해 User 객체를 생성하는 과정을 단계별로 나눠서 수행할 수 있다.

예를 들어, 아래와 같이 UserBuilder를 사용해서 User 객체를 생성할 수 있다.

User user = new UserBuilder()
    .setName("홍길동")
    .setEmail("hong@gmail.com")
    .setAge(30)
    .build();

이처럼 빌더 패턴을 사용하면 복잡한 객체를 생성하는 과정을 단계별로 나눠서 수행할 수 있어 코드의 가독성을 높일 수 있다.하지만 빌더 클래스를 별도로 만들어야 한다는 추가적인 작업이 필요하다는 점을 염두에 두어야 한다.

레코드 클래스와 일반 클래스의 성능 비교

레코드 클래스와 일반 클래스의 성능을 비교하기 위해 간단한 벤치마크를 수행해볼 수 있다. 메모리 사용량, 객체 생성 시간, 메소드 호출 시간 등 다양한 측면에서 두 종류의 클래스를 비교해볼 수 있다.

예를 들어, 아래와 같이 레코드 클래스와 일반 클래스를 정의하고, 객체 생성 시간을 측정해볼 수 있다.

// 레코드 클래스
public record UserRecord(String name, String email, int age) {}

// 일반 클래스
public class UserClass {
    private String name;
    private String email;
    private int age;

    // getter, setter, 생성자 등...
}

벤치마크 코드는 아래와 같다.

long start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
    UserRecord userRecord = new UserRecord("name", "email", 30);
}
long end = System.currentTimeMillis();
System.out.println("레코드 클래스 생성 시간: " + (end - start) + "ms");

start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
    UserClass userClass = new UserClass("name", "email", 30);
}
end = System.currentTimeMillis();
System.out.println("일반 클래스 생성 시간: " + (end - start) + "ms");

이처럼 레코드 클래스와 일반 클래스를 실제로 사용하면서 두 클래스의 차이점과 각각의 장단점을 이해하는 것이 중요하다.

레코드 클래스의 장단점

장점:

  • 간결성: 레코드 클래스는 데이터를 담는 클래스를 매우 간결하게 표현할 수 있다. 필드와 해당 필드에 대한 getter 메소드, equals(), hashCode(), toString() 메소드를 자동으로 제공하기 때문에 코드의 양을 크게 줄일 수 있다.
  • 불변성: 레코드 클래스의 필드는 모두 final로 선언되므로, 한번 생성된 레코드 객체의 상태는 변경되지 않습니다. 이는 객체의 안정성을 높이고, 버그 발생 가능성을 줄여준다.

단점:

  • 상속 불가: 레코드 클래스는 상속을 지원하지 않는다. 따라서 기능의 확장이 필요한 경우, 레코드 클래스 대신 일반 클래스를 사용해야 한다.
  • 빌더 패턴 미지원: 레코드 클래스는 빌더 패턴을 지원하지 않는다. 복잡한 생성 로직이 필요한 경우, 별도의 빌더 클래스를 만들어야 한다.

일반 클래스의 장단점

장점:

  • 유연성: 일반 클래스는 상속, 메소드 오버라이딩 등 레코드 클래스보다 더 다양한 기능을 제공한다. 따라서 기능의 확장이 필요한 경우, 일반 클래스를 사용하는 것이 더 유연한 해결책이 될 수 있다.
  • 빌더 패턴 지원: 일반 클래스는 빌더 패턴을 쉽게 적용할 수 있다. 복잡한 생성 로직이 필요한 경우, 빌더 패턴을 통해 객체를 안정적으로 생성할 수 있다.

단점:

  • 코드 중복: 필드에 대한 getter, setter 메소드와 equals(), hashCode(), toString() 메소드 등을 직접 작성해야 한다. 이로 인해 코드의 중복이 발생하고, 코드의 가독성이 떨어질 수 다.
  • 불변성 미보장: 일반 클래스의 필드는 final로 선언되지 않는 한, 값이 변경될 수 있다. 이로 인해 객체의 상태가 예기치 않게 변경되는 문제가 발생할 수 있다.

이처럼 레코드 클래스와 일반 클래스는 각각의 장단점이 있습니다. 이를 이해하고 상황에 따라 적절한 클래스를 선택하는 것이 중요할듯하다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글