
๊ฐ์ฒด ์งํฅ์ ๊ฐ๋
๊ณผ 4๋ ํน์ฑ
์์ 3๊ฐ์ ์ฅ์ ํตํด ๊ฐ์ฒด ์งํฅ์ ๊ฐ๋
๊ณผ 4๋ ํน์ฑ์ ํ์ตํ๋ค. ์ด์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋จ์ ์์ฑํ ์ ์๋ ๋๊ตฌ๋ฅผ ํ๋ํ ๊ฒ์ด๋ค.
์๋ฆฌ๋ก ๋น์ ํ์๋ฉด ๊ฐ์ฒด ์งํฅ์ 4๋ ํน์ฑ์ ์๋ฆฌ๋ฅผ ๋ง๋ค๊ธฐ ์ํ ๋ถ, ๋ฌผ, ์นผ ๋ฑ ์ฃผ๋ฐฉ ๊ธฐ๊ตฌ๋ผ๊ณ ํ ์ ์๋ค.
๊ฐ์ฒด ์งํฅ ์ค๊ณ (Object Oriented Design) 5์์น
์ด ์์น๋ค์ ๊ฐ์๊ธฐ ์๊ธด ๊ฒ์ด ์๋๋ค. ์์ง๋๋ ๋์ด๊ณ (High Cohesion), ๊ฒฐํฉ๋๋ ๋ฎ์ถ๋ผ๋(Loose Coupling)๋ ๊ณ ์ ์์น์ ๊ฐ์ฒด ์งํฅ์ ๊ด์ ์์ ์ฌ์ ๋ฆฝํ ๊ฒ์ด๋ผ๊ณ ํ ์ ์๋ค.

์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋จ์๋ผ๊ณ ํ๋ ํด๋์ค์ ๋จ์ ํด๋์ค์ ์์กดํ๋ ๋ค์ํ ํด๋์ค๊ฐ ์๋ค๊ณ ์๊ฐํด ๋ณด์.
๋จ์๋ ๋๋ฌด ๋ง์ ์ญํ ๊ณผ ์ฑ ์์ ๊ฐ์ง๋ค.
๊ฐ์ฒด ์งํฅ์ ์ธ๊ณ์์๋ ์ด๋ฐ ๊ฒฝ์ฐ ๋์ ๋์๊ฐ ๋๋ค๊ณ ํ๋ค.
๋จ์์ ์ฑ
์์ ๋ถ๋ฆฌํด ์ฌ๋ฌ ๊ฐ์ ํด๋์ค๋ฅผ ๋ง๋ค์

