bhlee chapter 07 Behavior - JAVACAFE-STUDY/2019-implementation-patterns GitHub Wiki
์ถ์ฒ: ์ผํธ๋ฒก์ ๊ตฌํํจํด 7์ฅ ํ์
์ปดํจํฐ๋ ๋ช
๋ น์ด๋ฅผ ์์๋๋ก ํ๋์ฉ ์ํํ๋ค.
์ด๋ฌํ ํ๋ก๊ทธ๋จ์ ํ์(Behavior)๋ฅผ ํํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณธ๋ค.
-
์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํด ํน์ ์ํ์์๋ง ์ฝ๋๋ฅผ ์ํํ ์ ์๋ค.
-
๋ฃจํ๋ฅผ ์ฌ์ฉํด ๋ฐ๋ณต์ ์ผ๋ก ์ฝ๋๋ฅผ ์ํํ ์ ์๋ค.
-
๋ฉ์์ง๋ฅผ ์ฌ์ฉํด ์๋ธ๋ฃจํด์ ์ํํ ์ ์๋ค.
-
์์ธ๋ฅผ ์ฌ์ฉํด ํ์ฌ ํ๋ฆ์ ๋ฒ์ด๋(pop) ์ด์ ์คํ์ ์ํํ ์ ์๋ค.
-
ํ๋ก๊ทธ๋จ์ ๊ณผ์ ์ด ์ด๋์ ์์ํ๊ณ ์ด๋์ ๋๋๋์ง์ ๋ํ ์ฃผ์ ํ๋ฆ์ ๋ช ํํ ํํํด์ผํ๋ค.
-
ํ์น ์์ ์ํฉ์ด๋ ์๋ฌ ์ํฉ์ ์์ธ์ ์กฐ๊ฑด์ ์ ์ฌ์ฉํด์ ํํํ๋ฉด ๋๋ค.
-
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ข์ ์ ์ค ํ๋๋ ๊ฐ์ ํ๋ก์์ ๋ฅผ ์ฌ์ฉํด๋ ๋ ํ๋ถํ ๋ด์ฉ์ ์ ๋ฌํ ์ ์๋ค๋๊ฒ์ด๋ค.
-
์๋ ์ฝ๋๋ **"์ฐ์ฐ ๊ณผ์ ์ 3๋จ๊ณ์ด๋ฉฐ, ์ง๊ธ ๋น์ฅ ์์ธํ ๋ด์ฉ์ ์ ํ์๋ ์๋ค"**๋ ๋ป์ ๊ฐ๊ณ ์๋ค.
compute() { input(); process(); output(); }
-
๋ฉ์์ง๋ฅผ ์ ์ด ํ๋ฆ์ ๋ฉ์ปค๋์ฆ์ผ๋ก ์ฌ์ฉํ๋ฉด ํ๋ก๊ทธ๋จ์์๋ ์ํ์ ๋ณํ๊ฐ ์ค์ํด์ง๋ค.
-
์๋์ ๋คํ์ ๋ฉ์์ง๋ฅผ ์ฌ์ฉํ๋ฉด ๋ช ์์ ์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉ์ ํฌ๊ฒ ์ค์ผ ์ ์์ผ๋ฉฐ, ์ถํ ํ์ฅ์ด ์ฝ๋ค.
public void displayShape(Shape subject, Brush brush) { brush.display(subject); }
-
์์ ๊ฐ์ด ์ ํ ๋ฉ์์ง๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด, ์ฝ๋๋ฅผ ์ฝ์ ๋ ์ฐ์ฐ์ ์ธ๋ถ ๊ตฌํ์ ์ดํดํ๊ธฐ ์ํด ์ฌ๋ฌ ๊ฐ์ ํด๋์ค๋ฅผ ์ดํด๋ด์ผ ํ๋ค.
-
์ ํ ๋ฉ์์ง๊ฐ ์ผ์ฐจ์์ ๋ณํ์ ์ ํฉํ๋ฐ,
<script src="https://gist.github.com/libliboom/4abf138ef543a44e90a8cc5a22525ecc.js"></script>
๋ ๊ฐ์ง์ ๋ ๋ฆฝ์ ์ธ ์ฐจ์์์์ ๋ณํ์ ํํํ๊ธฐ ์ํด์๋ 2๊ฐ์ ์ ํ ๋ฉ์์ง๋ฅผ ์ง๋ ฌ๋ก ์ฐ๊ฒฐํด์ผ ํ๋ค.
-
์ฌ๋ฌ ๋จ๊ณ๋ก ๊ตฌ์ฑ๋ ๋ณต์กํ ์๊ณ ๋ฆฌ์ฆ์ด ์๋ค๋ฉด, ๊ด๋ จ๋ ๋จ๊ณ๋ค์ ๋ชจ์ผ๊ณ ์ด๋ฅผ ์ํํ๊ธฐ ์ํด ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ์ ์๋ค.
-
๋ฉ์์ง์ ๋ชฉ์ ์ ๊ตฌํ์ด ์๋, ํจ์๋ฅผ ๋๋ ๋ค ๊ทธ ๋๋์ด์ง ์ผ๋ถ ํญ๋ชฉ์ ํธ์ถํ๊ธฐ ์ํ ๋๊ตฌ์ผ๋ฟ์ด๋ค.
-
๋ถ๋ฆฌ๋ ๋ฉ์ธ์ง์ ์ด๋ฆ์ ์ฝ๋๋ฅผ ๋ณด๊ณ ์ด๋ฆ๋ง์ผ๋ก ์ดํ ๋จ๊ณ์์ ์ด๋ค ์ผ์ด ์ผ์ด๋๋์ง ์ ์ ์๋๋ก ์ง์ด์ผ ํ๋ค.
-
์๋์ ๊ฐ์ด ๋์นญ์ฑ์ ์ด์ฉํ๋ฉด ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์๋ค.
void compute() { input(); process(helper); // vs helper.process(this); output(); } void process(Helper helper) { helper.process(this); }
-
๋์นญ์ฑ๊ณผ ๊ฐ์ "๋ฏธํ์ "์ธ ์์๋ ์ฝ๋ ํจํด ๋งํผ์ด๋ ์ฝ๋ ํ์ง์ ํฅ์์ ๋๋ชจํ ์ ์๋ ์ค์ํ ์์์ด๋ค.
-
ํ์ํด๋์ค์ ์ด๋ค ์ฐ์ฐ์ ๋ณํ์ํฌ ์ ์์์ ์ ๋ฌํ๊ธฐ ์ํด ์ ๋นํ ์ด๋ฆ์ ๋ฉ์์ง๋ก ์๋ ค์ฃผ๋๊ฒ์ด ์ข๋ค. (jdk or sdk ์์ ์ฐพ์ ๋ณด๊ธฐ)
-
์ด๋ฆ์ผ๋ก ๋ฉ์์ง๋ฅผ ๋ณํ ๊ฐ๋ฅ์ฑ์ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๊ธฐ ์ด๋ ต๋ค๋ฉด ์ถ์ ๋ฉ์๋ ์ ์ธ์ ๊ณ ๋ คํด์ผํ๋ค.
-
์ํํธ์จ์ด ๊ฐ๋ฐ์์ ๊ฐ๋ฐ์์ ์๋์ ๊ตฌํ์ ๊ตฌ๋ถํ๋ ๊ฒ์ ์ธ์ ๋ ์ค์ํ๋ค.
-
์๋์ ๊ฐ์ด ํ์ค๋ก ๋ ์ฝ๋์ ์ฃผ์์ ๋ถ์ด๊ณ ์ถ์ ๊ฒฝ์ฐ, ์ปค๋ฎค๋์ผ์ด์ ์ ์ํด ์ค๋ช ๋ฉ์์ง ์ฌ์ฉ์ ๊ณ ๋ คํด์ผ ํ๋ค.
// example flags |= LOADED_BIT; // ๋ก๋ ๋นํธ๋ฅผ ์ค์ // recommend setLoadedFlag();
-
์์ธ ํ๋ฆ์ ์ฃผ์ ํ๋ฆ์ ๋ช ๋ฃ์ฑ์ ํผ์ํ์ง ์๋ ๋ฒ์ ๋ด์์ ์กฐ๊ฑด์ ์ด๋ ์์ธ๋ฅผ ์ฌ์ฉํด ํํํ๋ค.
-
๋ค์ํ ์ํ ๊ฒฝ๋ก๋ฅผ ๋๋ฑํ๊ฒ ํํํ๋ฉด ํ๋ก๊ทธ๋จ์ ํ๋๊ทธ๊ฐ ๋๋ฌดํ๊ณ ํน๋ณํ ์๋ฏธ๋ฅผ ๊ฐ์ง ๊ฐ๋ค์ ๋ฐํํด์ผ ํ๋ค.
-
์๋์ ๊ฐ์ด ๋ณดํธ์ ์ ์ฌ์ฉํ๋ฉด ๊ฐ๋จํ ์ง์ญ์ ์์ธ ์ํฉ์ ์ง์ญ์ ์ธ ๋ณํ๋ง์ ์๋ฐํ๋ฉฐ ํํํ ์ ์๋ค.
void initialize() { if(!isInitialized()) { ... // then ์ ํด๋น ํ๋ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ } // else ์กฐ๊ฑด์ ์ฐพ๊ฒ ๋๋ค. } void initialize() { if(isInitialized()) return ; // ์ด๊ธฐํ๊ฐ ๋ ๊ฒฝ์ฐ // ์ด๊ธฐํ๊ฐ ๋์ง ์์ ๊ฒฝ์ฐ // (์ด๊ธฐํ ๋ฉ์๋๊ฐ ์ฌ๋ฌ๋ฒ ํธ์ถ๋๋ ์ค์ ์ด๊ธฐํ๋ ๋จ ํ๋ฒ๋ง ์ํ) // (์ด๊ธฐํ๊ฐ ์ํ๋๋ ์ฝ๋๊ฐ ์ ์ด ํ๋ฆ์์ ์ค์ํ ๋ถ๋ถ์ ์ฐจ์งํ๋ ๊ฒฝ์ฐ) }
-
if-then-else๋ ๋๋ฑํ ์ค์์ฑ์ ๊ฐ๊ณ ์๋ ์ ์ด ํ๋ฆ์ ํํํ๋ค.
-
๋ณดํธ์ ์ ํ ์ชฝ์ ์ ์ด ํ๋ฆ์ด ๋ค๋ฅธ ์ชฝ๋ณด๋ค ์ค์ํ ๊ฒฝ์ฐ ์ ์ฉํ๋ค.
-
์ฌ๋ฌ๊ฐ์ ์กฐ๊ฑด์ด ์๋ ๊ฒฝ์ฐ ๋ณดํธ์ ์ ์ฌ์ฉํ๋ฉด ๋ณต์กํ ์ ์ด ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ ๊ตฌํํ ์ ์๋ค.
<script src="https://gist.github.com/libliboom/d7d7f24b759e608f130bc96488c29934.js"></script> <script src="https://gist.github.com/libliboom/b11e7c1ac6079ae1299a4d1ab3e6b2c5.js"></script>
-
์คํ ์์์ ํ์ฐธ ์์ชฝ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๋ฉด(๋์คํฌ๊ฐ ๊ฐ๋์ฐจ๊ฑฐ๋ ๋คํธ์ ์ฐ๊ฒฐ์ด ๋์ด์ง ๊ฒฝ์ฐ) ์ด๋ฐ ๋ฌธ์ ๋ ์คํ์ ํ์ฐธ ์๋์ชฝ์์ ํด๊ฒฐํ๋๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ค.
-
์์ธ๋ฅผ ๋ฐ๊ฒฌํ ์ชฝ์์๋ ์์ธ๋ฅผ ๋์ง๊ณ , ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ์ชฝ์์ ์์ธ๋ฅผ ๋ฐ๋ ํธ์ด ๊ทธ ์ฌ์ด์ ๋ชจ๋ ์ฝ๋์์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ์ง๋ ๋ชปํ๋ฉด์ ์์ธ๋ฅผ ์ฒดํฌํ๊ณ ์ ๋ฌํ๋ฉฐ ์ฝ๋๋ฅผ ์ง์ ๋ถํ๊ฒ ํ๋ ๊ฒ๋ณด๋ค๋ ํจ์ฌ ๋ซ๋ค. (์ฝ๋ ์์ ์ฐพ์๋ณด๊ธฐ)
-
์กฐ๊ฑด์ ๊ณผ ๋ฉ์์ง๋ก ๊ตฌํํ ์ ์๋ ์ฝ๋๋ฅผ ์์ธ๋ก ๊ตฌํํ๋ฉด ๋จ์ ์ ์ด ํ๋ฆ ๊ตฌ์กฐ ์ด์ธ์ ์ด๋ค ์ผ์ด ๋ฒ์ด์ง๋์ง ์์๋ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ฅผ ์ฝ๊ณ ์ดํดํ๊ธฐ๊ฐ ํจ์ฌ ์ด๋ ต๋ค.
-
๊ฐ๋ฅํ๋ฉด ์์ฐจ์ ๊ตฌ๋ฌธ, ๋ฉ์์ง, ๋ฃจํ, ์ ์ด๋ฌธ ์ค์์ ์ ํธํ๋ ๋ฐฉ์์ผ๋ก ์ ์ด ํ๋ฆ์ ํํํ๊ณ ์ด ๋ฐฉ๋ฒ์ด ์ฃผ์ ํ๋ฆ์ ์ดํด๋ฅผ ๋ฐฉํดํ๋ ๊ฒฝ์ฐ์๋ง ์์ธ๋ฅผ ์ฌ์ฉํ๋๊ฒ์ด ์ข๋ค.
-
Unchecked ์์ธ๋ฅผ ๋์ก์ ๋ ์๋ฌด๋ ๊ทธ ์์ธ๋ฅผ ๋ฐ์ง ์๋ ๊ฒฝ์ฐ ํ๋ก๊ทธ๋จ ์ํ์ ์ข ๋ฃ๋๋ค. ๋ฐ๋ผ์ ์ฌ์ฉ์์๊ฒ ์ด๋ค ์ผ์ด ์ผ์ด๋ฌ๋์ง ์๋ ค์ฃผ๊ธฐ ์ํ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๋ ํธ์ด ์ข๋ค.
-
Checked ์์ธ๋ ์ปดํ์ผ๋ฌ์ ์ํด ์ฒดํฌ๋๊ธฐ ๋๋ฌธ์ ๊ทธ ์์ธ๋ฅผ ๋ฐ๊ฑฐ๋ ๋ค๋ฅธ ํด๋์ค๋ก ๋ ๊ฒจ์ค์ผ ํ๋ค.
- ํ์ ์์ค์ ์์ธ๋ ๋ฌธ์ ๋ฅผ ์ง๋จํ๋๋ฐ ์ ์ฉํ ์ ๋ณด๋ฅผ ์ ๊ณตํด์ฃผ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๊ธฐ๋๋ฌธ์ ํ์ ์์ค ์์ธ๋ฅผ ๋ฌธ์ ํด๊ฒฐ์ ๋์๋๋ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ ์ ์๋ ์์ ์์ค ์์ธ๋ก ํฌ์ฅํด ์ฌ์ฉํ๋ฉด ์ข๋ค. (์ฝ๋ ์์ ์ฐพ์๋ณด๊ธฐ)