โ ๊ฐ๋ ์์ค๊ฐ ๊ณ ์์ผ ์ค๋ ํ์ผ์ ๋ฐ์ด๋ฌ์ค ์๋ค โ
- ๊ฐ๋ฐ์ ์๋ด(Programmerโs Proverbs)

์ธํฐํ์ด์ค ์ ์ (์น์ํ๊ฒ ์ค๋ช )
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ถ์ํ๋ฅผ ๋ฐฐ์ฐ๊ณ ์ถ์ ํด๋์ค๋ฅผ ์ ํด๋ดค๋ค๋ฉด ๊ทธ ๋ค์ ์ ํด๋ณด๋ ๊ฒ์ด ์ธํฐํ์ด์ค(Interface) ์ผ ๊ฒ์ด๋ค.
์ธํฐํ์ด์ค๋ ๊ฐ๋จํ ๋งํ์๋ฉด ํ๋ก๊ทธ๋จ์ ์ค๊ณํ๊ณ ์กฐ๊ธ ๋ ์ ์ฐํ ํ๋ก๊ทธ๋จ์ ๋ง๋๋ ๊ธฐ๋ฒ์ ๋งํ๋ค. ์ธํฐํ์ด์ค๋ ์ถ์ํ์ ์์๊ณผ ๋๋ถ์ด ๋คํ์ฑ์ด๋ผ๋ ๊ฐ์ฒด ์งํฅ์ ํน์ง์ ๊ตฌํํ๋ ํต์ฌ์ด๋ค.
์ค์ํ์ ์ธํฐํ์ด์ค
์ธํฐํ์ด์ค(Interface) ๋ผ๋ ์ฉ์ด๋ ๊ผญ ์๋ฐ(java)์๋ง ์๋ ๊ฒ์ด ์๋๋ค.
์ํค ๋ฐฑ๊ณผ์ ๋ฐ๋ฅด๋ฉด, ์ธํฐํ์ด์ค๋ ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ ์์คํ , ์ฅ์น ์ฌ์ด์์ ์ ๋ณด๋ ์ ํธ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ฒฝ์ฐ์ ์ ์ ์ด๋ ๊ฒฝ๊ณ๋ฉด์ด๋ผ๊ณ ํ๋ค. ์ฆ, ์ฌ์ฉ์๊ฐ ๊ธฐ๊ธฐ๋ฅผ ์ฝ๊ฒ ๋์์ํค๋๋ฐ ๋์์ ์ฃผ๋ ์ํธ์์ฉ ์์คํ ์ ์๋ฏธํ๋ค.
์ด๋ฌํ ์ ์๋ฅผ ์๋ฐ ํ๋ก๊ทธ๋๋ฐ์ ์ ๋ชฉํด๋ณด๋ฉด, ๊ฐ์ฒด์ ์ธ์คํด์ค ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ ์ฌ์ฉ์ ์ ์ฅ์์ '๊ทธ ๊ฐ์ฒด์ ๋ด๋ถ ๊ตฌํ์ด ์ด๋ป๋ ๊น์ด ํ์ตํ ํ์์์ด ์ํ๋ ๋ฉ์๋๋ง ํธ์ถํ๊ณ ๊ฒฐ๊ณผ ๊ฐ์ ์ ๋๋ก ๋ฐ๊ฒ ํด์ฃผ๋ ๊ฐํธํ ์ํธ์์ฉ ๊ธฐ๋ฅ์ด๋ค' ๋ผ๊ณ ๋ง ํ ์ ์๋ค.
ํ๋ก๊ทธ๋๋ฐ์ ๋ชจ๋ฅด๋ ์ฌ๋์๊ฒ ์ธํฐํ์ด์ค๊ฐ ๋ฌด์์ด๋๊ณ ๋ฌผ์ด๋ณธ๋ค๋ฉด, ์๋ง ๋ค์๊ณผ ๊ฐ์ GUI๋ฅผ ์์๋ฅผ ๋ค๋ฉฐ ๋งํ ๊ฒ์ด๋ค.
๊ฐ์๊ธฐ UI ์์๋ฅผ ์์๋ก ๊ฐ์ ธ์ค๋ ์ด์ ๋, ์ด UI๋ ๊ฒฐ๊ตญ ์ฌ์ฉ์๊ฐ ํ๋ก๊ทธ๋จ์ ๊ฐํธํ๊ฒ ์ด์ฉํ๊ธฐ ์ํด์ ์กด์ฌํ๋ ์ผ์ข ์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ก ๋ถ๋ฅ๋๊ธฐ ๋๋ฌธ์ด๋ค.

์ฌ์ค ์ฐ๋ฆฌ๊ฐ ํญ์ ๋ณด๋ ์๋์ฐ OS์ ํ์ผ ์์ด์ฝ ์ญ์ ์ธํฐํ์ด์ค์ ์ํ๋ค๊ณ ๋ณผ ์ ์๋ค. ๋ฆฌ๋ ์ค OS ๊ฐ์ ๊ฒฝ์ฐ ํฐ๋ฏธ๋ ๋ช ๋ น์ด๋ก ํ์ผ์ ์คํํ๊ณ ์กฐ์ํด์ผ ๋์ง๋ง, ์๋์ฐ์์๋ ๋ฐ๋ก ์๋์ฐ์ฐฝ์ ํตํด ํ๋ก๊ทธ๋จ์ ๋ค๋ฃจ๋๋ฐ ์ปด๋งน์ด๋ผ๋ ์ฝ๊ฒ ๋ค๋ฃฐ ์ ์๊ฒ ํด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด์ฒ๋ผ ์ํธ์์ฉ์ ํตํด ์ฌ์ฉ์๊ฐ ์ํํธ์จ์ด๋ฅผ ํธํ๊ฒ ์ด์ฉํ๊ฒ ํด์ฃผ๋ฏ์ด, ๊ฐ๋ฐ์๊ฐ ํ๋ ์์ํฌ๋ฅผ ์ด์ฉํ์ฌ ์น์๋น์ค๋ฅผ ๊ฐ๋ฐํ๋๋ฐ ์์ด ํ๋ ์์ํฌ์ ๋ด๋ถ ๊ตฌ์ฑ ํ์ต ์์ด, ๊ทธ์ ์ง์ํด์ฃผ๋ ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ๊ฐํธํ๊ฒ ํ๋ก์ ํธ๋ฅผ ๊ฐ๋ฐ ํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ด ์ธํฐํ์ด์ค์ ์ฒซ๋ฒ์งธ ์ญํ ์ด๋ผ๊ณ ํ ์ ์๋ค.
๋๋ฒ์งธ ์ธํฐํ์ด์ค์ ์ญํ ์ ์ผ์ข ์ '์คํ' ์ ์ง์ ํ๊ฒ ํ์ฌ ์ํํธ์จ์ด ํ์ฅ์ ์ ๋ฆฌํ๋ค๋ ๊ฒ์ด๋ค.
์ค์ํ๋ก ์๋ฅผ ๋ค์ด๋ณด์๋ฉด, ์ฐ๋ฆฌ๋ ์ผ์ฑ ํค๋ณด๋๋ , ์ ํ ํค๋ณด๋๋ , ๋ก์งํ ํค๋ณด๋๋ ์ ์กฐ์ฌ ์๊ด์์ด ์ปดํจํฐ์ ์ฐ๊ฒฐ๋งํ๋ฉด ์ค์น์์ด ๋ฐ๋ก ์ด์ฉํ ์ ์๋ค. ์ด๋ฌํ ๊ฐํธํจ์ ๋ชจ๋ OS์์ ๋ฏธ๋ฆฌ I/O ์ฒ๋ฆฌ์ ๋ํด ์ธํฐํ์ด์ค๋ก ์ถ์ํ ํ์๊ธฐ ๋๋ฌธ์, ๊ฐ ํค๋ณด๋ ์ ์กฐ ํ์ฌ๋ค์ด ์ธํฐํ์ด์ค์ ๊ตฌํ ์คํ์ ๋ฐ๋ผ ๋์ ๋ฉ์๋๋ฅผ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ด๋ค.

๊ทธ๋์ ํค๋ณด๋ ์ ์กฐ์ฌ ์๊ด์์ด ์ฐ๋ฆฌ๋ ๊ฐํธํ๊ฒ ํค๋ณด๋๋ฅผ ์ฐ๊ฒฐ๋ง ํ๋ฉด ์ด์ฉํ ์ ์๋ ๊ฒ์ด๋ค.
์๊ฒ ๋ชจ๋ฅด๊ฒ ์ฐ๋ฆฌ๋ ์ค์ํ์์ ์ธํฐํ์ด์ค๋ก ๋จ๋จํ๊ฒ ๊ตฌ์กฐ์ ์ผ๋ก ์ง์ฌ์ ธ ๋์จ ์ ํ๋ค์ ์ด์ฉํด์๋ ๊ฒ์ด๋ค.
์๋ฐ์ ์ธํฐํ์ด์ค
๋ณดํต ํ๋ถ์๋ค์ ์ธํฐํ์ด์ค๋ฅผ ์ฒ์ ๋ฐฐ์ธ ๋ ์ถ์ ๋ฉ์๋ ์งํฉ์ด๋ฉฐ ๋ค์ค ์์์ด ๋๋ ๊ธฐ๋ฅ ์ ๋๋ก๋ง ์๊ธฐํ๋ค. ํ์ง๋ง ์์์ ์ธํฐํ์ด์ค์ ๋ํ ์น์ํ ์์ ๋ฅผ ๋ค๋ฉฐ ์๊ฐํ ์ด์ ๋, ์๋ฐ์ ์ธํฐํ์ด์ค ์์ฒด๊ฐ ์ง๋ ๊ณ ์ ํ ๊ธฐ๋ฅ๊ณผ ์์คํ ์ํธ์์ฉ ์ ์ธ ์์๋ก ์ ๋ง ๋ค์ํ ๋ถ์ผ์ ์ด์ฉ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์์ ๋ฐ ์ถ์ ๋ฉ์๋ ๊ฐ์ ๊ตฌํ ์ธ์๋, ๋ค์ํ ํ๋ ์์ํฌ์์ ํด๋์ค๋ผ๋ฆฌ ํต์ ํ๋๋ฐ ์์ฃผ ์ฌ์ฉ๋๋ฉฐ, ๊ฐ์ฒด ์งํฅ(OOP) ํ๋ก๊ทธ๋๋ฐ์ ์ ๋ต์์ ๊ฒฐํฉ๋(Coupling)์ ๋ฎ์ถฐ ์ ์ง๋ณด์์ฑ์ ๋๋ฆฌ๋ ๋์์ธ ํจํด์ผ๋ก์์ ์ญํ ๋ ๋ณํํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ฐ๋ฆฌ๊ฐ ๋ฐ๋ณต๋๋ ์ฝ๋๋ค์ ์ค์ด๊ธฐ ์ํด for๋ฌธ ์ด๋ while๋ฌธ์ ์ฌ์ฉํ๋ฏ์ด, ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๋ชฉ์ ์ ์ค๊ณ์ ์ด์ ์ ์ํด ์ฌ์ฉํ๋ ํด๋์ค๋ผ๊ณ ๋งํ ์ ์๋ค.
์ค๊ณ ๊ด์ ์์ ํ๋ก๊ทธ๋๋ฐ์ ํ ๋๋ ๋๋ฌด๋ ๋ณด์ง๋ง ์ฒ์ ๋ณผ ์ ์์ด์ผ ํ๋ค. '์ฌ๊ธฐ ์ ์ด๋ฐ ๋๋ฌด๊ฐ ์ฌ์ด์ ธ ์์ง?' ๊ฐ ์๋, '์ ์ฒด ์ฒ์ ์ํด์ ์ฌ๊ธฐ ๋๋ฌด๋ฅผ ์ฌ์๊ตฌ๋' ์์ผ๋ก ์ ๊ทผํด์ผ ๋๋ค.
์ธํฐํ์ด์ค๊ฐ ๋ฌด์์ธ์ง ์น์ํ๊ฒ ๋ค๊ฐ ๊ฐ๋๋ฐ ์ฑ๊ณตํ๋ค๋ฉด, ์ด์ ์๋ฐ์์์ ์ธํฐํ์ด์ค์ ์ฌ๋ฌ๊ฐ์ง ํ์ฉ๋์ ๋ํด ํ์ตํ๋ฌ ๋์ด๊ฐ๋ณด์.
์ธํฐํ์ด์ค ๊ธฐ๋ณธ ๋ฌธ๋ฒ
์ธํฐํ์ด์ค ์ ์
- ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ถ์ ํด๋์ค๋ฅผ ์์ฑํ๋ ๊ฒ๊ณผ ๊ฐ๋ค๊ณ ๋ณด๋ฉด ๋๋ค. (์ถ์ ๋ฉ์๋ ์งํฉ)
- ์ธํฐํ์ด์ค๋ ํ๋๋ฅผ ์ ์ธํ ์ ์์ง๋ง ๋ณ์๊ฐ ์๋ ์์(final)๋ก์๋ง ์ ์ํ ์ ์๋ค.
public static final๊ณผpublic abstract์ ์ด์๋ ์๋ต์ด ๊ฐ๋ฅํ๋ค.
์ธํฐํ์ด์ค์ ์ ์๋ ๋ชจ๋ ๋ฉค๋ฒ์ ์ ์ฉ๋๋ ์ฌํญ์ด๊ธฐ ๋๋ฌธ์ ํธ์์ ์๋ต ๊ฐ๋ฅํ๊ฒ ์ง์ํ๋ ๊ฒ์ด๋ค.
์๋ต๋ ์ ์ด์๋ ์ปดํ์ผ ์์ ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก ์ถ๊ฐํด ์ค๋ค.
interface ์ธํฐํ์ด์ค์ด๋ฆ{
public static final ํ์
์์์ด๋ฆ = ๊ฐ;
public abstract ํ์
๋ฉ์๋์ด๋ฆ(๋งค๊ฐ๋ณ์๋ชฉ๋ก);
}
// --------------------------------------------------------
interface TV {
int MAX_VOLUME = 10; // public static final ์๋ต ๊ฐ๋ฅ
int MIN_VOLUME = 10;
void turnOn(); // public abstract ์๋ต ๊ฐ๋ฅ
void turnOff();
void changeVolume(int volume);
void changeChannel(int channel);
}
์ธํฐํ์ด์ค ๊ตฌํ

