티스토리 뷰

요즘 Effective Java 2/E 라는 책을 구입하고 읽고있다.


읽어보면서 다른사람들과 공유하면 좋겠다라는 내용들이 있어서 생각날때마다 하나씩 포스팅 하려고 한다.


책에 나온 내용을 바탕으로 내가 이해한 대로 다시 포스팅 하는거라서 저자가 의도한 것과는 다른내용이 있을수도 있다a


책의 내용이 궁금한 사람들은 직접 구입해서 읽어보면 좋을꺼 같다.ㅎ


오늘의 포스팅 내용은 Builder 패턴이라는 것이다.


Builder 패턴은 다음과 같은 모양의 패턴이다.



그렇다면 이러한 Builder 패턴은 어떠한 상황에서 쓰면 좋을까??


책에서는 Builder 패턴을 다음과 같은 상황에서 쓰라고 추천한다.


상황. 만약 당신이 만드는 클래스 중에 생성자 인자가 많은 클래스가 있다면 생성자대신에 Builder 패턴을 사용하라!


예를 들면 다음과 같다. 


코드를 만드는 도중 포장판매 되는 음식에 붙어있는 영양분석표(Nutrition Facts)를 클래스로 만들어야 한다.


그런데 이 녀석은 반드시 표현되야하는 성분들과 음식마다 다르게 나오는 성분들이 존재한다. 


예를들어 총제공량( servingSize ), 1회제공량( serving ) 등은 반드시 나와야하지만


칼로리( calories ), 지방( fat ), 나트륨( sodium ), 탄수화물( carbohydrate ) 등은 선택적으로 나올수도 있고 안나올수도 있는 성분이다. 


그렇다면 이러한 성격을 갖고 있는 영양분석표(Nutrition Facts)를 클래스로 만들때 어떻게 하면 좋을까?


일반적으로는 점층적 생성자 패턴( telescoping constructor pattern )을 적용한다. 


여기서 잠깐! 점층적 생성자 패턴( telescoping constructor pattern )은 어떤녀석인가?


점층적 생성자 패턴은 필수 인자만 받는 생성자를 하나 정의하고 선택적 인자를 하나 받는 생성자를 추가하고,


거기에 두개의 선택적 인자를 받는 생성자를 추가하는 식으로 생성자들을 쌓아 올리듯 추가하는 것이다. 


결국 모든 선택적 인자를 다 받는 생성자를 추가하면 정의는 끝나게 된다. 


예제로 보자면 다음과 같은 형태이다.



호출은 경우에 따라 여러가지로 할 수 있지만 여기서는 다음과 같이 한다.


그런데 이러한 점층적 생성자 패턴( telescoping constructor pattern )은 설정할 필요가 없는 필드에도 인자를 전달해야 하는


경우가 생기고 필드가 많아질 수록 읽기 어려운 코드가 되고 만다. 


또 다른 방법으로는 자바빈(JavaBeans) 패턴이다. 


역시나 여기서 잠깐 자바빈(JavaBeans) 패턴이란 인자 없는 생성자를 호출하여 객체부터 만든다음, 


설정 메서드(setter methods)들을 호출하여 필수 필드뿐 아니라 선택적 필드의 값들까지 채우는 것이다. 


예제로 보자면 다음과 같은 형태이다.



호출은 다음과 같이 한다.




이 패턴에는 점층적 생성자 패턴에서 생기던 문제는 없다. 작성해야 하는 코드의 양이 조금 많아질 수 있지만


객체를 생성하기도 쉬우며 읽기도 좋다. 하지만 심각한 단점으로 1회의 함수 호출로 객체 생성을 끝낼 수 없으므로


객체 일관성(Consistency)이 일시적으로 깨질 수 있다는 것이다. 


그래서 이 책에서 저자가 제안하는 패턴은 바로 빌더(Builder) 패턴이다. 


빌더패턴은 필요한 객체를 직접생성하는 대신 먼저 필수 인자들을 생성자(또는 정적 팩터리 메서드) 전부 전달하여 빌더 객체를 만든다. 


그런다음 빌더 객체에 정의된 설정 메서들을 호출하여 선택적 인자들을 추가해 나간다. 


마지막으로 아무런 인자 없이 Build 메서들를 호출하여 객체를 만드는 것이다. 



역시나 호출은 다음과 같이 한다.



이렇게 함으로써 기존의 점측적 생성자 패턴과 자바빈 패턴에서 생겼던 문제들을 해결 할 수 있다.


하지만 빌더패턴 역시 단점이 있다.  


객체를 생성하려면 우선 빌더객체를 생성해야 하고 


다른 패턴들보다 많은 코드를 요구하기 때문에 인자가 충분히 많은 상황에서 이용하는게 좋다. 



책의 내용은 여기까지이다.


책에는 더 자세한 빌더패턴의 좋은 이유들과 내용들이 나오니까 궁금하다면 책을 구입해서 읽어보면 좋을것 같다.

 

누군가에게는 작은도움이 되었기를 바라면서 오늘의 포스팅 끝~ 

댓글