๋จ์๋ผ๋ ํด๋์ค๊ฐ ์ญํ ๊ณผ ์ฑ
์์ ๋ฐ๋ผ ๋ค ๊ฐ์ ํด๋์ค๋ก ์ชผ๊ฐ์ก๋ค. ํด๋์ค๋ช
๋ํ ์ญํ ๊ณผ ์ผ์นํ๊ธฐ ๋๋ฌธ์ ์ดํดํ๊ธฐ ์ฝ๋ค.
๋จ์ผ ์ฑ
์ ์์น์ ์๋ ๊ฒฝ์ฐ๋ณด๋ค ์๋ชป๋ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด๋ ๊ฒ์ด ์ดํดํ๋ ๋ฐ ์ข๋ค.
๋จผ์ ์์ฑ์ด ๋จ์ผ ์ฑ
์ ์์น์ ์งํค์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด์.
๊ฐ์ฒด ์งํฅ ์ธ๊ณ์์ ๋จ์๋ ๋ฐ๋์ ๊ตฐ๋๋ฅผ ๊ฐ๊ณ , ์ฌ์๋ ์ ๋๋ก ๊ตฐ๋๋ฅผ ๊ฐ์ง ์๋๋ค๊ณ ๊ฐ์ ํ์. ๊ทธ๋ฐ๋ฐ ์ฌ๋ ํด๋์ค์ ๊ตฐ๋ฒ ์์ฑ์ด ์๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
public class ์ฌ๋ {
String ๊ตฐ๋ฒ;
public static void main(String[] args) {
์ฌ๋ ๋ก๋ฏธ์ค = new ์ฌ๋();
์ฌ๋ ์ค๋ฆฌ์ฃ = new ์ฌ๋();
์ค๋ฆฌ์ฃ.๊ตฐ๋ฒ = "11-730411994";
}
}
์ค๋ฆฌ์ฃ์ ์ฌ์์ด๋ฏ๋ก '๊ตฐ๋ฒ'์ ๊ฐ์ง ์ ์๋ค. ํ์ง๋ง ์ค๋ฆฌ์ฃ์ด ๊ฐ์ง ๊ตฐ๋ฒ ์์ฑ์ ๊ฐ์ ํ ๋นํ๊ฑฐ๋ ์ฝ์ด ๋ณด๋ ์ฝ๋๋ฅผ ์ ์ ํ ๋ฐฉ๋ฒ์ด ์๋ค.
๊ฐ์ง ์ ์๋ ์์ฑ ๊ฐ์
์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด์ ๋จ์ ํด๋์ค๋ง ๊ตฐ๋ฒ์ ๊ฐ๊ฒ ํ๋ฉด๋๋ค. ์ฌ์์ ๋จ์์ ๊ณตํต์ ๋ง ๋ชจ์ ์ฌ๋ ํด๋์ค๋ฅผ ์์ ํด๋์ค๋ก ๋ง๋ค ์๋ ์๊ณ ๋์ ๊ณตํต์ ์ด ์๋ค๋ฉด ๋จ์ ํด๋์ค์ ์ฌ์ ํด๋์ค๋ก ๋๋ ์ ๊ตฌํํ ์ ์๋ค.
ํ๋์ ์์ฑ์ด ์ฌ๋ฌ ์์ฑ์ ๊ฐ์ง๋ ๊ฒฝ์ฐ
๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ์กด์ฌํ๋ ํ๋์ ํ๋๊ฐ ์ฌ๋ฌ ์์ฑ์ ๊ฐ๋ฅดํค๊ฒ ๋๋ฉด ์ ๊ทํ๋ฅผ ํตํด ๋จ์ผ ์ฑ ์ ์์น์ ์ ์งํ๋๋ก ํด์ผํ๋ค.
public class ๊ฐ์์ง {
final static Boolean ์ซ์ปท = true;
final static Boolean ์์ปท = false;
Boolean ์ฑ๋ณ;
void ์๋ณ๋ณด๋ค() {
if (this.์ฑ๋ณ == ์ซ์ปท) {
// ํ์ชฝ ๋ค๋ฆฌ๋ฅผ ๋ค๊ณ ์๋ณ์ ๋ณธ๋ค.
} else {
// ๋ค๋ค๋ฆฌ ๋ ๊ฐ๋ก ์์ ์์ธ๋ก ์๋ณ์ ๋ณธ๋ค.
}
}
}
๊ฐ์์ง๊ฐ "์์ปท"์ธ์ง "์์ปท"์ธ์ง์ ๋ฐ๋ผ ๋ฉ์๋์์ ๋ถ๊ธฐ ์ฒ๋ฆฌ๊ฐ ์งํ๋๊ณ ์๋ค.
์ด๋ ๊ฐ์์ง ํด๋์ค์์ "์๋ณ๋ณด๋ค"์ ์์ปท๊ณผ ์์ปท ๊ฐ์์ง์ ํ์๋ฅผ ๋ชจ๋ ๊ตฌํํ๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์ "๋จ์ผ ์ฑ ์ ์์น"์ ์๋ฐฐํ๊ฒ ๋์๋ค.
๋ฉ์๋๊ฐ ๋จ์ผ ์ฑ ์ ์์น์ ์งํค์ง ์์ ๊ฒฝ์ฐ ๋ํ๋๋ ๋ํ์ ์ธ ๋์๊ฐ ๋ฐ๋ก ๋ถ๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํ if ๋ฌธ์ด๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ๋จ์ผ ์ฑ ์ ์์น์ ์ ์ฉํด ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋ง ํด์ผ ํ๋ค.
๋ฆฌํฉํ ๋ง ์ฝ๋
package srp.good;
public abstract class ๊ฐ์์ง {
abstract void ์๋ณ๋ณด๋ค();
}
public class ์ซ์ปท๊ฐ์์ง extends ๊ฐ์์ง {
void ์๋ณ๋ณด๋ค() {
// ํ์ชฝ ๋ค๋ฆฌ๋ฅผ ๋ค๊ณ ์๋ณ์ ๋ณธ๋ค.
}
}
public class ์์ปท๊ฐ์์ง extends ๊ฐ์์ง {
void ์๋ณ๋ณด๋ค() {
// ๋ค๋ค๋ฆฌ ๋ ๊ฐ๋ก ์์ ์์ธ๋ก ์๋ณ์ ๋ณธ๋ค.
}
}
์ถ์ ๋ฉ์๋๋ฅผ ํตํด ํ์๊ฐ ๋ค๋ฅธ ๋ฉ์๋์ ๊ตฌํ์ ํ์ ํด๋์ค์๊ฒ ์์ํ๋ค.
์์์ "๋จ์ผ ์ฑ ์ ์์น"์ ์งํคํค ์ํ ๋๊ตฌ๋ก ์ฌ์ฉํ๋ค.
๋ชจ๋ธ๋ง์ ๋ด๋นํ๋ "์ถ์ํ"๋ "๋จ์ผ ์ฑ ์ ์์น"๊ณผ ๊ฐ์ฅ ๊ด๊ณ๊ฐ ๊น๋ค.
์ด๋ ๋ ํ ์ด์ ์๊ฐ ๋งํฐ์ฆ๋ฅผ ๊ตฌ์
ํ๋ค. ๊ทธ๋ฆฌ๊ณ ํ๋ ๊ทธ ์ด์ ์์๊ฒ ์๋ํ๊ฐ ์๊ฒผ๋ค.
๊ธฐ์ด๊ฐ ์๋์ด๋ ๋งํฐ์ฆ์์ ๊ธฐ์ด๊ฐ ์๋์ธ ์๋ํ๋ก ์ฐจ์ข
์ ๋ฐ๊พธ๋ ์ด์ ์์ ํ๋ ๋ํ ๋ณํ๊ฐ ์๊ธด๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด์ ์๋ ์ฐจ๋์ ๋ฐ๋ผ ์ด์ ํ๋ ์ต๊ด์ ๋ฐ๊ฟ์ผํ ๊น?
ํ์ค์ด๋ผ๋ฉด ๋น์ฐํ ์ด๋ ์ ๋ ๋ณํ๊ฐ ์๊ฒ ์ง๋ง ๊ฐ์ฒด ์งํฅ ์ธ๊ณ๋ ๋ค๋ฅธ ํด๋ฒ์ด ์๋ค.