- ์ธํฐํ์ด์ค๋ ์ถ์ ํด๋์ค์ฒ๋ผ ๊ทธ ์์ฒด๋ก๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ, ์ถ์ ํด๋์ค๊ฐ ์์์ ํตํด ์์ฑ๋๋ ๊ฒ์ฒ๋ผ ์ธํฐํ์ด์ค๋ ๊ตฌํ๋ถ๋ฅผ ๋ง๋ค์ด์ฃผ๋ ํด๋์ค์ ๊ตฌํ(์์) ๋์ด์ผ ํ๋ค.
- ํด๋น ํด๋์ค์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์ถ๋ค๋ฉด,
implementsํค์๋๋ฅผ ์ด ํ์ ์ธํฐํ์ด์ค๋ฅผ ๋์ดํ๋ฉฐ ๋๋ค. - ์ธํฐํ์ด์ค๋ฅผ ์์ ๋ฐ์์ผ๋ฉด, ์์ ํด๋์ค์์ ์ธํฐํ์ด์ค๊ฐ ํฌํจํ๊ณ ์๋ ์ถ์ ๋ฉ์๋๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ๊ตฌํํด์ค๋ค.
- ์ธํฐํ์ด์ค์ ๊ฐ์ฅ ํฐ ํน์ง์ ์ฌ๋ฌ๊ฐ๋ฅผ ๋ค์ค ๊ตฌํ(๋ค์ค ์์)์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค.
- ์์ ํด๋์ค์ ํด๋์ค ์์(extends)์ ์ธํฐํ์ด์ค ๊ตฌํ(implements)๋ ๋์์ ๊ฐ๋ฅํ๋ค.

interface Animal {
public abstract void cry();
}
interface Pet {
public abstract void play();
}
class Tail {
// ...
}
class Cat extends Tail implements Animal, Pet { // ํด๋์ค์ ์ธํฐํ์ด์ค๋ฅผ ๋์์ ์์
public void cry() {
System.out.println("๋์น๋์น!");
}
public void play() {
System.out.println("์ฅ ์ก๊ธฐ ๋์ดํ์~!");
}
}
์ธํฐํ์ด์ค๋ ๋ฐ์ง๊ณ ๋ณด๋ฉด ์์์ด์ง๋งextendsํค์๋ ๋์implements๋ผ๋ '๊ตฌํ' ์ด๋ผ๋ ํค์๋๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋, ์์์ ํด๋์ค๊ฐ์ ๋ถ๋ชจ - ์์ ๊ด๊ณ๋ฅผ ์ฐ๊ด ์ํค๋๋ฐ ์๋ฏธ๊ฐ ์ค์ ๋๋ค๋ฉด, ๊ตฌํ์ ํด๋์ค๋ฅผ ํ์ฅ ์์ผ ๋ค์ํ ์ด์ฉํ๋๋ฐ ์ค์ ์ด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํ๋ฐ๊ณ ์ถ์ ๋ฉ์๋๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ๊ตฌํํ ๋ ์ ๊ทผ์ ์ด์ ์ค์ ์ ์ฃผ์ํด์ผ ํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ(overriding) ํ ๋๋ ๋ถ๋ชจ์ ๋ฉ์๋ ๋ณด๋ค ๋์ ๋ฒ์์ ์ ๊ทผ์ ์ด์๋ฅผ ์ง์ ํด์ผ ํ๋ค๋ ๊ท์น์ด ์กด์ฌํ๋ค. ๋ฐ๋ผ์ ์ธํฐํ์ด์ค์ ์ถ์ ๋ฉ์๋๋ ๊ธฐ๋ณธ์ ์ผ๋กpubic abstract๊ฐ ์๋ต๋ ์ํ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ์์ํด๋์ค์ ๋ฉ์๋ ๊ตฌํ๋ถ์์๋ ์ ์ด์๋ฅผpublic์ผ๋ก ์ค์ ํด ์ฃผ์ด์ผ ํ๋ค.
์ธํฐํ์ด์ค ์ผ๋ถ ๊ตฌํ (์ถ์ ํด๋์ค)
- ๋ง์ผ ํด๋์ค๊ฐ ๊ตฌํํ๋ ์ธํฐํ์ด์ค์ ๋ฉ์๋ ์ค ์ผ๋ถ๋ง ๊ตฌํํ๋ค๋ฉด
abstract๋ฅผ ๋ถ์ฌ์ ์ถ์ ํด๋์ค๋ก ์ ์ธํด์ผ ํ๋ค. - ์ด์ฐ ๋ณด๋ฉด ๋น์ฐํ๊ฒ ์ธํฐํ์ด์ค์ ์ถ์ ๋ฉ์๋ ๋ฉค๋ฒ๋ฅผ ๊ทธ๋๋ก ์์๋ฐ๊ธฐ ๋๋ฌธ์, ์ธํฐํ์ด์ค๋ฅผ ์์ํ ํด๋์ค์์ ๋ฉ์๋ ๊ตฌํ์ ์ํ๋ค๋ฉด, ๊ณง ์ถ์ ๋ฉ์๋๋ฅผ ๊ฐ์ง ์ถ์ ํด๋์ค๊ฐ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
interface Animal {
void walk();
void run();
void breed();
}
// Animal ์ธํฐํ์ด์ค๋ฅผ ์ผ๋ถ๋ง ๊ตฌํํ๋ ํฌ์ ๋ฅ ์ถ์ ํด๋์ค
abstract class Mammalia implements Animal {
public void walk() { ... }
public void run() { ... }
// public void breed() ๋ ์์ ํด๋์ค์์ ๊ตฌ์ฒด์ ์ผ๋ก ๊ตฌํํ๋๋ก ์ผ๋ถ๋ก ๊ตฌํํ์ง ์์ (์ถ์ ๋ฉ์๋๋ก ์ฒ๋ฆฌ)
}
class Lion extends Mammalia {
@Override
public void breed() { ... }
}
์ธํฐํ์ด์ค ์์ฒด ์์

- ํด๋์ค ๋ผ๋ฆฌ ์์์ ํตํด ํ์ฅ์ ํ๋ฏ์ด, ์ธํฐํ์ด์ค ์์ฒด๋ฅผ ํ์ฅ ์ํค๊ณ ์ถ๋ค๋ฉด
extends๋ฅผ ํตํด ์ธํฐํ์ด์ค๋ฅผ ์์ํ๋ฉด ๋๋ค. - ํด๋์ค์ ๋ฌ๋ฆฌ ์ธํฐํ์ด์ค ๋ผ๋ฆฌ์ ์์์ ๋ค์ค ์์์ด ๊ฐ๋ฅํ๋ค. (๋ฉ์๋ ๊ตฌํ๋ถ๊ฐ ์์ผ๋ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ด ์์)
- ํด๋์ค์ ์์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ ์ธํฐํ์ด์ค๋ ์กฐ์ ์ธํฐํ์ด์ค์ ์ ์๋ ๋ฉค๋ฒ๋ฅผ ๋ชจ๋ ์์๋ฐ๋๋ค.
- ๊ทธ๋ฌ๋ ํ๋์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก
static์ด๊ธฐ ๋๋ฌธ์ ๊ตฌํ์ฒด๋ฅผ ๋ฐ๋ผ๊ฐ์ง ์๊ฒ ๋๋ค. (๋ ๋ฆฝ ์์) - ์ฐธ๊ณ ๋ก ์ธํฐํ์ด์ค์ ํด๋์ค๋ฅผ ์์ํ๋ ํ์๋ ๋ถ๊ฐ๋ฅํ๋ฐ, ์๋ํ๋ฉด ์ธํฐํ์ด์ค๋ ํด๋์ค์๋ ๋ฌ๋ฆฌ Object ํด๋์ค๊ฐ ์ต๊ณ ์กฐ์์ด ์๋๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฐ๋ ํด๋์ค ์์์ ๋ํด์ ๋ค์ค ์์์ ํ์ฉํ์ง ์์ง๋ง, ์ธํฐํ์ด์ค์ ํํด์๋ ๋ค์ค์์์ ํ์ฉํ๋ค.
interface Changeable{
/* ์ฑ๋์ ๋ฐ๊พธ๋ ๊ธฐ๋ฅ์ ๋ฉ์๋ */
void change();
}
interface Powerable{
/* ์ ์์ ๊ป๋ค ์ผฐ๋ค ํ๋ ๋ฉ์๋ */
void power(boolean b);
}
// ์ฑ๋ ๊ธฐ๋ฅ๊ณผ ์ ์ ๊ธฐ๋ฅ์ ๊ฐ์ง ์ธํฐํ์ด์ค๋ค์ ํ๋์ ์ธํฐํ์ด์ค๋ก ํตํฉ ์์
interface Controlable extends Changeable, Powerable {
// ์ธํฐํ์ด์ค๋ผ๋ฆฌ ๋ค์ค ์์ํ๋ฉด ๊ทธ๋๋ก ์ถ์ ๋ฉค๋ฒ๋ค์ ๋ฌผ๋ ค ๋ฐ์
}
// ํด๋์ค์ ํตํฉ๋ ์ธํฐํ์ด์ค๋ฅผ ๊ทธ๋๋ก ์์
class MyObject implements Controlable {
public void change() {
System.out.println("์ฑ๋์ ๋ฐ๊พธ๋ ๊ธฐ๋ฅ์ ๋ฉ์๋");
}
public void power(boolean b) {
System.out.println("์ ์์ ๊ป๋ค ์ผฐ๋ค ํ๋ ๋ฉ์๋");
}
}
public class Main {
public static void main(String[] args) {
// ์ธํฐํ์ด์ค ๋คํ์ฑ (์ธํฐํ์ด์ค๋ฅผ ํ์
์ผ๋ก ์ทจ๊ธํด์ ์
์บ์คํ
๊ฐ๋ฅ)
Controlable[] o = { new MyObject(), new MyObject() };
o[0].change();
o[0].power(true);
// ๊ฐ๊ฐ ๋จ์ผ ์ธํฐํ์ด์ค๋ก๋ ํ์
์ผ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. (๊ทธ๋ฌ๋ ์ง๋๊ณ ์๋ ์ถ์ ๋ฉ์๋๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค)
Changeable inter1 = new Changeable();
inter1.change();
Powerable inter2 = new Powerable();
inter2.power(true);
}
}
[ ์ธํฐํ์ด์ค์ extends๋ ์์์ด ์๋๋ค ]
์ธํฐํ์ด์ค๋ ํ๋์ ํ์ ์ด๋ ๊ท๊ฒฉ์ผ ๋ฟ์ด์ง ๊ทธ ์์ฒด๊ฐ ํ๋์ ๊ฐ์ฒด๊ฐ ๋๋ ๊ฒ์ด ์๋๋ค.
๋ฐ๋ผ์ ์๋ฐํ ๋งํ์๋ฉด, ์ธํฐํ์ด์ค์ ์์์ ํด๋์ค์ ์์์ฒ๋ผ ๋ถ๋ชจ์ ์์ฑ๊ณผ ๋์์ ๋ฌผ๋ ค๋ฐ๋ ๊ฒ์ด ์๋๋ค.
์ ํํ ๋งํ๋ฉด, ์ธํฐํ์ด์ค์ ์์์ ๊ท๊ฒฉ์ด๋ ์คํ ์์ฒด ํน์ ๊ธฐ๋ฅ ์์ฒด์ ์ ์ธ์ ๋ฌผ๋ ค๋ฐ์ ๊ฒ์ด๋ค.
๊ท๊ฒฉ์ด๋ ์คํ์ ๋ฌผ๋ ค๋ฐ์์ ์๋ก์ด ์คํ์ ๋ง๋ ๋ค๋ฉด ๊ธฐ์กด ์ฌ๋ฌ ๊ฐ์ ์คํ์ ์กฐํฉํด์ ํ๋๋ก ๋ฌถ๊ฑฐ๋ ๊ธฐ์กด์ ์คํ์ ๊ณ ์ค๋ํ ๋ฌผ๋ ค๋ฐ์ ํ์ ๋ค์ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ฒ ํ๋ ๊ฒ์ด๋ค.
์ธํฐํ์ด์ค ์์ ํ๋ ์์ ๊ด๊ณ
- ํด๋์ค์ ์์์ผ ๊ฒฝ์ฐ ํด๋์ค ํ๋ ๋ฉค๋ฒ๋ผ๋ฆฌ ์์๋์ด ๋ฎ์ด ์์์ง์ง๋ง, ์ธํฐํ์ด์ค์ ํ๋๋ค์ ๋ชจ๋
public static final์ด๊ธฐ์, ์๋ก ์์์ ํด๋ ๋ ๋ฆฝ์ ์ผ๋ก ์ด์ฉ
interface Iflower {
int ex = 10; // ๊ฐ๊ฐ public static final
}
interface IPlant extends Iflower {
int ex = 20; // ๊ฐ๊ฐ public static final
}
class Tulip implements IPlant {
int ex = 30; // ๊ทธ๋ฅ ์ธ์คํด์ค ๋ณ์
}
public class Main {
public static void main(String[] args) {
// ํด๋์ค ํ์
๊ฐ์ฒด๋ก ex ๋ฉค๋ฒ์ ์ ๊ทผํ๋ฉด, ํด๋์ค ์ธ์คํด์ค ๋ณ์๋ก ์ ๊ทผ
Tulip t = new Tulip();
System.out.println(t.ex); // 30
// ์ธํฐํ์ด์ค ํ์
๊ฐ์ฒด๋ก ๋ฉค๋ฒ์ ์ ๊ทผํ๋ฉด, ์ธํฐํ์ด์ค static ์์๋ก ์ ๊ทผ
Iflower a = new Tulip();
System.out.println(a.ex); // 10 - ์ข์ง์์ ๋ฐฉ๋ฒ
System.out.println(Iflower.ex); // 10 - ํด๋์ค static ์ฒ๋ผ '์ธํฐํ์ด์ค.๋ฉค๋ฒ' ๋ก ์ ๊ทผ
IPlant b = new Tulip();
System.out.println(b.ex); // 20 - ์ข์ง์์ ๋ฐฉ๋ฒ
System.out.println(IPlant.ex); // 20 - ํด๋์ค static ์ฒ๋ผ '์ธํฐํ์ด์ค.๋ฉค๋ฒ' ๋ก ์ ๊ทผ
}
}
์ธํฐํ์ด์ค ๋ ๋ฆฝ ํ์ผ
- ์๋ฐ์์ .class ํ์ผ์ ๋ง๋ค ์ ์๋ ๊ฒ์๋ ๊ผญ ํด๋์ค๋ง ์๋ ๊ฒ์ด ์๋๋ค.
- ์ธํฐํ์ด์ค ์์ฒด๋ง์ผ๋ก๋ ํด๋์ค๋ช ์ผ๋ก ์์ค ํ์ผ์ ๋ง๋ค ์ ์๋ค.

