상세 컨텐츠

본문 제목

[JAVA] 객체의 생성과 표현 방법

JAVA/기본 & 강의복습

by ranlan 2021. 8. 23. 20:12

본문

728x90

점층적 생성자 패턴(Telescoping Constructor Pattern)

필수 매개변수로만 이뤄진 생성자부터 필수요소가 아닌 매개변수들을 하나씩 추가한 생성자까지 인자를 늘려가며 모든 인자를 받는 생성자까지 정의하는 방법

package ConstPattern;

// 점층적 생성자 패턴 ver
public class Member1 {

    // 필수요소
    private final String name;
    private final int age;
    // 선택요소
    private final String tell;
    private final String birth;

    public Member1(String name, int age) {
        // 1) 필수 요소만 있는 경우
        this(name, age, "no tell", "no birth");
    }

    public Member1(String name, int age, String tell) {
        // 2) 필수 요소와 선택적 요소 1개만 있는 경우
        this(name, age, tell, "no birth");
    }

    public Member1(String name, int age, String tell, String birth) {
        // 모두 있는 경우
        this.name = name;
        this.age = age;
        this.tell = tell;
        this.birth = birth;
    }
}
Member1 m1 = new Member1("juran", 24, "01000000000");

 

선택 요소가 자주 빠지는 경우 new 키워드와 생성자를 통해 객체를 쉽게 생성할 수 있다.

하지만 생성자를 호출하는 코드가 많아져 인자가 추가될 때마다 코드 수정이 어렵고 코드 가독성이 떨어진다.

 

자바빈즈 패턴(JavaBeans pattern)

매개변수가 없는 생성자로 객체 생성 후 setter를 통해 요소의 값 설정하는 방법

package ConstPattern;

// 자바빈즈 패턴 ver
public class Member2 {
    
    // 필수요소
    private String name;
    private int age;
    // 선택요소
    private String tell;
    private String birth;

    // 기본 생성자
    public Member2() {}

    // setter
    public void setName(String name) {this.name = name;}
    public void setAge(int age) {this.age = age;}
    public void setTell(String tell) {this.tell = tell;}
    public void setBirth(String birth) {this.birth = birth;}
}

어노테이션 ver

@Setter
@NoArgsConstructor
public class Member2() {
    private String name;
    private int age;
    private String tell;
    private String birth;
}

@Setter 각 멤버변수에 대한 setter 생성

@NoArgsConstructor 매개변수가 없는 기본 생성자 

Member2 m2 = new Member2();
m2.setName("juran");
m2.setAge(24);
m2.setTell("01000000000");
m2.setBirth("0422");

가독성이 좋으나 하나의 인스턴스 생성을 위해 호출되는 메서드가 많다.

setter 메서드가 있기 때문에 불변 객체를 생성할 수 없다.

 

빌더 패턴(Builder Pattern)

별도의 Builder 클래스를 만들어 필수 값에 대해서는 빌더 생성자를 통해, 선택적인 값들에 대해서는 입력받은 후 builder 메서드를 통해 하나의 인스턴스를 리턴하는 방식

 

* 객체내에는 setter와 public이 없기 때문에 빌더 클래스를 통해서만 값에 접근 가능

 

직접 빌더 코드 작성

package ConstPattern;

// 빌더 패턴 ver
public class Member3 {

    private final String name;
    private final int age;
    private String tell;
    private String birth;

    private Member3(Builder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.tell = builder.tell;
        this.birth = builder.birth;
    }
    
    public static class Builder {

        // 필수요소
        private final String name;
        private final int age;
        // 선택요소
        private String tell;
        private String birth;

        // 필수 인자만 있는 빌더
        public Builder(String name, int age) {
            this.name = name;
            this.age = age;
        }

        // 선택 인자
        public Builder tell(String tell) {
            this.tell = tell;
            return this;
        }
        public Builder birth(String birth) {
            this.birth = birth;
            return this;
        }

        // 인스턴스 반환
        public Member3 build() {
            return new Member3(this);
        }

    }
}

어노테이션 ver

@Builder
public class Member3 {
    private final String name;
    private final int age;
    private final String tell;
    private final String birth;
}

@Builder 빌더 자동생성하여 코드 단축 가능

Member3 m = new Member3.Builder("juran", 24)
        .birth("0422")
        .build();

코드 가독성이 좋고 setter가 없어 변경이 불가능해져 객체의 일관성이 보장된다.

빌더 클래스를 따로 생성해줘야 한다.

 

 

 

728x90

관련글 더보기

댓글 영역