์์ ํด๋์ค or ์ธํฐํ์ด์ค๋ฅผ ์ค๊ฐ์ ๋๋ค.
์ด์ ์์ ์
์ฅ์์ ์ฃผ๋ณ์ ๋ณํ์ ์ํฅ์ ๋ฐ์ง ์๊ฒ ๋๋ค.
์๋์ฐจ์ ์
์ฅ์์ ์์ ์ ํ์ฅ์ ๊ฐ๋ฐฉ๋ ์๋ ๊ฒ์ด๋ค. (๋งํฐ์ฆ - ์๋ํ๋ก ํ์ฅ)
์์์ ๋ํด ์ค๋ช ํ๋ฉด์ ๊ฐ์ฒด ์งํฅ์์์ ์์์ ์กฐ์ง๋๋ ๊ณ์ธต๋๊ฐ ์๋ ๋ถ๋ฅ๋๊ฐ ๋ผ์ผ ํ๋ค๊ณ ํ๋ค.
๋ฆฌ์ค์ฝํ ์นํ ์์น์ ์ ์งํค๊ณ ์๋ ํด๋์ค
์๋ชป๋ ์์ ์์ (๊ณ์ธต๋)
์๋ฒ์ง - ๋ธ (๊ธฐ๋ฐ ํ์
- ์๋ธ ํ์
)์ ๊ณ์ธต๋ ํํ์ ์๋ชป๋ ์์์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ฌด์์ด ๋ฌธ์ ์ผ๊น? ํ๋ฒ ๋ฆฌ์ค์ฝํ ์นํ ๋ฒ์น์ ์ ์ฉํด๋ณด์.
์๋ฒ์ง ์ถํฅ์ด = new ๋ธ() ๋ธ์ด ํ์ด๋ ์๋ฒ์ง์ ์ญํ ์ ํ๋ ๊ฒ์ ๋ง์ด ์๋๋ค.
์ถํฅ์ด๋ ์๋ฒ์งํ ๊ฐ์ฒด ์ฐธ์กฐ ๋ณ์๋ฅผ ๊ฐ์ง๋ฏ๋ก ์๋ฒ์ง ๊ฐ์ฒด๊ฐ ๊ฐ์ง ํ์๋ฅผ ํ ์ ์์ด์ผ ํ๋ค. ๊ทธ๋ฐ๋ฐ ์ถํฅ์ด์๊ฒ ์๋ฒ์ง์ ์ด๋ค ์ญํ ์ ์ํฌ ์ ์์๊น?
์ฌ๋ฐ๋ฅธ ์์ (๋ถ๋ฅ๋)
๋๋ฌผ ๋ฝ๋ก๋ก = new ํญ๊ท()์ฆ, ๋ฆฌ์ค์ฝํ ์นํ ์์น์ ๋ง์กฑํ๋ค.
ํ์ ํด๋์ค ์ธ์คํด์ค๋ ์์ํ ๊ฐ์ฒด ์ฐธ์กฐ ๋ณ์์ ๋์ ํด ์์ ํด๋์ค์ ์ธ์คํด์ค ์ญํ ์ ํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ด์ผ ํ๋ค.