์๋ฐ8 ์ธํฐํ์ด์ค ๊ตฌํ ๋ฉ์๋
๋ณธ๋ ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ ๋ชธํต(๊ตฌํ์ฒด)์ ๊ฐ์ง ์ ์์ง๋ง, java8 ์ ์ด๋ฅด๋ฌ์ ๋ํดํธ ๋ฉ์๋์ ์คํํฑ ๋ฉ์๋๋ฅผ ํตํด ์ถ์ ํด๋์ค์ฒ๋ผ ๊ตฌํ ๋ฉ์๋๋ฅผ ์ ์ ํ ์ ์๊ฒ ๋์๋ค.
๊ทธ๋์ ์ด๋ฌํ ์ ๋๋ฌธ์ ์คํ๋ ค ์ถ์ ํด๋์ค์์ ์ฐจ์ด์ ์ด ๊ฑฐ์ ์ฌ๋ผ์ก๋ค๊ณ ๋งํ๊ธฐ๋ ํ๋ค.
์ด ๊ธฐ๋ฅ์ ์ด์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ java8์ ๋๋ค ํํ์ ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์๋๋ก ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ํด ์ถ๊ฐ๋์๋ค.

์๋ฅผ ๋ค์ด java8 ๋ฒ์ ๋ถํฐ ์๋ก์ด ์ถ๊ฐ๋ ์คํธ๋ฆผ์ด๋ ๋๋ค์ ๊ฐ์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ปฌ๋ ์ (Collection) ํด๋์ค์์ ์ฌ์ฉํ๊ธฐ ์ํด, ๊ธฐ์กด์ ๋ง๋ค์ด๋์๋ ์ธํฐํ์ด์ค๋ค์ ๊ตฌํํ๊ณ ์๋ ์ปฌ๋ ์ ํด๋์ค๋ค์ ๊ตฌ์กฐ์์ ํน์ ํ ๊ธฐ๋ฅ์ ์ถ๊ฐํด์ผ ๋๋ ์ํฉ์ด ์ค๊ฒ ๋์๋ค.

