๐ญ Chapter 10: ํด๋์ค
๐ ํด๋์ค ์ฒด๊ณโ
๐ ์บก์ํโ
๋ณ์์ ์ ํธ๋ฆฌํฐ ํจ์๋ ๊ฐ๋ฅํ ๊ณต๊ฐ ํ์ง ์๋ ํธ์ด ๋ซ์ง๋ง ๋ฐ๋์ ์จ๊ฒจ์ผ ํ๋ค๋ ๋ฒ์น๋ ์๋ค.
๋๋ก๋ ๋ณ์๋ ์ ํฐ๋ฆฌํฐ ํจ์๋ฅผ protected
๋ก ์ ์ธํ์ฌ ํ
์คํธ ์ฝ๋์ ์ ๊ทผ์ ํ์ฉํ๊ธฐ๋ ํ๋ค.
์ฐ๋ฆฌ์๊ฒ ํ
์คํธ๋ ์์ฃผ ์ค์ํ๋ค.
๊ฐ์ ํจํค์ง ์์์ ํ
์คํธ ์ฝ๋๊ฐ ํจ์๋ฅผ ํธ์ถํ๊ฑฐ๋ ๋ณ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๋ฉด ๊ทธ ํจ์๋ ๋ณ์๋ฅผ protected
๋ก ์ ์ธํ๊ฑฐ๋ ํจํค์ง ์ ์ฒด๋ก ๊ณต๊ฐํ๋ค.
ํ์ง๋ง ๊ทธ ์ ์ ๋น๊ณต๊ฐ ์ํ๋ฅผ ์ ์งํ ์จ๊ฐ ๋ฐฉ๋ฒ์ ๊ฐ๊ตฌํด์ผ ํ๋ค. ์บก์ํ๋ฅผ ํ์ด์ฃผ๋ ๊ฒฐ์ ์ ์ธ์ ๋ ์ตํ์ ์๋จ์ด๋ค.
๐ ํด๋์ค๋ ์์์ผ ํ๋ค!โ
ํด๋์ค๋ ๋ง๋ค ๋ ์ฒซ ๋ฒ์งธ ๊ท์น์ ํฌ๊ธฐ๋ค. ํด๋์ค๋ ์์์ผ ํ๋ค.
๋ ๋ฒ์งธ ๊ท์น๋ ํฌ๊ธฐ๋ค. ๋ ์์์ผ ํ๋ค.
์์ ํจ์ ์ฅ์์ ํ๋ ์ด์ผ๊ธฐ๋ฅผ ๋ํ์ดํ ์๋๋ ์๋ค. ๋จ์ง ํด๋์ค๋ฅผ ์ค๊ณํ ๋๋, ํจ์์ ๋ง์ฐฌ๊ฐ์ง๋ก, '์๊ฒ'๊ฐ ๊ธฐ๋ณธ ๊ท์น์ด๋ผ๋ ์๋ฏธ๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ฐ์ฅ ๋จผ์ ๋ ์ค๋ฅด๋ ์๋ฌธ์, ํจ์์ ๋ง์ฐฌ๊ฐ์ง๋ก, ์ผ๋ง๋ ์์์ผ ํ๋๊ฐ?
๊ฒ ๋ค.
ํจ์๋ ๋ฌผ๋ฆฌ์ ์ธ ํ ์๋ก ํฌ๊ธฐ๋ฅผ ์ธก์ ํ๋ค.
Details
ํด๋์ค๋ ๋งก์ ์ฑ ์1์ ์ผ๋ค.
1 : [RDD] : Object Design: Roles, Responsibilities, and Collaborations, Rebecca WirfsBrock et al., Addison-Wesley, 2002.public class SuperDashboard extends JFrame implements MetaDataUser {
public Component getLastFocusedComponent()
public void setLastFocused(Component lastFocused)
public int getMajorVersionNumber()
public int getMinorVersionNumber()
public int getBuildNumber()
}
๋ฉ์๋ ๋ค์ฏ ๊ฐ ์ ๋๋ฉด ๊ด์ฐฎ๋ค. ์ ๊ทธ๋ฐ๊ฐ? ์ฌ๊ธฐ์๋ ์๋๋ค. SuperDashboard
๋ ๋ฉ์๋ ์๊ฐ ์์์๋ ๋ถ๊ตฌํ๊ณ ์ฑ
์์ด ๋๋ฌด ๋ง๋ค.
ํด๋์ค ์ด๋ฆ์ ํด๋น ํด๋์ค ์ฑ ์์ ๊ธฐ์ ํด์ผ ํ๋ค. ์ค์ ๋ก ์๋ช ์ ํด๋์ค ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ์ฒซ ๋ฒ์งธ ๊ด๋ฌธ์ด๋ค. ๊ฐ๊ฒฐํ ์ด๋ฆ์ด ๋ ์ค๋ฅด์ง ์๋๋ค๋ฉด ํ๊ฒฝ ํด๋์ค ํฌ๊ธฐ๊ฐ ๋๋ฌด ์ปค์ ๊ทธ๋ ๋ค. ํด๋์ค ์ด๋ฆ์ด ๋ชจํธํ๋ค๋ฉด ํ๊ฒฝ ํด๋์ค ์ฑ ์์ด ๋๋ฌด ๋ง์์๋ค.
๋ํ ํด๋์ค ์ค๋ช ์ ๋ง์ผ(if), ๊ทธ๋ฆฌ๊ณ (and), -(ํ)๋ฉฐ(or), ํ์ง๋ง(but)์ ์ฌ์ฉํ์ง ์๊ณ ์ 25๋จ์ด ๋ด์ธ๋ก ๊ฐ๋ฅํด์ผ ํ๋ค.
๐ ๋จ์ผ ์ฑ ์ ์์นโ
๋จ์ผ ์ฑ ์ ์์น(SRP)์ ํด๋์ค๋ ๋ชจ๋์ ๋ณ๊ฒฝํ ์ด์ ๊ฐ ํ๋, ๋จ ํ๋๋ฟ์ด์ด์ผ ํ๋ค๋ ์์น์ด๋ค. SRP๋ ์ฑ ์์ด๋ผ๋ ๊ฐ๋ ์ ์ ์ํ๋ฉฐ ์ ์ ํ ํด๋์ค ํฌ๊ธฐ๋ฅผ ์ ์ํ๋ค. ํด๋์ค๋ ์ฑ ์, ์ฆ ๋ณ๊ฒฝํ ์ด์ ๊ฐ ํ๋์ฌ์ผ ํ๋ค๋ ์๋ฏธ๋ค.
SuperDashboard
๋ ๋ณ๊ฒฝํ ์ด์ ๊ฐ ๋ ๊ฐ์ง๋ค. ์ฒซ์งธ, SuperDashboard
๋ ์ํํธ์จ์ด ๋ฒ์ ์ ์ถ์ ํ๋ค. ๊ทธ๋ฐ๋ฐ ๋ฒ์ ์ ๋ณด๋ ์ํํธ์จ์ด๋ฅผ ์ถ์ํ ๋๋ง๋ค ๋ฌ๋ผ์ง๋ค. ๋์งธ, SuperDashboard
๋ ์๋ฐ ์ค์ ์ปดํฌ๋ํธ๋ฅผ ๊ด๋ฆฌํ๋ค. ์ฆ, ์ค์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ๋๋ง๋ค ๋ฒ์ ๋ฒํธ๊ฐ ๋ฌ๋ผ์ง๋ค.
์ฑ
์, ์ฆ ๋ณ๊ฒฝํ ์ด์ ๋ฅผ ํ์
ํ๋ ค ์ ์ฐ๋ค ๋ณด๋ฉด ์ฝ๋๋ฅผ ์ถ์ํํ๊ธฐ๋ ์ฌ์์ง๋ค. ๋ ์ข์ ์ถ์ํ๊ฐ ๋ ์ฝ๊ฒ ๋ ์ค๋ฅธ๋ค. SuperDashboard
์์ ๋ฒ์ ์ ๋ณด๋ฅผ ๋ค๋ฃจ๋ ๋ฉ์๋ ์ธ ๊ฐ๋ฅผ ๋ฐ๋ก ๋นผ๋ด Version
์ด๋ผ๋ ๋
์์ ์ธ ํด๋์ค๋ฅผ ๋ง๋ ๋ค. Version
ํด๋์ค๋ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ฌ์ฌ์ฉํ๊ธฐ ์์ฃผ ์ฌ์ด ๊ตฌ์กฐ๋ค!
public class Version {
public int getMajorVersionNumber()
public int getMinorVersionNumber()
public int getBuildNumber()
}
SRP๋ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์์ ๋์ฑ ์ค์ํ ๊ฐ๋ ์ด๋ค. ์ฐ๋ฆฌ๋ ์๋ง์ ์ฑ ์์ ๋ ์์ ํด๋์ค๋ฅผ ๊พธ์คํ ์ ํ๋ค. ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ๋ ์์ ์ ํ๋ก๊ทธ๋จ๋ง์ด ์๋๋ผ ํ๋ก๊ทธ๋๋ฐ ํ๋์์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ค์ํ๋ค.
๊ท๋ชจ๊ฐ ์ด๋ ์์ค์ ์ด๋ฅด๋ ์์คํ ์ ๋ ผ๋ฆฌ๊ฐ ๋ง๊ณ ๋ ๋ณต์กํ๋ค. ์ด๋ฐ ๋ณต์ก์ฑ์ ๋ค๋ฃจ๋ ค๋ฉด ์ฒด๊ณ์ ์ธ ์ ๋ฆฌ๊ฐ ํ์๋ค. ๊ทธ๋์ผ ๊ฐ๋ฐ์๊ฐ ๋ฌด์์ด ์ด๋์ ์๋์ง ์ฝ๊ฒ ์ฐพ๋๋ค. ๊ทธ๋์ผ (๋ณ๊ฒฝ์ ๊ฐํ ๋) ์ง์ ์ํฅ์ด ๋ฏธ์น๋ ์ปดํฌ๋ํธ๋ง ์ดํดํด๋ ์ถฉ๋ถํ๋ค. ํผ์งํ ๋ค๋ชฉ์ ํด๋์ค ๋ช ๊ฐ๋ก ์ด๋ค์ง ์์คํ ์ ๋น์ฅ ์ ํ์๊ฐ ์๋ ์ฌ์ค๊น์ง ๋ค์ด๋ฐ์ด ๋ ์๋ฅผ ๋ฐฉํดํ๋ค.
ํฐ ํด๋์ค ๋ช ๊ฐ๊ฐ ์๋๋ผ ์์ ํด๋์ค ์ฌ๋ฟ์ผ๋ก ์ด๋ค์ง ์์คํ ์ด ๋ ๋ฐ๋์งํ๋ค. ์์ ํด๋์ค๋ ๊ฐ์ ๋งก์ ์ฑ ์์ด ํ๋๋ฉฐ, ๋ณ๊ฒฝํ ์ด์ ๊ฐ ํ๋๋ฉฐ, ๋ค๋ฅธ ์์ ํด๋์ค์ ํ๋ ฅํด ์์คํ ์ ํ์ํ ๋์์ ์ํํ๋ค.
๐ ์์ง๋(Cohesion)โ
ํด๋์ค๋ ์ธ์คํด์ค ๋ณ์ ์๊ฐ ์ ์์ผ ํ๋ค. ๊ฐ ํด๋์ค ๋ฉ์๋๋ ํด๋์ค ์ธ์คํด์ค ๋ณ์๋ฅผ ํ๋ ์ด์ ์ฌ์ฉํด์ผ ํ๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ฉ์๋๊ฐ ๋ณ์๋ฅผ ๋ ๋ง์ด ์ฌ์ฉํ ์๋ก ๋ฉ์๋์ ํด๋์ค๋ ์์ง๋๊ฐ ๋ ๋๋ค. ๋ชจ๋ ์ธ์คํด์ค ๋ณ์๋ฅผ ๋ฉ์๋๋ง๋ค ์ฌ์ฉํ๋ ํด๋์ค๋ ์์ง๋๊ฐ ๊ฐ์ฅ ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ด์ฒ๋ผ ์์ง๋๊ฐ ๊ฐ์ฅ ๋์ ํด๋์ค๋ ๊ฐ๋ฅํ์ง๋ ๋ฐ๋์งํ์ง๋ ์๋ค. ๊ทธ๋ ์ง๋ง ์ฐ๋ฆฌ๋ ์์ง๋๊ฐ ๋์ ํด๋์ค๋ฅผ ์ ํธํ๋ค. ์์ง๋๊ฐ ๋๋ค๋ ๋ง์ ํด๋์ค์ ์ํ ๋ฉ์๋์ ๋ณ์๊ฐ ์๋ก ์์กดํ๋ฉฐ ๋ ผ๋ฆฌ์ ์ธ ๋จ์๋ก ๋ฌถ์ธ๋ค๋ ์๋ฏธ๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ ์์ ์ฝ๋๋ Stack
์ ๊ตฌํํ ์ฝ๋๋ค. ์๋ ํด๋์ค๋ ์์ง๋๊ฐ ์์ฃผ ๋๋ค. size()
๋ฅผ ์ ์ธํ ๋ค๋ฅธ ๋ ๋ฉ์๋๋ ๋ ๋ณ์๋ฅผ ๋ชจ๋ ์ฌ์ฉํ๋ค.
public class Stack {
private int topOfStack = 0;
List<Integer> elements = new LinkedList<Integer>();
public int size() {
return topOfStack;
}
public void push(int element) {
topOfStack++;
elements.add(element);
}
public int pop() throws PoppedWhenEmpty {
if (topOfStack == 0)
throw new PoppedWhenEmpty();
int element = elements.get(--topOfStack);
elements.remove(topOfStack);
return element;
}
}
'ํจ์๋ฅผ ์๊ฒ, ๋งค๊ฐ๋ณ์ ๋ชฉ๋ก์ ์งง๊ฒ'๋ผ๋ ์ ๋ต์ ๋ฐ๋ฅด๋ค ๋ณด๋ฉด ๋๋๋ก ๋ช๋ช ๋ฉ์๋๋ง์ด ์ฌ์ฉํ๋ ์ธ์คํด์ค ๋ณ์๊ฐ ์์ฃผ ๋ง์์ง๋ค. ์ด๋ ์ญ์คํ๊ตฌ ์๋ก์ด ํด๋์ค๋ก ์ชผ๊ฐ์ผ ํ๋ค๋ ์ ํธ๋ค. ์์ง๋๊ฐ ๋์์ง๋๋ก ๋ณ์์ ๋ฉ์๋๋ฅผ ์ ์ ํ ๋ถ๋ฆฌํด ์๋ก์ด ํด๋์ค ๋์ธ ๊ฐ๋ก ์ชผ๊ฐ์ค๋ค.
๐ ์์ง๋๋ฅผ ์ ์งํ๋ฉด ์์ ํด๋์ค ์ฌ๋ฟ์ด ๋์จ๋คโ
ํฐ ํจ์๋ฅผ ์์ ํจ์ ์ฌ๋ฟ์ผ๋ก ๋๋๊ธฐ๋ง ํด๋ ํด๋์ค ์๊ฐ ๋ง์์ง๋ค. ๋ง์ฝ ๋ค ๋ณ์๋ฅผ ํด๋์ค ์ธ์คํด์ค ๋ณ์๋ก ์น๊ฒฉํ๋ค๋ฉด ์ ํจ์๋ ์ธ์๊ฐ ํ์ ์๋ค. ๊ทธ๋งํผ ํจ์๋ฅผ ์ชผ๊ฐ๊ธฐ ์ฌ์์ง๋ค.
๋ถํํ๋ ์ด๋ ๊ฒ ํ๋ฉด ํด๋์ค๊ฐ ์์ง๋ ฅ์ ์๋๋ค. ๋ช๋ช ํจ์๋ง ์ฌ์ฉํ๋ ์ธ์คํด์ค ๋ณ์๊ฐ ์ ์ ๋ ๋์ด๋๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฐ๋ฐ ์ ๊น๋ง! ๋ช๋ช ํจ์๊ฐ ๋ช๋ช ๋ณ์๋ง ์ฌ์ฉํ๋ค๋ฉด ๋ ์์ ์ธ ํด๋์ค๋ก ๋ถ๋ฆฌํด๋ ๋์ง ์๋๊ฐ? ๋น์ฐํ๋ค. ํด๋์ค๊ฐ ์์ง๋ ฅ์ ์๋๋ค๋ฉด ์ชผ๊ฐ๋ผ!
๊ทธ๋์ ํฐ ํจ์๋ฅผ ์์ ํจ์ ์ฌ๋ฟ์ผ๋ก ์ชผ๊ฐ๋ค ๋ณด๋ฉด ์ข ์ข ์์ ํด๋์ค ์ฌ๋ฟ์ผ๋ก ์ชผ๊ฐค ๊ธฐํ๊ฐ ์๊ธด๋ค. ๊ทธ๋ฌ๋ฉด์ ํ๋ก๊ทธ๋จ์ ์ ์ ๋ ์ฒด๊ณ๊ฐ ์กํ๊ณ ๊ตฌ์กฐ๊ฐ ํฌ๋ช ํด์ง๋ค.
๋ฆฌํฉํฐ๋ง ํ ๊ฐ์ฅ ๋จผ์ ๋์ ๋๋ ๋ณํ๊ฐ ํ๋ก๊ทธ๋จ์ด ๊ธธ์ด์ก๋ค๋ ์ฌ์ค์ด๋ค. ๊ธธ์ด๊ฐ ๋์ด๋ ์ด์ ๋ ์ฌ๋ฌ ๊ฐ์ง๋ค. ์ฒซ์งธ, ๋ฆฌํฉํฐ๋งํ ํ๋ก๊ทธ๋จ์ ์ข ๋ ๊ธธ๊ณ ์์ ์ ์ธ ๋ณ์ ์ด๋ฆ์ ์ฌ์ฉํ๋ค. ๋์งธ, ๋ฆฌํฉํฐ๋งํ ํ๋ก๊ทธ๋จ์ ์ฝ๋ ์ฃผ์์ ์ถ๊ฐํ๋ ์๋จ์ผ๋ก ํจ์ ์ ์ธ๊ณผ ํด๋์ค ์ ์ธ์ ํ์ฉํ๋ค. ์ ์งธ, ๊ฐ๋ ์ฑ์ ๋์ด๊ณ ์ ๊ณต๋ฐฑ์ ์ถ๊ฐํ๊ณ ํ์์ ๋ง์ถ์๋ค.
๊ฐ์ฅ ๋จผ์ , ์๋ ํ๋ก๊ทธ๋จ์ ์ ํํ ๋์์ ๊ฒ์ฆํ๋ ํ ์คํธ ์ํธ๋ฅผ ์์ฑํ๋ค. ๊ทธ๋ฐ ๋ค์, ํ ๋ฒ์ ํ๋์ฉ ์์ฐจ๋ก์ ๊ฑธ์ณ ์กฐ๊ธ์ฉ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ค. ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ๋๋ง๋ค ํ ์คํธ๋ฅผ ์ํํด ์๋ ํ๋ก๊ทธ๋จ๊ณผ ๋์ผํ๊ฒ ๋์ํ๋์ง ํ์ธํ๋ค. ์กฐ๊ธ์ฉ ์๋ ํ๋ก๊ทธ๋จ์ ์ ๋ฆฌํ ๊ฒฐ๊ณผ ์ต์ข ํ๋ก๊ทธ๋จ์ด ์ป์ด์ก๋ค.