๋ฆฌ์ค์ฝํ ์นํ ์์น์ ์์์ด๋ผ๋ ํน์ฑ์ ์ฌ๋ฐ๋ฅด๊ฒ๋ง ์ฌ์ฉํ๋ฉด ์์ฐ์ค๋ฝ๊ฒ ์ป์ ์ ์๋ค.
SRP์์ ์ฌ์ฉํ๋ ์์ ๋ฅผ ๋ค์ ์ดํด๋ณด์.

๋จ์ผ ์ฑ
์ ์์น์ ์ ์ฉํ๊ธฐ ์ ๋จ์ ํด๋์ค๋ ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์๋ค.
๋จ์์๊ฒ ๋๋ฌด ๋ง์ ์ฑ ์์ด ๋ชฐ๋ ธ๊ธฐ์ ๋จ์ผ ์ฑ ์ ์์น์ ์ ์ฉํ๋ค.
๋จ์ผ ์ฑ
์ ์์น์์ ์ ์ํ ํด๊ฒฐ์ฑ
์ ๋จ์ ํด๋์ค๋ฅผ ์ชผ๊ฐ์ ํ๋์ ์ญํ (์ฑ
์)๋ง ํ๋ ๋ค์์ ์์ ํด๋์ค๋ก ๋ถํ ํ๋ ๊ฒ์ด์๋ค.
๊ทธ๋ฐ๋ฐ ์ด ๋ฐฉ๋ฒ๋ฟ์ผ๊น?
์๋ก์ด ๋ฐฉ๋ฒ: ISP(์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น)

์ด ๋ฐฉ๋ฒ์ ๋จ์ ํด๋์ค๋ฅผ ์ฑ
์๊ณผ ์ญํ ์ ๋ฐ๋ผ ํด๋์ค๋ฅผ ์ฌ๋ฌ๊ฐ๋ก ์ชผ๊ฐ๋ ๊ฒ์ด ์๋๋ค.
ํ์ํ ๊ฒฝ์ฐ์ ํ์ํ ์ญํ ๋ง ํ ์ ์๊ฒ ์ธํฐํ์ด์ค๋ก ์ ํํ๋ ๊ฒ์ด๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก "๋จ์ผ ์ฑ
์ ์์น"๊ณผ "์ธํฐํ์ด์ค ๋ถํ ์์น"์ ๊ฐ์ ๋ฌธ์ (๋ค์ค ์ฑ
์)์ ๋ํ ๋ ๊ฐ์ง ๋ค๋ฅธ ํด๊ฒฐ์ฑ
์ด๋ค.
์ธํฐํ์ด์ค ๋ถํ ์์น์ ์ธํฐํ์ด์ค ์ต์์ฃผ์ ์์น์ ๊ฐ์ง๋ค.
์ต์์ฃผ์๋ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ธ๋ถ์ ๋ฉ์๋ ์ ๊ณต์ ์ต์ํ์ ๋ฉ์๋๋ง ์ ๊ณตํด์ผํ๋ค.
์์ ํด๋์ค๋ ํ์ฑํ ์๋ก ์ข๊ณ "์ธํฐํ์ด์ค"๋ ์์์๋ก ์ข๋ค

๋น์ฝํ ์์ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฑ๊ณผ ๋ฉ์๋๊ฐ ํ์ํด๋์ค์์ ์ค๋ณต๋๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ค.
ํ์ง๋ง ํ์ฑํ ์์ ํด๋์ค์์๋ ํ์ ํด๋์ค์์ ๊ณตํต์ผ๋ก ๊ฐ์ง ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ์์ํ๋ค.

