보통 공부를 하면서 클레스를 디자인하면 생성자에 들어가는 매개변수가 2~3개정도일때가 대부분이다.
하지만 생성자에 많은 매개변수가 필요할때가 있다.
예를들면 DB를 사용할때 같은경우에 학생 테이블에서 주민등록번호, 이름, 나이, 성별, 등등의 데이터가 필요할때가 있다.

이것을 읽고 쓰기 위해서는 C/C++에서는 구조체 라는 물건을 쓸수 있고 객체지향 프로그래밍에서는 class를 사용할수 있다.
구조체를 사용한다면
struct 학생{
    int 학번;
    char * 이름;
    int 나이;
    boolean 남자?;
    int 국어;
    int 영어;
    int 수학;
};
이런 형식으로 나타낼수 있다.(한글은 안되영! 이라고 하지말자 영어쓰기 귀차나요)

이것을 사용할때
학생 a = {1,"이름",20,true,93,12,89};

같은 형식으로 사용하거나
학생 a;
a.학번=1;
a.이름="이름";
a.나이=20;
a.국어=93;
a.영어=12;
a.수학=89;

같은 형식으로 사용할수 있다. (혹시 있을지 모르는 문법적 오류는 대충 넘어가주세요)

하지만 클레스라면? 혹은 점수는 나중에 입력하고 싶다면?

자바에서 생성자를 사용한다고 해보자
public 학생(int 학번, String 이름);
public 학생(int 학번, String 이름, int 나이);
public 학생(int 학번, String 이름, int 나이,int 국어,int 영어,int 수학);
라는 생성자를 만들어보았다.
만약 나이를 안쓰고 국어점수만 쓰고싶다면?
둘다 int 형 자료라서 오버로딩도 안된다.
게다가 써놓고보면 이게 뭐가 뭔지도 잘모르겠다. 라는 문제점이 생긴다.

첫번째 대안으로 사용할수 있는것은 자바빈즈 패턴이다.
쉽게 말해서 Setter, Getter 를 사용하는거다.
학생 a;
a.set학번(1);
a.set이름("이름");
a.set나이(20);
a.set국어(93);
a.set영어(12);
a.set수학(89);

이렇게 만들면 항상 내가 원하는 만큼의 매개변수를 이용해서 생성할수가 있다. 게다가 가독성도 좋다!

근데 일관성을 유지할 수 없다 라는 단점이 있다고 책에서 말한다.
근데 뭔소린지 잘 모르겠다.
내가 보기에는 뭔가 생성자 아닌거 같아요. 라고 말하고싶다. set은 언제 어디서나 할수 있는거니까... 뭐 적당히 이해합시다!

그래서 이거보다 좋은게 빌더 패턴이라고 합니다.
public class 학생{
    private int 학번;
    private String 이름;
    private int 나이;
    private int 국어;
    private int 영어;
    private int 수학;
    
    public static class Builder{
        private final int 학번;
        private final String 이름;
        private int 나이=0;
        private int 국어=0;
        private int 영어=0;
        private int 수학=0;
        
        public Builder(int 학번, String 이름){
            this.학번=학번;
            this.이름=이름;
        }
        
        public Builder 나이(int 나이){
            this.나이=나이;
            return this;
        }
        .
        .
        .
    
        public 학생 build(){
            return new 학생(this);
        }
    }
    public 학생(Builder b){
        this.학번=b.학번;
        this.이름=b.이름;
        this.나이=b.나이;
        this.국어=b.국어;
        this.영어=b.영어;
        this.수학=b.수학;
    }
    public static void main(String[] args) {
        학생 나=new 학생.Builder(1, "이름").나이(20).국어(92).영어(12).수학(89).build();
    }
}

요런 꼬라지로 쓸수 있대요
학번과 이름은 무조건 있어야되는 인자, 나이, 국어, 영어, 수학 은 필요에따라 입력할수 있는 내용이다.

저런식으로 만들어두면 나중에 국/영/수 이외에도 기타등등의 과목점수, 추가로 사진이라던가 여러가지의 정보를 새로 추가할때마다 생성자를 새로만들 필요가 없다.
키와 몸무게 라는 인자를 추가한다면 '학생'클레스에서 키와 몸무게를 추가해주고, Builder에 키와 몸무게를 추가한다음 키와 몸무게 메소드를 만들어주면된다.


흠.. 뭔가 좋아 보이긴한데 쓸일이 있을까 싶네요
생성자 매개변수가 4개이상이고 앞으로 매개변수가 늘어날 가능성이 있다. 싶을때 사용하면 좋다고 합니다.
Posted by 동적할당
: