๋จ์ ๊ตฌํ์ ๋์ด์
๋ ์ข์ ์ฝ๋๋ฅผ ๋ง๋ค๊ณ ์ถ์ ๋ชจ๋ ๊ฐ๋ฐ์์๊ฒ ๐
๋ฆฌํฉํ ๋ง
์ฝ๋์ ๊ธฐ๋ฅ์ ์ ์งํ๋ฉด์ ํด๋์ค, ํจ์, ํ๋์ฒ๋ผ ์ฌ๋ฌ ํ๋ก๊ทธ๋๋ฐ ์์๋ฅผ ๋ณ๊ฒฝํ์ฌ ๋ ๋์
์ฝ๋๋ก ๊ฐ์ ํ๋ ๊ณผ์ ๋๋ ๊ทธ๋ฌํ ๊ธฐ์ ์ ๋งํฉ๋๋ค. ๋ฆฌํฉํ ๋ง์ ํ์ตํ๊ณ ์ ์ฉํ๋ค๋ฉด
๋๊ฐ์ด ๋์ํ๋ ์ฝ๋๋ ๋ณด๋ค ๋ ์ดํดํ๊ธฐ ์ฝ๊ณ ์ ์ฐํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
์ด๋ฌ๋ ์ฝ๋๋ฅผ
์ด๋ ๊ฒ ๋ง๋ค๋ฉด ์กฐ๊ธ ๋ ์ฝ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ๋ฆฌํฉํ ๋ง์
๋ฐฐ์์ผ ํ๋ ์ด์
์ฒ์์๋ ๋ณํ์ง ์์ ๊ฒ ๊ฐ์๋ ๊ฐ์ ๊ณผ ์ต์ ์ด๋ผ๊ณ ์๊ฐํ๋ ์ฝ๋๋ ์๊ฐ์ด ์ง๋๊ณ , ํ๊ฒฝ์ด ๋ฐ๋๊ณ , ๊ธฐ์ ์ด ๋ฐ์ ํ๋ค ๋ณด๋ฉด "์ฝ๋๋ฅผ ๋๋์ฒด ์ ์ด๋ ๊ฒ ์ง ๊ฑฐ์ง?"๋ผ๋ ์ด์ผ๊ธฐ๋ฅผ ํ๊ธฐ ์ญ์์
๋๋ค.
๋ฆฌํฉํ ๋ง์์ ๋ค๋ฃจ๋ ์ด 24๊ฐ์ ์ฝ๋ ๋์๋ฅผ ํตํด ๊ทธ๋ฌํ ์ฝ๋๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ๊ณผ 43๊ฐ๊ฐ ๋๋ ๋ฆฌํฉํ ๋ง ๊ธฐ์ ์ ํตํด ์ฝ๋๋ฅผ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ํ์ตํ ์ ์์ต๋๋ค.
์ฅ๋ดํ๊ฑด๋ฐ, ์ด ์์
์ดํ ์ฌ๋ฌ๋ถ์ ์ฝ๋๋ฅผ ๋ค์ ๋ณด์ ๋ค๋ฉด ๋ถ๋ช
๋ ๋์ ์ฝ๋๋ก ๊ณ ์น ์ ์์ ๊ฒ๋๋ค.
์ฝ๋ ์์ฐ์ฑ์
๋๋ฆฌ๊ณ ์ถ๋ค๋ฉด
IntelliJ
์ธํ
๋ฆฌ์ ์ด์ ๊ฐ์ ํตํฉ ๊ฐ๋ฐ ํ๊ฒฝ (IDE)์ ๋จ์ํ ํธ์ง๊ธฐ์ ๋ฌ๋ฆฌ ๊ณ ๋์ ์ฐ์ฐ๊ณผ ๋ถ์ ๊ธฐ๋ฅ์ผ๋ก
์ฝ๋ ๋ฆฌํฉํ ๋ง์ ๋์์ด ๋๋ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์์ต๋๋ค.
์ด ๊ฐ์์์ ์๊ฐํ๋ ๊ธฐ๋ฅ๋ค์ ํ์ฉํ๋ค๋ฉด ์ฌ๋ฌ๋ถ์ ์ฝ๋ ์์ฐ์ฑ๋ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๋ฆฌํฉํ ๋ง์ด
ํ์ํ ์ฌ๋์?
๊ธฐ์ด ๋ฌธ๋ฒ์ ๋ฐฐ์ ๋๋ฐ
์ด์ ๋ญ ํด์ผ ํ์ง?
์ง๊ธ๋ณด๋ค
๋ ๋์ ๊ฐ๋ฐ์๋ก
์ฑ์ฅํ๊ณ ์ถ๋ค๋ฉด?
๋ ์ข์ ์ฝ๋๋ก
๊ฐ์ ํ๊ณ ์ถ์๋ฐโฆ
๋์๋๋ ์ฝ๋๋ฅผ
์ด๋ป๊ฒ ๊ฐ์ ํ๋์ง
์๊ณ ์ถ๋ค๋ฉด?
์ธํ
๋ฆฌ์ ์ด๋ฅผ
๋ ์ ์ฐ๊ณ ์ถ์๋ฐโฆ
๋ฆฌํฉํ ๋ง ๊ธฐ๋ฅ์ 100%
ํ์ฉํ๊ณ ์ถ๋ค๋ฉด?
๋ฆฌํฉํ ๋ง?
์ค์ ๋ก ๋ณด๊ณ ์ถ์๋ฐโฆ
๊ธ๋ก ์ฝ๋ ๋ฆฌํฉํ ๋ง
๋ง๊ณ ๋ณด๋ฉด์
๋ฐฐ์ฐ๊ณ ์ถ๋ค๋ฉด?
- ์ํํ ๊ฐ์ ์๊ฐ์ ์ํด์๋ ์๋ฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ํ ์ดํด๊ฐ ํ์ํฉ๋๋ค.
- ์๋ฐ์ ์ธํ
๋ฆฌ์ ์ด๋ฅผ ์ฌ์ฉํด์ ๋ฆฌํฉํ ๋ง์ ์๊ฐํ๊ณ ์์ง๋ง ํน์ ์ธ์ด๋ IDE์ ์ข
์๋๋ ๋ด์ฉ์ ์๋๋๋ค. ์ด๋ค ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ๋น์ทํ ๋ฌธ์ ๋ฅผ ๊ฒช์ ์ ์์ผ๋ฉฐ, ํตํฉ ๊ฐ๋ฐ ํ๊ฒฝ (IDE)์ด๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฐ๋ฐ ๋๊ตฌ๋ผ๋ฉด ๋ง๋
ํ ์ด ์์
์์ ์๊ฐํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ถ๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์, ์ฌ๋ฌ๋ถ์ด ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ IDE๋ฅผ ์ฌ์ฉํ๋ฉฐ ์ด ์์
์ ์๊ฐํ ์ ์์ต๋๋ค.
์ฝ๋ฉ์ผ๋ก ํ์ตํ๋
๋ฆฌํฉํ ๋ง
์ด ๊ฐ์์์๋ ์ด 24๊ฐ์ ์ฝ๋ ๋์์ ๊ฐ ๋์๋ฅผ ํด๊ฒฐํ ์ ์๋ ์ฌ๋ฌ ๋ฆฌํฉํ ๋ง ๊ธฐ์ ์ ๋ค๋ฃจ๊ณ ์์ต๋๋ค.
๊ฐ ๋ฆฌํฉํ ๋ง ๊ธฐ์ ์ IntelliJ๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ ๊ทน์ ์ผ๋ก ํ์ฉํ๋ฉฐ, ์ฌ๋ฌ๋ถ์ด ์ง์ ์ค์ตํ ์ ์๋๋ก ์์ ์ฝ๋๋ฅผ ์ ๊ณตํ๊ณ ์์ต๋๋ค.
- ์ด์ํ ์ด๋ฆ (Mysterious Name)
- ์ค๋ณต ์ฝ๋ (Duplicated Code)
- ๊ธด ํจ์ (Long Function)
- ๊ธด ๋งค๊ฐ๋ณ์ ๋ชฉ๋ก (Long Parameer List)
- ์ ์ญ ๋ฐ์ดํฐ (Global Data)
- ๊ฐ๋ณ ๋ฐ์ดํฐ (Mutable Data)
- ๋ค์ํจ ๋ณ๊ฒฝ (Divergent Change)
- ์ฐํ์ด ์์ (Shotgun Surgery)
- ๊ธฐ๋ฅ ํธ์ (Feature Envy)
- ๋ฐ์ดํฐ ๋ญ์น (Data Clumps)
- ๊ธฐ๋ณธํ ์ง์ฐฉ (Primitive Obsession)
- ๋ฐ๋ณต๋๋ swtich ๋ฌธ (Repleated Swtiches)
- ๋ฐ๋ณต๋ฌธ (Loops)
- ์ฑ์ ์๋ ์์ (Lazy Element)
- ์ถ์ธก์ฑ ์ผ๋ฐํ (Speculative Generality)
- ์์ ํ๋ (Temporary Field)
- ๋ฉ์์ง ์ฒด์ธ (Message Chains)
- ์ค์ฌ์ (Middle Man)
- ๋ด๋ถ์ ๊ฑฐ๋ (Insider Trading)
- ๊ฑฐ๋ํ ํด๋์ค (Large Class)
- ์๋ก ๋ค๋ฅธ ์ธํฐํ์ด์ค์ ๋์ ํด๋์ค๋ค (Alternative Classes with Different Interfaces)
- ๋ฐ์ดํฐ ํด๋์ค (Data Class)
- ์์ ํฌ๊ธฐ (Refused Beques)
- ์ฃผ์ (Comments)
๋ชจ๋ ๊ฐ๋ฐ์์ ํ๋
์
๋ฆฌํฉํ ๋ง
๋ฆฌํฉํ ๋ง์ 1999๋
์ 1ํ์ ์ถํํ๊ณ 2018๋
์ 2ํ์ด ๋์์ผ๋ฉฐ GoF์ ์ ์ใ๋์์ธ ํจํดใ๊ณผ ๋๋ถ์ด
๋ชจ๋ ๊ฐ๋ฐ์์๊ฒ ์ถ์ฒํ๋ ํ๋
์ ์ค ํ๋์
๋๋ค.
๊ณผ๊ฑฐ์ ์ง๊ธ, ๊ทธ๋ฆฌ๊ณ ์์ผ๋ก๋ ์
๋ฌด์์ ์ธ์ ๋ ์ ์ฉํ๊ฒ ์ฐ์ผ ๊ธฐ์ ์ด๋ ๊ผญ ํ์ตํ์๊ธฐ ๋ฐ๋๋๋ค.
- ํด๋น ๊ฐ์๋ ๋งํด ํ์ธ๋ฌ์ ์ ์ ์ใ๋ฆฌํฉํ ๋งใ์ ์ฐธ๊ณ ํด ๋ง๋ค์์ต๋๋ค. ๊ฐ๋ฐ์๋ก์์ ์ฑ์ฅ์ ์ํด ์ด ์ฑ
์ ์ฝ๋ ๊ฒ์ ๊ถ์ฅํ๊ณ ์์ผ๋, ๊ฐ์ ์๊ฐ์ ์ํด ์ฑ
์ ๊ตฌ๋งคํ์ค ํ์๋ ์์ต๋๋ค.
์ด ๊ฐ์๊ฐ ๋ฆฌํฉํ ๋ง ์ฑ
๊ณผ ๋ค๋ฅธ ์
- ๋ฆฌํฉํ ๋ง ์ฑ
์ ๊ฐ ์ฝ๋ ๋์๋ฅผ ๊ฐ๋ตํ ๋ค๋ฃฌ ๋ค ์นดํ๋ก๊ทธ๋ณ๋ก ๋ฆฌํฉํ ๋ง ๊ธฐ์ ์ ์์ธํ ๋ค๋ฃน๋๋ค.
ํ์ง๋ง ์ด ๊ฐ์๋ ๋ฌธ์ ์ธ์๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์ด์ด์ง๋๋ก ์ฝ๋ ๋์์ ๊ฐ ๋์๋ฅผ ํด๊ฒฐํ๋๋ฐ ๋์์ด ๋๋ ๋ฆฌํฉํ ๋ง ๊ธฐ์ ์ ์์ธํ ๋ค๋ฃฌ ์ดํ, ๋ฆฌํฉํ ๋ง ์นดํ๋ก๊ทธ๋ฅผ ์ดํด๋ณด๋ฉฐ ๋ณต์ตํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
- ๋ํ ๋ฆฌํฉํ ๋ง 2ํ์ ์์ ์ฝ๋๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์์ฑ๋์ด ์์ผ๋ฉฐ ์๋ฒฝํ ์์ ์ฝ๋๋ฅผ ์ ๊ณตํ์ง ์์ง๋ง, ์ด ๊ฐ์๋ ์๋ฐ๋ก ์์ฑ๋ ์์ ์ฝ๋๋ฅผ ์ ๊ณตํด ์ฌ๋ฌ๋ถ์ด ์ง์ ์ค์ตํ ์ ์๋๋ก ์ค๋นํ์ต๋๋ค.
- ๋ง์ง๋ง์ผ๋ก ์ฑ
์์๋ IDE๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ ๊ฐ์ ํ์ ๋ฆฌํฉํ ๋ง ๋ฐฉ๋ฒ์ ์ค๋ช
ํ์ง๋ง, ํ์ค์ ์ผ๋ก ์๋ฐ ๊ฐ๋ฐ์ ์ค 90%์ ๊ฐ๊น์ด ๊ฐ๋ฐ์๊ฐ IDE๋ฅผ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด ๊ฐ์๋ ์ธํ
๋ฆฌJ์ ๊ธฐ๋ฅ์ ์ ๊ทน์ ์ผ๋ก ํ์ฉํ๋ฉฐ ๋ณด๋ค ์ค์ฉ์ ์ธ ๋ฆฌํฉํ ๋ง์ ์๊ฐํ๊ณ ์์ต๋๋ค.
์์ ์ง๋ฌธ Q&A
Q. ๊ฐ๋ฐ์๋ผ๋ฉด ๋ฆฌํฉํ ๋ง์ ๊ผญ ํ์ตํด์ผ ํ๋์?
A. "์ด๋ป๊ฒ๋ ๋์ํ๊ธฐ๋ง ํ๋ฉด ๋๋ค."๊ฐ ์๋๋ผ "์ด๋ป๊ฒ ํ๋ฉด ๋ ์ข์ ์ฝ๋๋ก ๋์ํ๊ฒ ๋ง๋ค ์ ์์๊น?"๋ฅผ ๊ณ ๋ฏผํ๋ ๊ฐ๋ฐ์๋ผ๋ฉด ๋ฆฌํฉํ ๋ง์ ๋ฐ๋์ ํ์ตํด์ผ ํฉ๋๋ค. ์ด ๊ฐ์์์ ๋ค๋ฃจ๋ ๊ธฐ์ ์ ์ฌ๋ฌ๋ถ์ด ์์ฑํ๋ ์ฝ๋ ํ์ง์ ํฅ์์ํค๋๋ฐ ๋ง์ ๋์์ ์ค ๊ฒ์
๋๋ค.
Q. ๋ฆฌํฉํ ๋ง์ ์ธ์ ํด์ผ ํ๋์? ์ค๋ฌด์์ ๋ฆฌํฉํ ๋ง์ ํ ์๊ฐ์ด ์์ด์.
A. ๋ฆฌํฉํ ๋ง์ ์๊ฐ์ ์ ํด๋๊ณ ํด๋ ์ข๊ณ , ์๋ก์ด ์ฝ๋๋ฅผ ์์ฑํ ๋ ๋๋ ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํ์ฌ ๊ธฐ๋ฅ์ ๊ฐ์ ํ๊ฑฐ๋ ๋ณ๊ฒฝํ ๋ ๊ฐ์ด ์งํํ ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ ์
๋ฌด ์ค์ ์์ฃผ ์ฌ์ฉํ๋ ํด๋์ค๊ฐ ์๋๋ฐ 5๋
๊ฐ ์ด๊ฒ์ ๊ฒ ์์ด๋ค ๋ณด๋ ๋๋ฌด ์ปค์ก๋ค๋ ์๊ฐ์ด ๋ค ์ ๋๋ก ์ฝ๋ ๋์๊ฐ ๋๊ธฐ ์์ํ์ต๋๋ค. ํด๋น ์
๋ฌด๋ฅผ ๋ง์น๊ณ ์๊ฐ์ ์กฐ๊ธ ๋ด์ "๋ฉ์๋ ์ถ์ถํ๊ธฐ"์ "๋ฉ์๋ ๋งค๊ฐ๋ณ์ํํ๊ธฐ"๋ฅผ ํตํด ์๋น์์ ์ค๋ณต ์ฝ๋๋ฅผ ์ ๊ฑฐํ๊ณ ์กฐ๊ธ ๋ ์ฝ๊ธฐ ์ข์ ์ฝ๋๋ฅผ ๋ง๋ค์ด ๋ณด๋ด๊ณ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค. ํ๋ฒ์ ํฌ๊ฒ ๋ณ๊ฒฝํ๊ธฐ๋ณด๋ค๋ ์กฐ๊ธ์ฉ ์์ฃผ ํ๋ค๋ณด๋ฉด ์๊ฐ์ ์ค๋ ๋ค์ด์ง ์์๋ ์กฐ๊ธ์ฉ ๊ฐ์ ํ ์ ์์ต๋๋ค.
Q. ์๋ฐ ๊ธฐ์ด๋ง ๊ณต๋ถํ ์ํ์ธ๋ฐ ์ด ๊ฐ์๋ฅผ ์๊ฐํด๋ ๋ ๊น์?
A. ๋ค, ์๋ฐ ๊ธฐ์ด๋ฅผ ํ์ตํ๋ค๋ฉด ๋ณธ ๊ฐ์๋ฅผ ์๊ฐํ ์ ์์ต๋๋ค. ํนํ, ์ธํ
๋ฆฌJ ์ฌ์ฉ์ ์ต์ํ์ง ์์ ๋ถ๋ค์ด๋ผ๋ฉด ์ด ๊ฐ์์์ ์๊ฐํ๋ ์ธํ
๋ฆฌJ์ ๋ฆฌํฉํ ๋ง ๊ธฐ๋ฅ์ ๊ผญ ์ตํ๊ณ ์
๋ฌด์์ ํ์ฉํ์๊ธฐ ๋ฐ๋๋๋ค. ์ฌ๋ฌ๋ถ์ ์์ฐ์ฑ์ ํฅ์์์ผ์ค ์ ์๋ ๋ง์ ํ๋ค์ด ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค.
Q. ๊ฐ์์ ๋์ด๋๋ ๋ฐฉ์์ด ์ ์๊ฒ ๋ง์์ง ๊ถ๊ธํฉ๋๋ค.
A. ์ด ๊ฐ์์์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ก "์ดํดํ๊ธฐ ํ๋ ์ด๋ฆ", "ํจ์ ์ ์ธ ๋ณ๊ฒฝํ๊ธฐ", ๊ทธ๋ฆฌ๊ณ "๋ณ์ ์ด๋ฆ ๋ณ๊ฒฝํ๊ธฐ" ์์
์ ๊ณต๊ฐํด ๋์์ต๋๋ค. ์๊ฐ ์ ๊ฐ์๋ฅผ ๋ฏธ๋ฆฌ ๋ค์ด๋ณด์ ํ ์ด๋ฐ ๋ฐฉ์์ ๊ฐ์ ์งํ์ด ๋ณธ์ธ์๊ฒ ๋์์ด ๋ ์ง ํ๋จํด์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
๋ง์ดํฌ๋ก์ํํธ ์๋์ด ๊ฐ๋ฐ์์๊ฒ ๋ฐฐ์ฐ๋ ๋ฆฌํฉํ ๋ง!
"๊ฐ๋ฐ์๋ก ์ผ์ ํ๋ค ๋ณด๋ฉด ํ ๋ฒ์ฏค์ ์ฝ๋๋ฅผ '๋ฅ'์ ๋น์ ํ๋ ๋ง์ ๋ค์ด๋ณด์
จ์ ๊ฒ๋๋ค. ์ด๋ฐ ์ฝ๋๋ค์ ์
๋ฌด์ฒ๋ฆฌ๋ฅผ ๋๋๊ฒ ๋ง๋ค๊ณ ์๊ตฌ์ฌํญ์ ๋ณ๊ฒฝ์ ๋์ฒํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
์ด๋ฌํ ์ฝ๋๋ฅผ ๊นจ๋ํ๊ณ ๋ ์์ ํ๊ฒ ์ ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ๋ฆฌํฉํ ๋ง์ด๋ฉฐ, ์ด๋ฅผ ํตํด ๋์ฑ ๊ฐ๋
์ฑ ์ข๊ณ ๋ณํ์ ์ ์ฐํ๊ฒ ๋์ฒ ๊ฐ๋ฅํ ๊ตฌ์กฐ๋ก ์ฝ๋ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ฆฌํฉํ ๋ง์ผ๋ก ์ฌ๋ฌ๋ถ ํ๋ก์ ํธ์ ์ฝ๋๋ฅผ ์๋ฆ๋ต๊ฒ ๊ฐ๊ฟ๋ณด์๊ธธ ๋ฐ๋๋๋ค."