Programming/Java

(Java) 점층적 생성자 패턴 & 자바 빈즈 패턴

Jan92 2021. 8. 21. 01:14

Java Patterns

 

프로그래밍에서 Class를 설계하다 보면, 필수로 받아야 할 인자와 선택적으로 받아야 할 인자가 구분됩니다.

그리고 Java에서는 이렇게 설계된 다양한 형태의 Class들을 객체화하는 3가지 패턴이 존재합니다.

'점층적 생성자 패턴',   '자바 빈즈 패턴',   '빌더 패턴'

 

먼저 점층적 생성자 패턴 (Telescoping Constructor Pattern)과 자바 빈즈 패턴 (Java Beans Pattern)을 알아보고, 다음으로 점층적 생성자 패턴의 안전성과 자바 빈즈 패턴의 가독성을 더한 빌더 패턴 (Builder Pattern)에 대해서 알아보겠습니다.

 

 

 


 

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

 

public class Member {
	
    private String name;				// 필수
    private int age;				   	// 필수
    private String address;				// 선택
    private String phone;				// 선택
    private String email;  				// 선택
    
    // 필수 매개변수를 가지는 생성자
    public Member(String name, int age) {
    	this(name, age, null, null, null);
    }
    
    // 선택 매개변수 address가 추가된 생성자
    public Member(String name, int age, String address) {
    	this(name, age, address, null, null);
    }
    
    // 선택 매개변수 phone이 추가된 생성자
   	public Member(String name, int age, String address, String phone) {
    	this(name, age, address, phone, null);
    }
    
    // 모든 매개변수를 가지는 생성자
    public Member(String name, int age, String address, String phone, String email) {
    	this.name = name;
        this.age = age;
        this.address = address;
        this.phone = phone;
        this.email = email;
    }
}

 

필수 매개변수를 받는 생성자를 먼저 생성하고, 선택 매개변수 1개를 추가로 받는 생성자, 선택 매개변수 2개를 추가로 받는 생성자 등의 형태로 매개변수 개수만큼 생성자를 늘리는 방식입니다.

마치 생성자가 점층적으로 성장하는 생성자를 가지도록 한 디장인 패턴이 '점층적 생성자 패턴'입니다.

 

단점으로는

  • 매개변수가 많아질수록 많은 조합이 만들어지고, 생성자의 수가 많아집니다. 이는 코드 작성 효율과 가독성이 저하되는 영향을 줍니다.
  • 클래스의 생성자를 호출하는 입장에서 해당 매개변수가 맞는지, 매개변수의 개수는 제대로 입력한 것인지 확인해야 하는 불편함이 있습니다.
  • 매개변수의 타입이 같은 경우 생성자를 만들 수 없습니다.
Member member = new Member("jan", 99, "KOR", "01012345678");

Test test = new Test(12, 10, 1, 330, 9);

Member의 경우 간단한 생성자라서 들어가는 값만 봐도 어떤 내용인지 유추할 수 있습니다.

하지만 예를 들어 Test 같은 생성자에 인자로 모두 int 값만 들어가는 경우가 있다면 12가 무슨 값인지, 330이 무슨 값인지 알기 위해서는 생성자를 찾아봐야 하는 경우가 생깁니다.

 

 

    // 선택 매개변수 address가 추가된 생성자
    public Member(String name, int age, String address) {
    	this(name, age, address, null, null);
    }
    
    // 선택 매개변수 phone이 추가된 생성자
    public Member(String name, int age, String phone) {
        this(name, age, null, phone, null);
    }

마지막 매개변수 타입이 같은 생성자를 만들 수 없는 경우입니다. 다음과 같은 생성자는 인자로 받는 타입이 같기 때문에 이렇게 두 개의 생성자를 동시에 생성할 수 없습니다.

 

 


 

자바 빈즈 패턴 (Java Beans Pattern) 이란?

 

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

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

public void setAddress(String address) {
    this.address = address;
}

public void setPhone(String phone) {
    this.phone = phone;
}

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

 

Member member = new Member();
member.setName("jan");
member.setAge(99);
member.setAddress("KOR");
member.setPhone("01012345678");

 

자바 빈즈 패턴은 매개 변수가 없는 생성자 (기본 생성자)로 객체를 만든 후 setter 메서드를 호출하여 원하는 매개변수의 값을 설정하는 방식입니다.

 

코드가 길지만 인스턴스를 만들기 쉽고, 가독성이 좋다는 장점이 있습니다.

단점으로는 하나의 객체를 완성하기까지 메서드를 여러 번 호출해야 하고, setter 메서드가 있기 때문에 불변의 객체(immutable)를 만들 수 없습니다.

 

 

이어서 점층적 생성자 패턴의 안전성과 자바 빈즈 패턴의 가독성을 겸비한 빌더 패턴에 대해서 알아보겠습니다.