๊ทธ๋ฐ๋ฐ ๋ง์ผ ๊ธฐ์กด ์ธํฐํ์ด์ค์ ์ถ์ ๋ฉ์๋๋ฅผ ์ถ๊ฐ ํด๋ฒ๋ฆฌ๋ฉด, ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์๋ ๋ชจ๋ ๊ตฌํ ํด๋์ค๋ ๋ณ๊ฒฝ์ด ํ์ํด์ง๊ธฐ ๋๋ฌธ์ ์ถ์ ๋ฉ์๋ ๋์ ๋ํดํธ ๋ฉ์๋๋ฅผ ์๋ก์ด ์ถ๊ฐํ์ฌ ํด๊ฒฐํ์๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
๋ํ ์์ผ๋ก ์ธ๋ถ ์๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ ๋, ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ์ข ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋๋ค์ด ์ ์๋์ด ์์ํ ๋ฐ ์ด๋ฅผ ์ต๋ช ํด๋์ค๋ก ๋ฉ์๋๋ฅผ ํธ์ถํ๊ฑฐ๋ ์ค๋ฒ๋ผ์ด๋ฉ ํด์ ์ฌ์ ์ํ๊ฑฐ๋ ํ ๋ ์์ฃผ ์ ์ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ static ๋ฉ์๋๋ ์ธ์คํด์ค์ ๊ด๊ณ์๋ ๋ ๋ฆฝ์ ์ธ ๋ฉ์๋๊ธฐ ๋๋ฌธ์ ์ธํฐํ์ด์ค์ ์ถ๊ฐํด๋ ์๊ด์์ง๋ง, ๊ท์น์ ๋จ์ํ ํ ํ์๊ฐ ์์ด์ ์๋ฐ์์๋ ํ์ฉ๋์ง ์์์๋ค.
์ด ๋๋ฌธ์ ์ธํฐํ์ด์ค์ ๊ด๋ จ๋ static ๋ฉ์๋๋ ๋ณ๋์ ํด๋์ค์ ๋ฐ๋ก ๋์ด์ผ ํ๋ค. ๋ํ์ ์ผ๋ก java.util.Collection ์ธํฐํ์ด์ค๊ฐ ์๋๋ฐ, ์ด ์ธํฐํ์ด์ค์ ๊ด๋ จ๋ static ๋ฉ์๋๋ค์ด ์ธํฐํ์ด์ค์๋ ์ถ์ ๋ฉ์๋๋ง ์ ์ธํ ์ ์๋ค๋ ์์น ๋๋ฌธ์ ๋ณ๋์ ํด๋์ค์ธ Collections ๋ผ๋ ํด๋์ค์ ๋ค์ด๊ฐ๊ฒ ๋์๋ค.
๊ทธ๋ ์ง๋ง ์ญ์ ์๋ฐ8์ ์์ ์์ ์ ์ฝ์ ์์ด์ง๊ฒ ๋์๋ค.
default ๋ฉ์๋
- ๋ํดํธ ๋ฉ์๋๋ ์์ ํค์๋
default๋ฅผ ๋ถ์ด๋ฉฐ ์ผ๋ฐ ๋ฉ์๋์ฒ๋ผ ๊ตฌํ๋ถ{ ... }๊ฐ ์์ด์ผ ํ๋ค - ๋ํดํธ ๋ฉ์๋ ์ญ์ ์ ๊ทผ์ ์ด์๊ฐ public ์ด๋ฉฐ ์๋ต ๊ฐ๋ฅํ๋ค.
- ์์ ํด๋์ค(๊ตฌํ์ฒด)์์ default ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ์ฌ ์ฌ์ ์ ๊ฐ๋ฅํ๋ค.
- ๋ณดํต ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ดํ, ์์ ๊ณผ์ ์์ ์ธํฐํ์ด์ค ๋ชจ๋ ๊ตฌํ์ฒด์๊ฒ ์์ ์์ด ๊ด์ญ์ผ๋ก ํจ์๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ ์ถ์ ๋ ์ฌ์ฉ๋๋ค. (๋์ ๋ชจ๋ ๊ตฌํ์ฒด๊ฐ ์ํ๋ ๊ฐ์ return ํ๊ฒ ๋ณด์ฅํ๊ธฐ ์ํด @implSpec ์๋ฐ doc ํ๊ทธ๋ฅผ ์ฌ์ฉํด ๋ฌธ์ํ ํด์ค์ผ ํ๋ค)
- ์ฃผ์ ํด์ผํ ์ ์ ์ธํฐํ์ด์ค๋ Object ํด๋์ค๋ฅผ ์์๋ฐ์ง ์๊ธฐ ๋๋ฌธ์, Object ํด๋์ค๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ(equals, hasCode)๋ ๊ธฐ๋ณธ ๋ฉ์๋๋ก ์ ๊ณตํ ์ ์๋ค. ๋ฐ๋ผ์ ๊ตฌํ์ฒด๊ฐ ์ง์ ์ฌ์ ์๋ฅผ ํด ์ฃผ์ด์ผ ํ๋ค.
interface Calculator {
int plus(int i, int j);
int multiple(int i, int j);
// default๋ก ์ ์ธํจ์ผ๋ก ๋ฉ์๋๋ฅผ ๊ตฌํํ ์ ์๋ค.
default int sub(int i, int j){
return i - j;
}
}
// Calculator์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ MyCalculatorํด๋์ค
class MyCalculator implements Calculator {
// ์ถ์ ๋ฉ์๋๋ง ๊ตฌํํด์ค
@Override
public int plus(int i, int j) { return i + j; }
@Override
public int multiple(int i, int j) { return i * j; }
}
public class Main {
public static void main(String[] args){
MyCalculator mycal = new MyCalculator();
// ์ธํฐํ์ด์ค ํ์
์ผ๋ก ์
์บ์คํ
Calculator cal = (Calculator) mycal; // ๊ดํธ ์๋ตํด๋ ๋จ
// ์ธ์คํด์ค์ ์ธํฐํ์ด์ค ๋ํดํธ ๋ฉ์๋ ํธ์ถ
int value = cal.sub(5, 10);
System.out.println(value); // -5
}
}
์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ ์ํด์ , ๊ฐ์ฒด์ ํ์ ์ด ๋ฐ๋์ ์ธํฐํ์ด์ค ํ์ ์ผ๋ก ์ ์บ์คํ ํด์ฃผ์ด์ผ ํ๋ค.
@implSpec ์ฃผ์ ๋ฌธ์
๋ํดํธ ๋ฉ์๋๋ ๋ณดํต ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ดํ, ์์ ๊ณผ์ ์์ ์ธํฐํ์ด์ค ๋ชจ๋ ๊ตฌํ์ฒด์๊ฒ ์์ ์์ด ๊ด์ญ์ผ๋ก ํจ์๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ ์ถ์ ๋ ์ฌ์ฉ๋๋ค.
์๋ฅผ ๋ค์ด A ์ B ์
์ฒด๊ฐ ํ์
์ ํด์ ์ด๋ค ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์๋๋ฐ, ๊ฐ๋ฐ์๊ฐ ํด๋น ์ธํฐํ์ด์ค์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ํด ์ถ์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ฉด, ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์๋ ๋ชจ๋ ํด๋์ค์๋ ์์ ์ ๊ฐํด์ผ ํ๋ค.
๊ทธ๋ด๋ ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ฉด, ์ถ๊ฐ๋ ๋ฉ์๋๋ฅผ ๊ตฌํ์ฒด ํด๋์ค์์ ๊ตณ์ด ๊ตฌํํ์ง ์์๋ ์๋ฌ ์์ด ์ฌ์ฉํ ์ ์๊ณ , ๋์ค์ ํ์ํ๋ฉด ์ฌ์ ์๋ฅผ ํตํด ์
๊ทธ๋ ์ด๋๋ ๋ฉ์๋ ๊ตฌํ๋ ๊ฐ๋ฅํด์ง๋ค.
๋์ ๋ชจ๋ ๊ตฌํ์ฒด๊ฐ ์ํ๋ ๊ฐ์ return ํ๊ฒ ๋ณด์ฅํ๊ธฐ ์ํด @implSpec ์๋ฐ doc ํ๊ทธ๋ฅผ ์ฌ์ฉํด ๋ฌธ์ํ ํด์ค์ผ ํ๋ค
interface IJson {
String printJson(); // ์ถ์ ๋ฉ์๋
/**
* @impspec
* printJson()์ ๊ฒฐ๊ณผ๋ฅผ ๋๋ฌธ์ ๋ณํํ๋ค.
*/
default void uppperString() { // default ๋ฉ์๋
// ๊ตฌํ ๋ก์ง์, ์ถ์ ๋ฉ์๋์ธ printJson()์ ๋ฐํ ๊ฐ์ด ์ ์์ ์ธ ๊ฐ์ด ๋ ์๋ ์๊ณ null์ด๋์ ์์ธ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ @impspec ๋ฌธ์ํ๋ฅผ ํ๋ค.
String text = printJson().toUpperCase();
System.out.println(text);
}
}
default ๋ฉ์๋ ๋ค์ค ์์ ๋ฌธ์
ํด๋์ค์ ๋ค์ค ์์ ๋ฌธ์ ์ ์ ๋ํด์, ๋์ผํ ๋ฉ์๋๋ช
์ด ๊ฒน์น๋ ๊ฒฝ์ฐ ์ฃฝ์์ ๋ค์ด์๋ชฌ๋ ํ์์ ๋ํด ๋ฐฐ์ ์ ๊ฒ์ด๋ค.
๊ทธ๋์ ๋ค์ค ์์์ ๊ธ์ง ์์ผฐ๋๋, ์ด๋ฒ์ ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋๋ผ๋๊ฒ์ด ์ถ๊ฐ๋๋ฉด์ ์ธํฐํ์ด์ค๋ฅผ ๋ค์ค ๊ตฌํํ ๋ ํด๋์ค ๋ค์ค ์์ ๋ฌธ์ ์ ๋๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์๋๊ฒ ๋์๋ค. ๋ฐ๋ผ์ ์ธํฐํ์ด์ค ๋ค์ค ๊ตฌํ์ ํํด์ ์๋ฐ์์๋ ๋ค์๊ณผ ๊ฐ์ ๊ท์น์ ์ ํ์๋ค.
1. ๋ค์ค ์ธํฐํ์ด์ค๋ค ๊ฐ์ ๋ํดํธ ๋ฉ์๋ ์ถฉ๋
- ์ ์ด์ ๋๊ฐ์ ๋ํดํธ ๋ฉ์๋๋ฅผ ๊ฐ์ง ๋ ์ธํฐํ์ด์ค๋ฅผ ํ๋์ ํด๋์ค์ ๊ตฌํํ๊ณ ์๋ฌด๋ฐ ์กฐ์น๋ฅผ ์ทจํ์ง ์์ผ๋ฉด ์ปดํ์ผ ์์ฒด๊ฐ ๋์ง ์๋๋ค.
- ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์์ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ์ฌ ํ๋๋ก ํตํฉํ๋ค.
interface A1{
public void styleA();
// ๋ฉ์๋ ์๊ทธ๋์ฒ๊ฐ ๊ฐ์ ๋ํดํธ ๋ฉ์๋
default public void styleSame(){
System.out.println("A1 ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋ ์
๋๋ค.");
}
}
interface B1{
public void styleB();
// ๋ฉ์๋ ์๊ทธ๋์ฒ๊ฐ ๊ฐ์ ๋ํดํธ ๋ฉ์๋
default public void styleSame(){
System.out.println("B1 ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋ ์
๋๋ค.");
}
}
class MultiInterface implements A1, B1 {
@Override
public void styleA() {}
@Override
public void styleB() {}
// ๋ ์ธํฐํ์ด์ค ๋ํดํธ ๋ฉ์๋์ค A1 ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ์ฌ ๊ตฌํ
default public void styleSame(){
System.out.println("A1 ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋ ์
๋๋ค.");
}
}
public class Main {
public static void main(String[] args) {
MultiInterface m1 = new MultiInterface();
m1.styleSame(); // "A1 ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋ ์
๋๋ค."
}
}
2. ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋์ ๋ถ๋ชจ ํด๋์ค ๋ฉ์๋ ๊ฐ์ ์ถฉ๋
- ์์ ์ํฉ์ ์์ ํด๋์ค์์ ์ธํฐํ์ด์ค์ ๋ถ๋ชจ ํด๋์ค๋ฅผ ๋์์ extends / implement ํ์์๋ ๋ํดํธ ๋ฉ์๋์ ์ธ์คํด์ค ๋ฉ์๋ ๊ฐ์ ์ถฉ๋์ ๊ฐ์ ํ ์ํฉ์ด๋ค.
- ์ด๋๋ ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๊ฐ ์์๋๊ณ ๋ํดํธ ๋ฉ์๋๋ ๋ฌด์๋๋ค.
- ๋ง์ผ ์ธํฐํ์ด์ค ์ชฝ์ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๋ค๋ฉด, ํ์ํ ์ชฝ์ ๋ฉ์๋์ ๊ฐ์ ๋ด์ฉ์ผ๋ก ๊ทธ๋ฅ ์ค๋ฒ๋ผ์ด๋ฉ ํด๋ฒ๋ฆฌ๋ฉด ๋๋ค.
interface A1{
public void styleA();
// C1 ํด๋์ค์ ๋ฉ์๋ ์๊ทธ๋์ฒ๊ฐ ๊ฐ์ ๋ํดํธ ๋ฉ์๋
default public void styleSame() {
System.out.println("A1 ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋ ์
๋๋ค.");
}
}
abstract class C1 {
// A1 ์ธํฐํ์ด์ค์ ๋ฉ์๋ ์๊ทธ๋์ฒ๊ฐ ๊ฐ์ ์ธ์คํด์ค ๋ฉ์๋
public void styleSame() {
System.out.println("C1 ํด๋์ค์ ์ธ์คํด์ค ๋ฉ์๋ ์
๋๋ค.");
}
}
// ๋ฉ์๋ ์๊ทธ๋์ฒ๊ฐ ๊ฐ์ ๋ ์ถ์ํ๋ค์ ๋์์ ์์
class MultiClassInterface extends C1 implements A1 {
@Override
public void styleA() {}
}
public class Main {
public static void main(String[] args) {
MultiClassInterface m1 = new MultiClassInterface();
m1.styleSame(); // "C1 ํด๋์ค์ ์ธ์คํด์ค ๋ฉ์๋ ์
๋๋ค." - ํด๋์ค์ ๋ฉ์๋ ์๊ทธ๋์ฒ๊ฐ ์ฐ์ ๋์ด ์ ์ฉ๋จ
// ๋ง์ฐฌ๊ฐ์ง๋ก ์ธํฐํ์ด์ค ํ์
์ผ๋ก ๋ค์ด์บ์คํ
ํด๋ ํด๋์ค ์ธ์คํด์ค ๋ฉ์๋๋ก ํธ์ถ ๋จ
((A1) m1).styleSame(); // "C1 ํด๋์ค์ ์ธ์คํด์ค ๋ฉ์๋ ์
๋๋ค."
}
}
// ๋ฉ์๋ ์๊ทธ๋์ฒ๊ฐ ๊ฐ์ ๋ ์ถ์ํ๋ค์ ๋์์ ์์
class MultiClassInterface extends C1 implements A1 {
@Override
public void styleA() {}
// ํด๋์ค์ ์ธ์คํด์ค ๋ฉ์๋๋ฅผ ๋ฌด์ํ๊ณ ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๊ทธ๋๋ก ์ค๋ฒ๋ผ์ด๋ฉ
public void styleSame() {
System.out.println("A1 ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋ ์
๋๋ค.");
}
}
public class Main {
public static void main(String[] args) {
MultiClassInterface m1 = new MultiClassInterface();
m1.styleSame(); // "A1 ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋ ์
๋๋ค."
}
}
default ๋ฉ์๋์ super
์์ ํด๋์ค๋ฅผ ์์ํ๊ณ ์์์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ์ฌ์ ์ํ์์๋, ๋ง์ผ ๋ถ๋ชจ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ผ์ด ์๊ธดํ๋ฉด super ํค์๋๋ฅผ ํตํด ๋ถ๋ชจ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์์๋ค.
์ด์ ๊ฐ์ด ์ธํฐํ์ด์ค๋ ๋ํดํธ ๋ฉ์๋๋ฅผ ๊ตฌํํ ํด๋์ค์์ ์ค๋ฒ๋ผ์ด๋ฉ ํ์์๋, super ํค์๋๋ฅผ ํตํด ์ธํฐํ์ด์ค์ ์๋์ ๋ํดํธ ๋ฉ์๋๋ฅผ ํธ์ถ์ด ๊ฐ๋ฅํ๋ค.
๋ค๋ง ๋ฌธ๋ฒ์ด ํด๋์ค ๋ฐฉ์๊ณผ ์ฝ๊ฐ ์ฐจ์ด๊ฐ ์๋ค.
์ธํฐํ์ด์ค์ super๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์ฑ์ผ๋ก ํธ์ถ๋๋ค. ์ธํฐํ์ด์ค๋ช
.super.๋ํดํธ๋ฉ์๋
interface IPrint{
default void print(){
System.out.println("์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋ ์
๋๋ค.");
}
}
class MyClass implements IPrint {
@Override
public void print() {
IPrint.super.print(); // ์ธํฐํ์ด์ค์ super ๋ฉ์๋๋ฅผ ํธ์ถ
System.out.println("์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ ๋ฉ์๋ ์
๋๋ค.");
}
}
public class Main {
public static void main(String[] args) {
MyClass cls = new MyClass();
cls.print();
}
}

static ๋ฉ์๋
- ์ธ์คํด์ค ์์ฑ๊ณผ ์๊ด์์ด ์ธํฐํ์ด์ค ํ์ ์ผ๋ก ์ ๊ทผํด ์ฌ์ฉํ ์ ์๋ ๋ฉ์๋
- ์ธํฐํ์ด์ค ์ ์ฉ static ๋ฉ์๋๋ผ ํด์ ํน๋ณํ ๊ฒ์ ์๋ค.
์ผ๋ฐ ํด๋์ค์ static ๋ฉ์๋์ ๋ค๋ฅผ ๋ฐ ์๋ค. (๋๊ฐ์ด ์ทจ๊ธ ํ๋ฉด ๋๋ค) - ํด๋น ํ์ ๊ด๋ จ ํฌํผ ๋๋ ์ ํธ๋ฆฌํฐ ๋ฉ์๋๋ฅผ ์ ๊ณตํ ๋, ์ธํฐํ์ด์ค์ ์คํํฑ ๋ฉ์๋๋ก ์ ๊ณตํ๊ธฐ๋ ํ๋ค.
interface Calculator {
public int plus(int i, int j);
public int multiple(int i, int j);
// ๋ํดํธ ๋ฉ์๋
default int sub(int i, int j){
return i - j;
}
// ์คํํฑ ๋ฉ์๋
public static void explain(){
System.out.println("interface static ๋ฉ์๋ ์
๋๋ค. ์ด ์ธํฐํ์ด์ค๋ pluc, multipe, sub ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ฉ์๋๋ฅผ ์ง๋๊ณ ์์ต๋๋ค. (์ค๋ช
)");
}
}
class MyCalculator implements Calculator {
@Override
public int plus(int i, int j) { return i + j; }
@Override
public int multiple(int i, int j) { return i * j; }
}
public class Main {
public static void main(String[] args){
// ํด๋์ค ์ฒ๋ผ static ๋ฉ์๋ ํธ์ถ ํ๋ฉด ๋๋ค.
Calculator.explain(); // "interface static ๋ฉ์๋ ์
๋๋ค. ์ด ์ธํฐํ์ด์ค๋ pluc, multipe, sub ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ฉ์๋๋ฅผ ์ง๋๊ณ ์์ต๋๋ค. (์ค๋ช
)"
}
}
private ๋ฉ์๋
- ์๋ฐ9 ๋ฒ์ ์ ์ถ๊ฐ๋ ๋ฉ์๋
- ์ธํฐํ์ด์ค์ default, static ๋ฉ์๋๊ฐ ์๊ธด ์ดํ, ์ด๋ฌํ ๋ฉ์๋๋ค์ ๋ก์ง์ ๊ณตํตํํ๊ณ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด ์๊ธด ๋ฉ์๋
- private ๋ฉ์๋๋ ๊ตฌํ๋ถ๋ฅผ ๊ฐ์ ธ์ผํ๋ค.
- ๋จ, private ๋ฉ์๋๋ ์ธํฐํ์ด์ค ๋ด๋ถ์์๋ง ๋์๊ฐ๋ ์ฝ๋์ด๋ค. (์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์์ ์ฌ์ฉํ๊ฑฐ๋ ์ฌ์ ์ ํ ์ ์์)
- ๋ฐ๋ผ์ ์ธํฐํ์ด์ค ๋ด๋ถ์์ private ๋ฉ์๋๋ฅผ ํธ์ถํ ๋, default ๋ฉ์๋ ๋ด๋ถ์์ ํธ์ถํด์ผ ํ๋ฉฐ,
๋ง์ผprivate staticํค์๋๋ฅผ ๋ถ์ธ ๋ฉ์๋๋ static ๋ฉ์๋์์๋ง ํธ์ถ์ด ๊ฐ๋ฅํ๋ค.
์ด๋ ต๊ฒ ์๊ฐํ ํ์์์ด, ํด๋์ค์์๋ private ์ ๊ทผ์ ์ด์๋ฅผ ๊ฐ์ง ๋ฉ์๋๋ฅผ ์ ์ํ์์๋, ํธ์ถ ๋ฉ์๋์์ private ๋ด๋ถ ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ฌ์ฉํ๋ ์ ์ด์๋ ๊ฒ ์ฒ๋ผ, ์ธํฐํ์ด์ค๋ ์ด๋ ต์ง ์๊ฒ ๋๊ฐ์ด ์๊ฐํ๋ฉด ๋๋ค.
๋จ, ์ธํฐํ์ด์ค๋ ํด๋์ค๊ฐ ์๋๊ธฐ ๋๋ฌธ์ this ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
interface Calculator {
public int plus(int i, int j);
public int multiple(int i, int j);
// private ๋ฉ์๋
private void printf() {
System.out.println("private ๋ฉ์๋๋ default ๋ด๋ถ์์๋ง ํธ์ถ์ด ๊ฐ๋ฅํฉ๋๋ค.");
}
// private ์คํํฑ ๋ฉ์๋
private static void printfStatic() {
System.out.println("private static ๋ฉ์๋๋ static ๋ฉ์๋ ๋ด๋ถ์์๋ง ํธ์ถ์ด ๊ฐ๋ฅํฉ๋๋ค.");
}
// ๋ํดํธ ๋ฉ์๋
default void callPrivate() {
printf(); // private ๋ฉ์๋ ํธ์ถ
}
// ์คํํฑ ๋ฉ์๋
static void callPrivateStatic() {
printfStatic(); // private ์คํํฑ ๋ฉ์๋ ํธ์ถ
}
}
class MyCalculator implements Calculator {
@Override
public int plus(int i, int j) { return i + j; }
@Override
public int multiple(int i, int j) { return i * j; }
}
public class Main {
public static void main(String[] args){
// ์ธํฐํ์ด์ค ๋ํดํธ ๋ฉ์๋๋ฅผ ํตํ private ๋ฉ์๋ ํธ์ถ
Calculator c = new MyCalculator(); // ์ธํฐํ์ด์ค ํ์
์ผ๋ก ์
์บ์คํ
c.callPrivate(); // "private ๋ฉ์๋๋ default ๋ด๋ถ์์๋ง ํธ์ถ์ด ๊ฐ๋ฅํฉ๋๋ค."
// ์ธํฐํ์ด์ค ์คํํฑ ๋ฉ์๋๋ฅผ ํตํ private static ๋ฉ์๋ ํธ์ถ
Calculator.callPrivateStatic(); // "private static ๋ฉ์๋๋ static ๋ฉ์๋ ๋ด๋ถ์์๋ง ํธ์ถ์ด ๊ฐ๋ฅํฉ๋๋ค."
}
}
์ธํฐํ์ด์ค์ ์์๋ private์ผ๋ก ๋ง๋ค ์ ์๋ค.
์ธํฐํ์ด์ค๋ ์ค์ ๊ฐ์ฒด๋ ์๋์ง๋ง ์๋ก ๊ฐ์ ์ฝ์์ผ๋ก ์ฌ์ฉ๋๋ค. ์ ํด์ง ์ฝ์์ ํ ์ชฝ์์ ์ผ๋ฐฉ์ ์ผ๋ก ์์ ํ๊ฒ ๋๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ๋ฐ๋ผ์ ์ธํฐํ์ด์ค์ ์ ์ธํ๋ ํ๋๋ค์ ์๋์ผ๋กpublic static final์๋ฒฝํ ์์๊ฐ ๋๋ค.
์ธํฐํ์ด์ค์ ๋ค์ํ ํ์ฉ๋
์ง๊ธ๊น์ง ์ธํฐํ์ด์ค์ ๋์ด๋ ์๋ ๋ค์ํ ๋ฌธ๋ฒ์ ๋ํด ์์๋ณด์๋ค.
ํ์ง๋ง ์ ๋ถ๋ถ์ ๊ทธ์ ์ธํฐํ์ด์ค ์ฌ์ฉ๋ฒ๋ง ์ด๊ฑฐํด๋์ ์์ค์ด๊ณ , ์๋ฐ์์์ ์ง์ ํ ์ธํฐํ์ด์ค์ ํ์ฉ์ฑ์ ๋ํด์๋ ์์ง ๋ฐ๊ฐ๋ฝ๋ ๋ด๊ทธ์ง ์์ ์ฑ์ด๋ค.
์ธํฐํ์ด์ค์ ๋ํ ์ดํด๋ฅผ ์ด๋ ๊ฒ ๊ฐ์กฐํ๊ณ ๋ ๊ฐ์กฐํ๋ ์ด์ ๋, ๋๋ถ๋ถ ์๋ฐ ์ธ์ด๋ฅผ ๋ฐฐ์ฐ๋ ์ฃผ๋ ๋ชฉ์ ์ด ์คํ๋ง ํ๋ ์์ํฌ(Spring Framework)๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ ์ธ๋ฐ, ์คํ๋ง์์ ์ด ์ธํฐํ์ด์ค๋ฅผ ์ ๋ง ๋ง์ด ์ฌ์ฉํ๋ค. ์ธํฐํ์ด์ค์ ํ๋ํ ์ฌ์ฉ ์งํฉ์ฒด๊ฐ ํ๋ ์์ํฌ์ด๋ค ๋ผ๊ณ ๋งํด๋ ๋ ์ ๋๋ก ๋ง์ด๋ค.
์ง๊ธ๋ถํฐ ์๋ฐ์์ ์ธํฐํ์ด์ค ๋ผ๋ ๊ธฐ๋ฒ์ ์ด์ฉํด ์ด๋ ํ ์ฅ์ ์ ์ป์์ ์๊ณ , ์๋ฐ ํ๋ก๊ทธ๋๋ฐ์์ ์ด๋ค์์ผ๋ก ๋ค์ฑ๋กญ๊ฒ ํ์ฉ ํ ์ ์๋์ง ์ ๋ฆฌํด๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด์.
์ธํฐํ์ด์ค ๋คํ์ฑ
๋ถ๋ชจํด๋์ค ํ์ ์ผ๋ก ์์ ํด๋์ค ํ์ ์ ํฌํจ ์ํฌ์ ์๋ค๋ ๋คํ์ฑ์ ๋ฒ์น๋ ์ธํฐํ์ด์ค์ ๊ณ ๋๋ก ์ ์ฉ์ด ๊ฐ๋ฅํ๋ค.
ํด๋์ค๊ฐ ์ฌ๋ฌ ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ฒ ๋๋ฉด, ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ณ์์ ํ์ ์ผ๋ก๋ ๋ค์ํ๊ฒ ์ฐ์ผ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๊ฒ ๋๋ค. ์ธํฐํ์ด์ค ํ์ ์ผ๋ก ๋ณ์๋ฅผ ์ ์ธํ๊ฒ ๋๋ฉด ์ฌ์ฉํ๋ ์ ์ฅ์์๋ ๋ค์ ์ค๋ ๋ชจ๋ ๊ฐ์ฒด๋ ๊ฐ๋จํ ์ธํฐํ์ด์ค๋ง ๊ตฌํํ ๊ฐ์ฒด์ด๋ฉด๋๊ธฐ ๋๋ฌธ์ ์ข ๋ ์์คํ ์ด ์ ์ฐํด์ง๋ ๊ณ๊ธฐ๋ฅผ ๋ง๋ จํ๊ฒ ๋๋ค.
interface Keyboard { }
class Logitec_Keyboard implements Keyboard { }
class Samsung_Keyboard implements Keyboard { }
class Apple_Keyboard implements Keyboard { }
public class Main {
public static void main(String[] args) {
// ์ธํฐํ์ด์ค ํ์
๋ฐฐ์ด๋ก ์ฌ๋ฌ๊ฐ์ง ํด๋์ค๋ค์ ํ๋ฒ์ ํ์
๋ฌถ์์ ํ ์ ์๋ค.
Keyboard[] k = {
new Logitec_Keyboard(),
new Samsung_Keyboard(),
new Apple_Keyboard(),
};
}
}
๋ํ ์ธ๊ฐ์๋ ์ธํฐํ์ด์ค๋ฅผ ์๋ฃํ์ผ๋ก ์ฐ๋ ์ต๊ด์ ๋ค์ด๋ฉด ํ๋ก๊ทธ๋จ์ ํจ์ฌ ์ ์ฉํด์ง๋ค๊ณ ์ด์ผ๊ธฐํ๋ค.
์ด ๋ง์ ์๋ฏธ๋ ๊ฐ์ฒด๋ ํด๋์ค๊ฐ ์๋ ์ธํฐํ์ด์ค๋ก ์ฐธ์กฐํ๋ผ ๋ผ๋ ์๋ฏธ๋ก ํ์ฅํ ์ ์๋ค. ์ ํฉํ ์ธํฐํ์ด์ค๋ง ์๋ค๋ฉด ๋งค๊ฐ๋ณ์๋ฟ ์๋๋ผ ๋ฐํ๊ฐ, ๋ณ์, ํ๋๋ฅผ ์ ๋ถ ์ธํฐํ์ด์ค ํ์ ์ผ๋ก ์ ์ธํ๋ฉด ์ข๋ค.
- ๊ฐ์ฒด๋ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํด ์ฐธ์กฐํ๋ผ.
- ์ ๋นํ ์ธํฐํ์ด์ค๊ฐ ์๋ค๋ฉด ๋งค๊ฐ๋ณ์๋ฟ๋ง ์๋๋ผ ๋ฐํ๊ฐ, ๋ณ์, ํ๋๋ฅผ ์ ๋ถ ์ธํฐํ์ด์ค ํ์ ์ผ๋ก ์ ์ธํ๋ผ.
- ๊ฐ์ฒด์ ์ค์ ํด๋์ค๋ฅผ ์ฌ์ฉํ ์ํฉ์ '์ค์ง' ์์ฑ์๋ก ์์ฑํ ๋ ๋ฟ์ด๋ค.
- ๋งค๊ฐ๋ณ์ ํ์ ์ผ๋ก๋ ํด๋์ค ๋ณด๋ค๋ ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ๋ผ.
์๋ฅผ๋ค์ด ์ค๋ณต์ด ์๋ ์งํฉ ์๋ฃํ์ ์ฌ์ฉํ๊ธฐ ์ํด LinkedHashSet ํด๋์ค๋ฅผ ์ด๊ธฐํ ํ๋ คํ ๋, ์ด๋ ๊ฐ์ฒด์ ํ์ ์ ๋๊ฐ์ด LinkedHashSet ์ผ๋ก ํ์ง๋ง๊ณ ์ธํฐํ์ด์ค์ธ Set ํ์ ์ผ๋ก ์ค์ ํ์ฌ ์ ์ธํ๋ ๊ฒ์ด๋ค.
// ๋์ ์) ํด๋์ค๋ฅผ ๋ฐ๋ก ํ์
์ผ๋ก ์ฌ์ฉํ๋ค.
LinkedHashSet<Object> s = new LinkedHashSet<>();
// ์ข์ ์) ์ธํฐํ์ด์ค๋ฅผ ํ์
์ผ๋ก ์ฌ์ฉํ๋ค.
Set<Object> s = new LinkedHashSet<>();
์ด๋ฐ์์ผ๋ก ์ฝ๋ ๊ตฌํ์ ํด๋๋๋ค๋ฉด, ๋์ค์ ๋ณ์์ ๋ด๊ธด ๊ตฌํ ํด๋์ค๋ฅผ ๋ค๋ฅธ Set ์๋ฃํ ํด๋์ค๋ก ๊ต์ฒดํ๊ณ ์ ํ ๋ ๊ทธ์ ์ ํด๋์ค์ ์์ฑ์๋ฅผ ๋ค์ ํธ์ถํด์ฃผ๊ธฐ๋ง ํ๋ฉด ๋์ด ๊ฐํธํด์ง๋ค.
// ๋ณธ๋ LinkedHashSet์ผ๋ก ๊ตฌํํ์๋ค๊ฐ ์ฌ์ ์ด ์๊ฒจ TreeSetํด๋์ค๋ก ๋ณ๊ฒฝํด์ผํ๋ค๊ณ ํ๋ฉด, ๊ทธ๋ฅ ์ธํฐํ์ด์ค ํ์
์ ๋ณ์์ ์ฌํ ๋น๋ง ํ๋ฉด ๋๋ค
Set<Object> s = new LinkedHashSet<>();
s = new TreeSet<>();
ํ์ง๋ง ์ด๋ฐ์์ผ๋ก ์ธํฐํ์ด์ค ํ์ ์ผ๋ก ์ ์ธํ๋ ์ต๊ด์ ๊ผญ ์ข์ ๊ฒ๋ง ์๋ ๊ฒ๋ ์๋๋ฐ, ๋์ ์์ ๊ฒฝ์ฐ LinkedHashSet์ HashSet์ผ๋ก ๋ณํํ๋ฉด, LinkedHashSet ๊ณผ ๋ฌ๋ฆฌ HashSet์ ๋ฐ๋ณต์์ ์ํ ์์๋ฅผ ๋ณด์ฅํ์ง ์๊ธฐ ๋๋ฌธ์ ๋์ค์ ๋ก์ง์ ๋ฌธ์ ๊ฐ ๋ ์ ์๊ธฐ๋ ํ๋ค.
์ด๋ฐ์๋ ์ธํฐํ์ด์ค๋ ๋ณ์ ์ ์ธ ํ์ ์ ๋์ด์, ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ๋ ๋ฉ์๋์ ๋ฆฌํด ํ์ ์ผ๋ก๋ ์ฆ๋นํ๊ฒ ์ฌ์ฉ๋๋ค.
์ด ์ญ์ ์ถ์ ํด๋์ค๋ ์์์ ์ด์ฉํ๋ ๊ฒ๊ณผ ์ฐจ์ด๊ฐ ์์ง๋ง ์ญ์ ์ธํฐํ์ด์ค์ ์ ์ธ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง ๊ฐ์ฒด์ด๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์ข ๋ ํ์ฅ์ฑ ์๋ ๊ตฌ์กฐ๊ฐ ๋๊ณ ์์์ ๋จ์ ์ ๋ณด์ํ๋ ๋ฐฉ์์ ์ค๊ณ๊ฐ ๊ฐ๋ฅํด์ง๋ค.
๊ทธ์ธ์๋ ์๋ฐ์ ๋คํ์ฑ ํ์ฉ๋ฒ์ ๋ํด์๋ ๋ค์ ํฌ์คํ ์ ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋๋ค.
[OOP] ๐ ์๋ฐ์ ๋คํ์ฑ(Polymorphism) ์๋ฒฝ ์ดํดํ๊ธฐ
๋คํ์ฑ (Polymorphism) ๋คํ์ฑ(ๅคๅฝขๆง) ์ด๋, ๊ทธ ์์ฒด์ ์๋ฏธ๋ฅผ ํ์ค ๊ตญ์ด์ฌ์ ์์ ์ฐพ์๋ณด๋ฉด, '๊ฐ์ ์ข ์ ์๋ฌผ์ด๋ฉด์๋ ์ด๋ค ํํ๋ ํ์ง์ด ๋ค์ํ๊ฒ ๋ํ๋๋ ํ์' ์ด๋ผ ์ ์๋์ด ์๋ค. ์ด๋ฅผ ํ๋ก
inpa.tistory.com
๋ง์ง๋ง์ผ๋ก ๋ฌด์๋ณด๋ค ์ธํฐํ์ด์ค์ ๋คํ์ฑ์ ๊ฐ์ฅ ํฐ ํน์ง์ ๋ฐ๋ก ๋ค์ค ๊ตฌํ์ ํตํ ์์ ๋ก์ด ์์ ๊ด๊ณ๋ฅผ ๋ง๋ค์ด ํด๋์ค์ ๋คํ์ฑ๋ณด๋ค ๋์ฑ ๋ค์ฑ๋กญ๊ฒ ๊ทธ๋ฆฌ๊ณ ์์ ๋กญ๊ฒ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค.
์๋ฌด๋๋ ํด๋์ค์ ๋คํ์ฑ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋์ค์ ์์์ ๊ธฐ๋ฐ์ ๋๊ธฐ ๋๋ฌธ์, ํด๋์ค ์์์ ํ๋ฒ๋ฐ์ ์๋๋ฉฐ ๋ํ ํด๋์ค๋ผ๋ฆฌ ์๋ฏธ์๋ ์ฐ๊ด ๊ด๊ณ๊ฐ ์์ด์ผ ๋์ด ์ฌ๋ฌ๋ชจ๋ก ์ ์ฝ์ด ๋ง๋ค. ๊ทธ๋ฌ๋ ์ธํฐํ์ด์ค๋ ์ธ์ ์ด๋์๋ ๋ง์๋๋ก implements๋ฅผ ์ฌ๋ฌ๊ฐ ์ถ๊ฐํ๊ฑฐ๋ ๋นผ๊ฑฐ๋ ํ ์ ์์ผ๋ ์ ์ฝ์ผ๋ก๋ถํฐ ๋ง์ด ์์ ๋ก์ ์ง๋ค.
์ด๋ฅผ ์ด์ฉํ ์์๊ฐ ๋ฐ๋ก ๋ค์์ ์๊ฐํ ํด๋์ค๋ผ๋ฆฌ ํ์ ๊ด๊ณ๋ฅผ ๋งบ๊ฒ ํด์ฃผ๊ฑฐ๋ ์์์ ๋์ด์ ํ์ ์ ํ๋ ๊ฐ๋ฅํ๊ฒ ๋๋ค.
ํ์ ๊ด๊ณ๋ฅผ ๋งบ์ด์ค
๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฐ์ ํด๋์ค ์์ ๊ตฌ์กฐ๋ ๋ถ๋ชจ - ์์ ๊ด๊ณ๋ก๋ง ๊ฐ๋ฅํ๊ฒ ๋์ด ์๋ค.
๋ง์ผ ์ฌ๋ฌ ์์๋ค๋ผ๋ฆฌ ์๋ฏธ์๋ ๊ด๊ณ๋ฅผ ๋งบ๊ณ ์ถ๋ค๋ฉด ๋๋ค๋ฅธ ๋ถ๋ชจ๋ฅผ ๋์ด ๋ค์ ๋ถ๋ชจ - ์์ ๊ด๊ณ๋ฅผ ๊ณ์ธตํ์ผ๋ก ๋ง๋ค์ด ์ฃผ์ด์ผ ํ๋ค. ๊ทธ๋ฌ๋ ์๋ฐ์ ํด๋์ค ์์ ๊ตฌ์กฐ๋ ๋จ์ผ ์์์ ์์น์ ๊ฐ๊ธฐ ๋๋ฌธ์, ๋ง์ผ ์ฌ์ฉํ๋ ํด๋์ค๋ค์ด ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ถ๋ชจ ํด๋์ค๋ฅผ ์์ํ๊ณ ์๋ ์ํฉ์ด๋ฉด ์์ ์๋ฃํ ํ์ ํตํฉ์ ํ ์๊ฐ ์๊ฒ ๋๋ค.
ํ์ง๋ง ์ธํฐํ์ด์ค๋ ํด๋์ค ์์ ๊ด๊ณ์๋ ๋ฌ๋ฆฌ, ํ๋์ ๊ธฐ๋ฅ์ ๋ํ ์ฝ์์ด๊ธฐ ๋๋ฌธ์ ์ด๋ค ๊ฐ์ฒด์ด๋ ๊ฐ์ ๊ทธ ์ฝ์์ ์งํค๊ธฐ๋ง ํ๋ค๋ฉด ํ์ํ ๊ณณ์์ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ธํฐํ์ด์ค๋ ๋ค์ค ์์์ ๋ํด ์ ์ฝ์ ๋ฐ์ง ์๊ธฐ ๋๋ฌธ์, ์ผ๋ถ๋ง ๋ฌถ๊ณ ์ถ์ ํด๋์ค๋ค์ implements ํค์๋๋ก ๋ฑ๋ก์ํค๋ฉด, ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ถ๋ชจํด๋์ค๋ฅผ ์์ํ๊ณ ์๋ ์์ ํด๋์ค์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํ(์์) ์์ผ์ค์ผ๋ก์จ ํ์ ํด๋์ค ๋ผ๋ฆฌ ๋ฌถ๋ ํ์ ํตํฉ์ ์ด๋ฃจ์ด ๋ผ์ ์๋ ๊ฒ์ด๋ค.
์ฆ, ์๋ฌด ๊ด๊ณ๋ ์๋ ํด๋์ค๋ค์๊ฒ ํ๋์ ์ธํฐํ์ด์ค๋ฅผ ๊ณตํต์ ์ผ๋ก ๊ตฌํํ๋๋ก ํจ์ผ๋ก์จ ๊ด๊ณ๋ฅผ ๋งบ์ด์ค ์ ์๋ค.
์๋ฅผ ๋ค์ด ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ถ๋ชจ ํด๋์ค๋ฅผ ์์ํ๊ณ ์๋ Soccer ํด๋์ค์ BassGuitar ํด๋์ค๋ฅผ ํ๋์ ํ์ ์ผ๋ก ๋ฌถ์ด์ ์ฌ์ฉํ ํ์๊ฐ ์์๋, ์ธํฐํ์ด์ค๋ฅผ implements ํจ์ผ๋ก์จ ๋ง์น Soccer ์ BassGuitar ํด๋์ค๋ฅผ ๋ฌถ์ ํ์ ํด๋์ค ํ์ IBehavior ๋ฅผ ๋ง๋ ๊ฒ๊ณผ ๊ฐ๋ค.

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

ํ์ ์ ๊ทผ ์ ํ
์ด์ธ์๋ ์ธํฐํ์ด์ค๋ ์ผ์ข ์ ์ ๊ทผ ์ ํ ์ญํ ๋ ํ ์ ์๋ค.
์ด๋ ์์ ํ์ ๊ด๊ณ ์ญํ ๊ณผ ๋งค์ฐ ๋น์ทํ ๊ฐ๋ ์ธ๋ฐ, ๋ง์ผ ๋๊ฐ์ ๋ถ๋ชจ๋ฅผ ์์ํ๊ณ ์๋ 3๊ฐ์ ์์๋ค์ค, 2๊ฐ์ ์์ ํด๋์ค ํ์ ๋ง ๋ฐ์ ์ ์๋ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ค๊ณ ํ์๋ ์ด์ฉ๋๋ค.
๋คํ์ฑ์ด๋์๊ณ ๋ถ๋ชจ ํด๋์ค ํ์ ์ผ๋ก ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์๋ฒ๋ฆฌ๋ฉด, ๋ชจ๋ ์์ ํด๋์ค๊ฐ ์ ๊ทผ์ด ๊ฐ๋ฅํ์ง ๋๋ฌธ์ ์ ํ์ด ๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด ๋ถ๋ถ์ ๋ฐ๋ก ์ฝ๋ ์์๋ฅผ ๋ณด๋ ๊ฒ์ด ํจ์ฌ ์ดํดํ๊ธฐ ์ฌ์ธ ์ ์๋ค.
๋ค์๊ณผ ๊ฐ์ด ์คํํฌ๋ํํธ๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํด Marine, SCV, Tank ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ์ด๋ค์ ๊ณตํต์ผ๋ก ๋ฌถ์ ๋ถ๋ชจ ํด๋์ค GroundUnit ํด๋์ค๋ก ์์ ๊ด๊ณ๋ฅผ ๋งบ์ด ์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ repair() ๋ฉ์๋์์ ์ค๋ณต์ ์ค์ด๊ธฐ ์ํ ๋คํ์ฑ ๊ธฐ๋ฒ์ผ๋ก ๋งค๊ฐ๋ณ์ ํ์
์ GroundUnit ๋ถ๋ชจ ํด๋์ค ํ์
์ผ๋ก ๋ฐ๋๋ก ์ค์ ํ์๋ค.
class GroundUnit { }
class Marine extends GroundUnit{ }
class SCV extends GroundUnit{ }
class Tank extends GroundUnit{ }
public class Main {
public static void main(String[] args) {
repair(new Marine());
}
static void repair(GroundUnit gu) {
// ๋ง๋ฆฐ์ ๊ธฐ๊ณ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์๋ฆฌ๋ ๋ถ๊ฐ๋ฅ ํ๋ค. ํ์ง๋ง ์์ ๊ด๊ณ์ ๋ง๋ฆฐ ํด๋์ค ํ์
์ด ๋ค์ด์ ์คํ๋ ์ ์๋ ์ํ์ฑ์ด ์กด์ฌํ๋ค.
}
}
ํ์ง๋ง ์์ ์ฝ๋์ ๋ฌธ์ ์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก repair ๊ธฐ๋ฅ์ ๊ธฐ๊ณ ์ ๋๋ง ๊ฐ๋ฅํ์ฌ SCV์ Tank ํด๋์ค ํ์ ๋ง ๋ค์ด์์ผ ๋๋๋ฐ ์๋ฌผ ์ ๋์ธ Marine ํด๋์ค ํ์ ๋ ์์ ๊ด๊ณ์ ์ํด ๋ค์ด ์ฌ์ ์๋ค๋ ๊ฒ์ด๋ค.
์๋ฌด๋ฆฌ ํ์ดํธํ๊ฒ ์ฝ๋ฉ์ ํด๋ ๊ฐ๋ฐ์๋ ๊ฒฐ๊ตญ์ ์ฌ๋์ด๊ณ , ์ฌ๋์ ๊ฒฐ๊ตญ์ ์ค์๋ฅผ ๋ฒํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ ์ ๊ทผํ์ง ๋ชปํ๋๋ก ์์ฒ ์ฐจ๋จํ๋ ๊ฒ์ด ์ค์ํ๋ค.
๋ฐ๋ผ์ ๋ณ๋์ Machine ์ด๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ์ธํ๊ณ SCV, Tank ํด๋์ค์ implements ์ํจ๋ค.
๊ทธ๋ ๊ฒ 3๊ฐ์ ์์์ค 2๊ฐ์ ์์๋ง ๋จธ์ ์ด๋ผ๋ ํ์ ์ผ๋ก ํ์ ํ์ ๊ด๊ณ๋ฅผ ๋งบ์ด์ฃผ๋ฉด์ ๋์์ ๋ค๋ฅธ ํ์ ์ ์ ๊ทผ ์ ํ ์ญํ ๋ ํด๋ธ ๊ฒ์ด๋ค.
interface Machine { } // SCV, Tank ํด๋์ค๋ฅผ ํตํฉํ ํ์
์ผ๋ก ์ด์ฉํ๋ ์ธํฐํ์ด์ค
class GroundUnit { }
class Marine extends GroundUnit{ }
class SCV extends GroundUnit implements Machine{ }
class Tank extends GroundUnit implements Machine{ }
public class Main {
public static void main(String[] args) {
repair(new Marine()); // ! ERROR
}
static void repair(Machine gu) {
// SVG์ ํฑํฌ ํ์
๋ง ๋ฐ์ ์ ์๊ฒ ์ธํฐํ์ด์ค๋ฅผ ํ์
์ผ๋ก ํ์ฌ ๋คํ์ฑ์ ์ ์ฉ
}
}
๋ฉ์๋ ์ ๊ทผ ์ ํ
์ด๋ฐ์๋ ๊ฐ์ฒด์์ ์ฌ์ฉํ ์ ์๋ ๋ฉ์๋๋ฅผ ์ ํ ํ๋ ํจ๊ณผ๋ ์๋๋ฐ, ์๋ฅผ๋ค์ด A, B, C๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค๋ฅผ ๋ฐํํ ๋ A ํ์ ์ผ๋ก ๋ณํํ๊ฒ ๋๋ฉด ์ธ๋ถ์์๋ A ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ง ๋ณด์ด๊ฒ ๋๋ค. ๋ฐ๋ผ์ ๋ณ๋์ ์ ๊ทผ ์ ํ์ ์ด์ฉํ์ง ์๊ณ ๋ ์ฌ์ฉํ ์ ์๋ ๋ฉ์๋ ์ ๊ทผ ์ ํ๊ณผ ๋ง์ฐฌ๊ฐ์ง ํจ๊ณผ๋ฅผ ๋ณด๊ฒ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ด๋ฐ ์ด์ ๋ก ์คํ๋ ค ๊ฑฐ๊พธ๋ก ํด๋์ค์ ์ฌ๋ฌ ๊ฐ์ง ๋ฉ์๋๋ฅผ ๋ง๋ค์ด ๋ ๋ค์ ์ธํฐํ์ด์ค๋ก ๋ถ๋ฆฌํ๋ ์์ ์ ์งํํ๋ ๊ฒฝ์ฐ๊ฐ ๊ฐ๋ ์๋ค.
interface PlayMovie {
void play();
}
interface ViewImage {
void view();
}
interface VolumeUpDown {
void volume();
}
class MP3 implements PlayMovie, ViewImage, VolumeUpDown {
public void play() {}
public void view() {}
public void volume() {}
}
public class Main {
public static void main(String[] args) {
PlayMovie mp3 = new MP3(); // 3๊ฐ์ ๊ตฌํํ ์ธํฐํ์ด์ค์ค ํ๋๋ก ๊ฐ์ฒด ์ ์ธ
mp3.play(); // play() ์ด์ธ์ ๋ฉ์๋๋ ์ ํ๋๋ค.
}
}
์์กด์ฑ์ ์ ๊ฑฐ (decoupling)
์์กด์ฑ์ด๋ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์์ฃผ ์ค์ํ ๊ฐ๋ ์ผ๋ก ๊ฐ์ฒด๊ฐ ์ด๋ป๊ฒ ์ํตํ๋์ง ๋ํ๋ด๋ ๊ฒ์ด๋ค.
๋ง์ผ ์ฝ๋ ์ค๊ณ๋ฅผ ๊ตฌ์ฒด ํด๋์ค๋ก ํ๊ฒ ๋๋ฉด ๊ฐ์ฒด๊ฐ์ ๊ฐํ ์์กด์ฑ์ด ์๊ธฐ๊ฒ ๋์ด ๋ง์ผ ์ฝ๋ ๋ณ๊ฒฝ์ด ํ์ํ๊ฒ ๋๋ฉด ์ด๊ฒ์ ๊ฒ ์ฌ๋ฌ๊ฐ์ง ๋ณ๊ฒฝ์ด ํ์ํด์ง ์ ๋ ์๋ค. ๋ฐ๋ผ์ ํด๋์ค ๊ฐ์ ๊ด๊ณ๋ฅผ ๊ตฌ์ฑํ ๋ ๊ทธ ๊ด๊ณ๋ฅผ ๋์จํ๊ฒ ํ๋ ๊ฒ์ด ์ค์ํ๋ค.
๊ทธ๋์ ํด๋์ค์ ๊ด๊ณ๋ฅผ ์์(extends)๊ฐ ์๋ ๊ตฌํ(implements)์ผ๋ก ์ธํฐํ์ด์ค๋ก ํ์ฅ์ํจ๋ค๋ฉด, ๋ฐํ ํ์ ์ด๋ ๋งค๊ฐ๋ณ์ ํ์ ์ผ๋ก ๋ค๋ฅธ ๊ฐ์ฒด์ ์ํตํ๋ ๊ตฌ๊ฐ์ ์ธํฐํ์ด์ค ํ์ ์ผ๋ก ์ฌ์ฉํจ์ผ๋ก์จ, ๊ฐ์ฒด๊ฐ ์์กด์ฑ์ด ์ค์ด๋ค์ด ์์ ๊ณผ ์ํตํ๋ ๊ฐ์ฒด์ ๋ณํ์ ๊ฐํ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์๊ฒ ๋๋ค.

์ด๋ฐ ์์กด์ฑ์ ๊ณผ๊ฑฐ๋ถํฐ ์์๋ ๋ง์ Framework์์ ๋ฐ์ ํด MVC, MVVM ํจํด๋ฑ์ผ๋ก๋ ์นํ ๋์๊ณ depedecny injection๋ฑ์ ๊ธฐ์ ๋ก๋ ์ฌ์ฉ๋๋ค.
์ธํฐํ์ด์ค ํ์ ์ผ๋ก ํต์
์๋ฅผ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๊ฐ ์๋ค๊ณ ํ์.
ServiceLogic ํด๋์ค์ ๋ฉ์๋ printInt() ๋ฅผ ๋ณด๋ฉด ํ๋ผ๋ฏธํฐ๋ก MapStore ํด๋์ค ํ์
์ ๋ฐ์ MapStore ํด๋์ค์ ๋ฉ์๋๋ฅผ ์คํํด ๊ฐ์ ์ป๊ณ ์ถ๋ ฅํ๋ ๋ก์ง์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
์ด๋ฌํ ํํ๋ฅผ ServiceLogic ํด๋์ค๋ MapStore ํด๋์ค์ ์์กด์ ์ด๋ค ๋ผ๊ณ ๋งํ๋ค. ์๋ํ๋ฉด MapStore ํด๋์ค๊ฐ ์๋ชป๋๋ฉด ServiceLogic ํด๋์ค์ ๋ฉ์๋๋ ๋์ํ์ง ์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
class ServiceLogic {
// ServiceLogic ํด๋์ค์ ๋ฉ์๋๋ MapStore ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ServiceLogic ๋ MapStore ์ ์์กด์ ์ด๋ค.
public void printInt(MapStore cls) { // ์ง์ ํ ํด๋์ค ํ์
๋ง ๋ฐ์
int num = cls.getNum() * 2;
System.out.println(num);
}
}
class MapStore {
private int num = 10;
public int getNum() {
return this.num;
}
}
๋ฐ๋ผ์ ์ด๋ฌํ ์์กด์ฑ ๊ด๊ณ๋ฅผ ์์ ๊ธฐ ์ํด ClubStore ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค๊ณ MapStore ํด๋์ค์ implements ํ์ฌ ๊ตฌํํ๋ค. ๊ทธ๋ฌ๋ฉด ServiceLogic ํด๋์ค์์ ๋ง์ผ MapStore ๊ฐ์ฒด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ผ์ด ์๊ธธ๊ฒฝ์ฐ, ์ง์ MapStore ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋๊ฒ ์๋ ์ค๋ก์ง ClubStore ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํด ํต์ ํจ์ผ๋ก์จ ํด๋์ค ๊ฐ์ ์์กด์ฑ์ ์์จ ์ ์๋ ๊ฒ์ด๋ค.
์ด๊ฒ์ ๋ณ๊ฒฝ์ ์ ๋ฆฌํ ์ ์ฐํ ์ค๊ณ๋ผ๊ณ ๋ ํ๋ค.

interface ClubStore {
int getNum(); // ์ธํฐํ์ด์ค ํ์
์ํ์ ๊ฐ์ฒด์์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ ์ธํฐํ์ด์ค์๋ ์ถ์ ๋ฉ์๋ ํํ๋ก ๋ฃ์ด์ ธ ์ด์ฝ์ผ ํ๋ค.
}
class ServiceLogic {
// ServiceLogic ํด๋์ค์ ๋ฉ์๋๋ ClubStore ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ํด๋์ค ๊ฐ์ ์์กด์ฑ์ ์์ด๋ค.
public void printInt(ClubStore cls) {
int num = cls.getNum() * 2;
System.out.println(num);
}
}
class MapStore implements ClubStore{
private int num = 10;
public int getNum() {
return this.num;
}
}
ํ์คํ
๊ฐ๋ฐ ์๊ฐ์ ๋จ์ถ
์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋์ค์ ์ ์ธ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌ์ํฌ ์ ์๊ธฐ ๋๋ฌธ์ ์ค์ ๊ตฌํ์ ๋ ๋ฆฝ์ ์ธ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
์๋ฅผ ๋ค์ด ๊ธฐ์กด์ ํด๋์ค์ ํด๋์ค ๊ฐ์ ์ง์ ์ ์ธ ๊ด๊ณ๋ฅผ, ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํด์ ๊ฐ์ ์ ์ธ ๊ด๊ณ๋ก ๋ณ๊ฒฝํ๋ฉด, ํ ํด๋์ค์ ๋ณ๊ฒฝ์ด ๊ด๋ จ๋ ๋ค๋ฅธ ํด๋์ค์ ์ํฅ์ ๋ฏธ์น์ง ์๋ ๋ ๋ฆฝ์ ์ธ ํ๋ก๊ทธ๋๋ฐ์ด ๊ฐ๋ฅํ๋ค.
๋ฐ๋ผ์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ์ชฝ์์๋ ์ ์ธ ๋ถ๋ง ์๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์ธํฐํ์ด์ค๋ง ๊ฐ์ง๊ณ ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ ์ ์์ผ๋ฉฐ, ๋์์ ๋ค๋ฅธ ํ์ชฝ์์๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ฅผ ์์ฑํ๋ฉด ์ธํฐํ์ด์ค์ ๊ตฌํ์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์์ ์ด ๊ฐ๋ฅํ๋ค.
์ฆ, A๊ฐ Bํด๋์ค์ ๊ตฌ์ฑ ์์ฑ์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ , ์ค๊ณ๋์ธ ์ธํฐํ์ด์ค๋ฅผ ๋ณด๊ณ ๋์์ ๊ฐ๋ฐ์ ํจ์ผ๋ก์จ ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ฐ๋ฐ ์๊ฐ์ ๋จ์ถ ์ํฌ ์ ์๋ ๊ฒ์ด๋ค.

์ฌ์ค ์ด๋ ์ถ์ ํด๋์ค ํน์ง๊ณผ ๊ฒน์น๋ ๋ถ๋ถ๊ธฐ์ด๋ ํ๋ฐ, ์ธํฐํ์ด์ค๋ ๊ฒฐ๊ตญ ์ถ์ํ ํด๋์ค์ ์ผ์ข ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
๋์ค์ ๋ณ๊ฒฝ์ด ์ฉ์ดํจ
๋ํ ํ๋ก์ ํธ์ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ ํ์ ์ธํฐํ์ด์ค๋ก ์์ฑํ ๋ค์ ๊ฐ๋ฐ์๋ค์๊ฒ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ ํ๋ก๊ทธ๋จ์ ์ง๋๋ก ํ๋ฉด ๋ณด๋ค ์ผ๊ด๋๊ณ ์ ํํ๋ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํ๋ค.
์๋ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธํฐํ์ด์ค์ธ JDBC๊ฐ ๋ํ์ ์ธ๋ฐ, ์ด ์ถ์ํ๋ ์ธํฐํ์ด์ค ๊ท์น์ ๋ฐ๋ผ ๋ค์ํ ์ข ๋ฅ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ์ธํฐํ์ด์ค ๊ตฌํ๋ง ์ํ๋ฉด ๋์ผํ๊ฒ ์ ์ํ ์ ์๋ ์ด์ ์ด๊ธฐ๋ ํ๋ค.

์๋ฅผ๋ค์ด ์ด๋ ์๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ์ด ์๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ MySQL์ ์ฌ์ฉํ๊ณ ์์๋๋ฐ, ๋ง์ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ MySQL์์ Oracle๋ก ๋ณ๊ฒฝํ๋ค๊ณ ํ๋ค๊ณ ๊ฐ์ ํ์.
๋ณธ๋๋ผ๋ฉด ์๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ์ DB ์ปค๋ฅ์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผ ๋๋๋ฐ, ์ด๋ฅผ ์๋ฐ์์๋ JDBC ๋ผ๋ ์ธํฐํ์ด์ค ๊ทธ๋ฃน์ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ด๊ณ ์ค๊ฐ๋ฅผ ํตํด ํต์ ํ๋ค. ๊ทธ๋์ ์๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฅ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ข ๋ฅ๋ ๋ชจ๋ฅด๊ณ ์ค๋ก์ง ์ธํฐํ์ด์ค ๊ธฐ์ค์ผ๋ก ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ฐ๊ณ ์์ ์ ํ๊ฒ ๋๋ค.๊ทธ๋ฆฌ๊ณ ๊ฐ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์กฐ ๋ฐด๋์ฌ๋ค์ ์์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ตฌํ ํด๋์ค๋ค์ ๋ฐ๋ก ๋ง๋ค์ด ์๋ฐ ์ธ์ด์ ์ ์ฐ๊ฒฐ๋๊ฒ ์ง์ํ๋ค.
๋ฐ๋ผ์ MySQL์ ์ฐ๋ค๊ฐ Oracle์ ์ด๋ค๊ณ ํ๋ค๋ฉด, ๊ธฐ์กด์ ์ฐ๊ณ ์๋ ์ค๋ผํด์์ ์ ๊ณตํ๋ ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ MySQL ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ผ๋ก ๋ฐ๊พธ๊ณ ์ฝ๊ฐ ์ค์ ๋ง ํด์ฃผ๋ฉด ๋ณต์กํ ์์ ์์ด ๋ณ๊ฒฝ์ด ์๋ฃ๋๋ ๊ฒ์ด๋ค.
๋ง์ผ ์ธํฐํ์ด์ค๋ผ๋ ๊ด๊ณ ์ค๊ฐ ๊ฐ ์๋ค๋ฉด ํ๋ ์ฝ๋ฉํ ๊ฒ์ ํต์งธ๋ก ๋ฐ๊ฟ์ผ ํ ์ง๋ ๋ชจ๋ฅธ๋ค.
์ด๊ฒ์ด ์๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธํฐํ์ด์ค๋ผ๋ 'ํ์คํ' ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
๋ง์ปค ์ธํฐํ์ด์ค
์๋ฐ์ ๋ง์ปค ์ธํฐํ์ด์ค๋ ์ผ๋ฐ์ ์ธ ์ธํฐํ์ด์ค์ ๋์ผํ์ง๋ง ์ฌ์ค์ ์๋ฌด ๋ฉ์๋๋ ์ ์ธํ์ง ์์ ๋น ๊ป๋ฐ๊ธฐ ์ธํฐํ์ด์ค๋ฅผ ๋งํ๋ค.
์๋ฅผ ๋ค๋ฉด ์๋์ ๊ฐ๋ค.
interface XXXable{ // ์๋ฌด๋ฐ ๋ด๋ถ ๋ด์ฉ์ด ์๋ ๋น ๊ป๋ฐ๊ธฐ ์ธํฐํ์ด์ค
}
์ผํ ๋ณด๊ธฐ์ ์ธํฐํ์ด์ค์ ์กด์ฌ ์๋ฆฌ์ ๋ฐํ๋ ํํ์ด๋ค.
๋ค๋ง ์ธํฐํ์ด์ค๋ฅผ ์์ ๋กญ๊ฒ ๋ค์ค ์์์ด ๊ฐ๋ฅํ๋ค๋ ์ ์์ ์ฐฉ์ํ์ฌ ์ด๋ฌํ ํํ๋ก๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
์๋ฌด ๋ด์ฉ๋ ์์ด์ ์ธ๋ชจ๊ฐ ์์ด ๋ณด์ด์ง๋ง, ๋ง์ปค ์ธํฐํ์ด์ค์ ์ญํ ์ ๊ฐ์ฒด์ ํ์ ๊ณผ ๊ด๋ จ๋ ์ ๋ณด๋ง์ ์ ๊ณตํด์ฃผ๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ์ปดํ์ผ๋ฌ์ JVM์ ์ด ๋ง์ปค ์ธํฐํ์ด์ค๋ฅผ ํตํด ๊ฐ์ฒด์ ๋ํ ์ถ๊ฐ์ ์ธ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ค.
๋ค์ ์์ ์ฝ๋๋ฅผ ๋ด๋ณด์.
์์ ํด๋์ค Animal์ ๋ง๋ค๊ณ ๊ทธ ํ์๋ค๋ก Lion, Chicken, Snake ...๋ฑ ์ฌ๋ฌ๊ฐ์ง ๋๋ฌผ ํด๋์ค๋ค์ ๋ง๋ค์ด ์์ ๊ด๊ณ๋ฅผ ๋งบ์๋ค. ์ด๋ born ์ด๋ผ๋ ๋ฉ์๋์์ Animal ํ์ ์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๊ณ ์๋ผ๋ฅผ ๋ณ๋ ๋๋ฌผ์ธ์ง ์์ ๋ณ๋ ๋๋ฌผ์ธ์ง ๊ตฌ๋ถํ๊ธฐ ์ํด ์ผ์ผํ instanceof ์ฐ์ฐ์๋ก ํด๋์ค ํ์ ์ ๊ตฌ๋ถํ์๋ค.
class Animal {
public static void born(Animal a) {
if(a instanceof Lion) {
System.out.println("์๋ผ๋ฅผ ๋ณ์์ต๋๋ค.");
} else if(a instanceof Chicken) {
System.out.println("์์ ๋ณ์์ต๋๋ค.");
} else if(a instanceof Snake) {
System.out.println("์์ ๋ณ์์ต๋๋ค.");
}
// ...
}
}
class Lion extends Animal { }
class Chicken extends Animal { }
class Snake extends Animal { }
ํ์ง๋ง ์ด๋ฌํ ๋ฐฉ์์ ์์ ํด๋์ค ๊ฐฏ์๊ฐ ๋ง์ผ๋ฉด ๋ง์ ์๋ก ์ฝ๋๊ฐ ๋์กํด์ง๊ณ ๊ธธ์ด์ง๋ค๋ ๋จ์ ์ด ์๋ค.
๋ฐ๋ผ์ ์๋ฌด๋ฐ ๋ด์ฉ์ด ์๋ ๋น ๊ป๋ฐ๊ธฐ ์ธํฐํ์ด์ค๋ฅผ ์ ์ธํ๊ณ ์ ์ ํ ํด๋์ค์ implements ์ํด์ผ๋ก์จ, ์ถ์ํ, ๋คํ์ฑ ์ด๋ฐ๊ฑธ ๋ ๋์ ๊ทธ๋ฅ ๋จ์ํ ํ์ ์ฒดํฌ์ฉ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฉด ์กฐ๊ฑด๋ฌธ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌํํด์ง ์ ์๋ค.
// ์๋ผ๋ฅผ ๋ฎ์ ์ ์๋ค๋ ํ์ ์ญํ ์ ํด์ฃผ๋ ๋ง์ปค ์ธํฐํ์ด์ค
interface Breedable {}
class Animal {
public static void born(Animal a) {
if(a instanceof Breedable) {
System.out.println("์๋ผ๋ฅผ ๋ณ์์ต๋๋ค.");
} else {
System.out.println("์์ ๋ณ์์ต๋๋ค.");
}
}
}
class Lion extends Animal implements Breedable { }
class Chicken extends Animal { }
class Snake extends Animal { }
์ด๋ฌํ ๋ง์ปค ์ธํฐํ์ด์ค์ ๋ํ์ ์ธ ์๋ฐ ์ธํฐํ์ด์ค๋ก๋ Serializable, Cloneable ์ ๋ ์๋ค.
์ธํฐํ์ด์ค ์ ์ถ์ํด๋์ค ์ฐจ์ด์
[JAVA] โ ์ธํฐํ์ด์ค vs ์ถ์ํด๋์ค ์ฐจ์ด์ - ์๋ฒฝ ์ดํดํ๊ธฐ
์ธํฐํ์ด์ค vs ์ถ์ํด๋์ค ๋น๊ต ์ด ๊ธ์ ์ฐพ์๋ณด๋ ๋ ์๋ถ๋ค์ ์๋ง๋ ์ด๋ฏธ ์ธํฐํ์ด์ค์ ์ถ์ํด๋์ค ๊ฐ๋ ์ ํ์ตํ ๋ค์ ์ด ๋์ ๋ํ์ฌ ์ฐจ์ด์ ๋ชจํธํจ ๋๋ฌธ์ ๋ฐฉ๋ฌธ ํ๊ฒ ์ง๋ง, ๊ทธ๋๋ ๋ค์ํ๋ฒ
inpa.tistory.com
# ์ฐธ๊ณ ์๋ฃ
https://www.youtube.com/watch?v=teABcIl_GBM
https://www.youtube.com/watch?v=VuJHRyIq-w0&list=WL&index=14
https://stackoverflow.com/questions/28520164/why-are-interfaces-helpful
https://smoothiecoding.kr/%ec%9e%90%eb%b0%94-%ec%9d%b8%ed%84%b0%ed%8e%98%ec%9d%b4%ec%8a%a4-%eb%8b%a4%ec%a4%91-%ea%b5%ac%ed%98%84/?_ga=2.226971741.1970575914.1663379482-1400978808.1663379482
https://www.geeksforgeeks.org/interfaces-and-inheritance-in-java/
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.