์์ ์์์ฒ๋ผ ์๋์ฐจ์ ์ค๋
ธ์ฐํ์ด์ด ์ฌ์ด์๋ ์์กด ๊ด๊ณ๊ฐ ์๋ค. ์๋์ฐจ๊ฐ ์ค๋
ธ์ฐํ์ด์ด์ ์์กดํ๋ ๊ด๊ณ์ด๋ค.
์๋์ฐจ๋ 10๋
์ด์๋ ํ ์ ์์ง๋ง ์ค๋
ธ์ฐ ํ์ด์ด๋ ๊ณ์ ์ด ๋ฐ๋๋ฉด ์ผ๋ฐ ํ์ด์ด๋ก ๊ต์ฒดํด์ผ ํ๋ค.
์ฆ, ์ค๋
ธ์ฐํ์ด์ด๊ฐ ์๋์ฐจ๋ณด๋ค ์์ฃผ ๋ณ๊ฒฝ๋๋ค. ์ค๋
ธ์ฐ ํ์ด์ด๋ฅผ ์ผ๋ฐ ํ์ด์ด๋ก ๊ต์ฒดํ ๋ ์๋์ฐจ๋ ๊ทธ ์ํฅ์ ๋
ธ์ถ๋ผ ์๋ค.
์๋์ฐจ๋ ์์ ๋ณด๋ค ์์ฃผ ๋ณ๊ฒฝ๋๋ ํด๋์ค์ ์์กดํด ๋ถ์์ง๊ธฐ ์ฝ๊ณ ๋์๋ฅผ ํ๊ธฐ๋ ํด๋์ค์ด๋ค.
๊ฐ์

์ ๊ทธ๋ฆผ์ฒ๋ผ ์๋์ฐจ๊ฐ ํ์ด์ด ์ธํฐํ์ด์ค์ ์์กดํ๊ฒ ํด๋ณด์.
์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๊ฐ ๋ณ๊ฒฝ๋์ด๋ ์๋์ฐจ๋ ๊ทธ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
์ด ํด๊ฒฐ์ฑ ์ ๊ฐ๋ฐฉ ํ์ ์์น(OCP)๋ ๋ น์๋ค์ด ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ํ๋์ ํด๊ฒฐ์ฑ ์ ์ฌ๋ฌ ์ค๊ณ๋ฅผ ์ฐพ์ ์ ์๋ค.
์ '์์กด ์ญ์ ์์น'์ด๋ผ๊ณ ๋ถ๋ฅผ๊น?
๊ฐ์ ์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ๊ธฐ์กด์๋ ์ค๋
ธ์ฐ ํ์ด์ด๊ฐ ๊ทธ ๋ฌด์์๋ ์์กดํ์ง ์๋ ํด๋์ค์๋๋ฐ, ๊ฐ์ ๋๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ถ์์ ์ธ ๊ฒ์ธ ํ์ด์ด ์ธํฐํ์ด์ค์ ์์กดํ๊ฒ ๋๋คใ
ฃ. ๋ฐ๋ก ์์กด์ ๋ฐฉํฅ์ด ์ญ์ ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์๋์ฐจ๋ ์์ ๋ณด๋ค ๋ณํ๊ธฐ ์ฌ์ด ์ค๋
ธ์ฐ ํ์ด์ด์ ์์กดํ๋ ๊ด๊ณ๋ฅผ ์ค๊ฐ์ ์ถ์ํ๋ ํ์ด์ด ์ธํฐํ์ด์ค๋ฅผ ์ถ๊ฐํด ๋๊ณ ์์กด ๊ด๊ณ๋ฅผ ์ญ์ ์ํค๊ณ ์๋ค. ์ด์ฒ๋ผ ์์ ๋ณด๋ค ๋ณํ๊ธฐ ์ฌ์ด ๊ฒ์ ์์กดํ๋ ๊ฒ์ ์ถ์ํ๋ ์ธํฐํ์ด์ค๋ ์์ ํด๋์ค๋ฅผ ๋์ด ๋ณํ๊ธฐ ์ฌ์ด ๊ฒ์ ๋ณํ์ ์ํฅ๋ฐ์ง ์๊ฒ ํ๋ ๊ฒ์ด ์์กด ์ญ์ ์์น์ด๋ค.
์ถ์ฒ
์คํ๋ง ์
๋ฌธ์ ์ํ ์๋ฐ ๊ฐ์ฒด ์งํฅ์ ์๋ฆฌ์ ์ดํด
https://github.com/expert0226/oopinspring