{"componentChunkName":"component---src-templates-post-template-jsx","path":"/history/posts/2020-10-04--003--02","result":{"data":{"site":{"siteMetadata":{"title":"Blog by Eunyoung","subtitle":"작업 기록 블로그","copyright":"© All rights reserved.","author":{"name":"EunYoung","twitter":"#"},"disqusShortname":"","url":"https://ssongey.github.io"}},"markdownRemark":{"id":"af8d73d7-de8f-5492-8cf1-fbb14ccbcf8a","html":"<h2>아이템2) 생성자에 매개변수가 많다면 빌더를 고려하라</h2>\n<p>생성자와 static factory method 의 똑같은 단점은 매개변수가 많을 때 적절히 대응하기 어렵다.<br>\n생성자나 정적 팩터리가 처리해야 할 매개변수가 많다면 빌더 패턴을 선택하는 게 더 낫다.<br>\n매개변수 중 다수가 필수가 아니거나 같은 타입이면 특히 더 그렇다.<br>\n빌더는 점층적 생성자보다 클라이언트 코드를 읽고 쓰기가 훨씬 간결하고, 자바빈즈보다 훨씬 안전하다.</p>\n<h4>점층적 생성자 패턴(telescoping constructor pattern)</h4>\n<ul>\n<li>\n<p>매개변수가 많아지면 클라이언트 코드를 장성하거나 읽기 어렵다. </p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> 생성자<span class=\"token punctuation\">(</span>변수<span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">public</span> 생성자<span class=\"token punctuation\">(</span>변수<span class=\"token number\">1</span><span class=\"token punctuation\">,</span> 변수<span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">public</span> 생성자<span class=\"token punctuation\">(</span>변수<span class=\"token number\">1</span><span class=\"token punctuation\">,</span> 변수<span class=\"token number\">2</span><span class=\"token punctuation\">,</span> 변수<span class=\"token number\">3.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n</li>\n</ul>\n<h4>자바빈즈 패턴(JavaBeans pattern)</h4>\n<ul>\n<li>setter를 이용</li>\n<li>객체 하나를 생성하기 위해선 여러개의 매서드 호출이 필요</li>\n<li>\n<p>객체가 완전히 생성되기 전까지 일관성이 무너진 상태에 놓임</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token class-name\">Coffee</span> coffee <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Americano</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\ncoffee<span class=\"token punctuation\">.</span><span class=\"token function\">setPrice</span><span class=\"token punctuation\">(</span><span class=\"token number\">3000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\ncoffee<span class=\"token punctuation\">.</span><span class=\"token function\">setCapacity</span><span class=\"token punctuation\">(</span><span class=\"token number\">500</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span></code></pre></div>\n</li>\n</ul>\n<h4>빌더 패턴(Builder Pattern)</h4>\n<ul>\n<li>필수 매개변수만으로 생성자 또는 정적 팩터리를 호출하여 빌더 객체를 얻음</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">NutritionFacts</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">private</span> <span class=\"token keyword\">final</span> <span class=\"token keyword\">int</span> servingSize<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">private</span> <span class=\"token keyword\">final</span> <span class=\"token keyword\">int</span> servings<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">private</span> <span class=\"token keyword\">final</span> <span class=\"token keyword\">int</span> calories<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">private</span> <span class=\"token keyword\">final</span> <span class=\"token keyword\">int</span> fat<span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// Builder</span>\n  <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Builder</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">//필수 매개변수</span>\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">final</span> <span class=\"token keyword\">int</span> servingSize<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">final</span> <span class=\"token keyword\">int</span> servings<span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">// 선택적 배개변수 - 기본값으로 초기화</span>\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">int</span> calories <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">int</span> fat <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">Builder</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> servingSize<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> servings<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>servingSize <span class=\"token operator\">=</span> servingSize<span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>servings <span class=\"token operator\">=</span> servings<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">Builder</span> <span class=\"token function\">calories</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> val<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> calories <span class=\"token operator\">=</span> val<span class=\"token punctuation\">;</span> <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">Builder</span> <span class=\"token function\">fat</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> val<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> fat <span class=\"token operator\">=</span> val<span class=\"token punctuation\">;</span> <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">NutritionFacts</span> <span class=\"token function\">build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Nutrition</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n  \n  <span class=\"token keyword\">private</span> <span class=\"token class-name\">NutritionFacts</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Builder</span> builder<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>servingSize <span class=\"token operator\">=</span> builder<span class=\"token punctuation\">.</span>servingSize<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>servings <span class=\"token operator\">=</span> builder<span class=\"token punctuation\">.</span>servings<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>calories <span class=\"token operator\">=</span> builder<span class=\"token punctuation\">.</span>calories<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>fat <span class=\"token operator\">=</span> builder<span class=\"token punctuation\">.</span>fat<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">//사용</span>\n<span class=\"token class-name\">NutritionFacts</span> cocaCola <span class=\"token operator\">=</span> <span class=\"token class-name\">NutritionFacts<span class=\"token punctuation\">.</span>Builder</span><span class=\"token punctuation\">(</span><span class=\"token number\">240</span><span class=\"token punctuation\">,</span> <span class=\"token number\">8</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">calories</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>","fields":{"tagSlugs":["/tags/책리뷰/","/tags/이펙티브자바/"],"slug":"/history/posts/2020-10-04--003--02"},"frontmatter":{"title":"[책리뷰/Effective Java] 객체 생성과 파괴","tags":["책리뷰","이펙티브자바"],"date":"2020-10-04","description":"아이템2) 생성자에 매개변수가 많다면 빌더를 고려하라"}}},"pageContext":{"slug":"/history/posts/2020-10-04--003--02"}},"staticQueryHashes":[]}