๐ก ํ๋์ ์ธ์คํด์ค๊ฐ ์ฌ๋ฌ ๊ฐ์ง ํ์ ์ ๊ฐ์ง ์ ์๋ ๊ฒ์ ์๋ฏธํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํ๋์ ํ์ ์ผ๋ก ์ฌ๋ฌ ํ์ ์ ์ธ์คํด์ค๋ฅผ ์ฒ๋ฆฌํ ์ ์๊ธฐ๋ ํ๊ณ , ํ๋์ ๋ฉ์๋ ํธ์ถ๋ก ๊ฐ์ฒด๋ณ๋ก ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ๋์ํ๊ฒ ํ ์ ๋ ์๋ค.
๋คํ์ฑ์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ 3๋ ํน์ง(์บก์ํ, ์์, ๋คํ์ฑ) ์ค ํ๋์ด๋ฉฐ, ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๊ฝ์ด๋ผ๊ณ ๋ถ๋ฆฌ์ธ ์ ๋๋ก ํ์ฉ์ฑ์ด ๋๊ณ ์ฅ์ ์ด ๋ง๋ค.
A. ์ฌ๋ฌ ํ์ ์ ๊ฐ์ฒด๋ฅผ ํ๋์ ํ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ง๋ณด์์ฑ๊ณผ ์์ฐ์ฑ์ด ์ฆ๊ฐ๋๋ค.
B. ์์์ ๊ธฐ๋ฐ์ผ๋ก ํ ๊ธฐ์ ์ด๊ธฐ ๋๋ฌธ์ ์์๊ด๊ณ์ ์๋ ๋ชจ๋ ๊ฐ์ฒด๋ ๋์ผํ ๋ฉ์ธ์ง๋ฅผ ์์ ํ ์ ์๋ค. ์ด๋ฐ ๋์ผํ ๋ฉ์ธ์ง๋ฅผ ์์ ๋ฐ์ ์ฒ๋ฆฌํ๋ ๋ด์ฉ์ ๊ฐ์ฒด๋ณ๋ก ๋ค๋ฅด๊ฒ ํ ์ ์๋ค๋ ์ฅ์ ์ ๊ฐ์ง๊ณ ์๋ค. (๋ค์ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋๋ฐ ์์ด์ ๊ด๋ฆฌํด์ผ ํ๋ ๋ฉ์ธ์ง ์ข ๋ฅ๊ฐ ์ค์ด๋ค๊ฒ ๋๋ค.)
C. ํ์ฅ์ฑ์ด ์ข์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
D. ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถฐ์ ์ ์ง๋ณด์์ฑ์ ์ฆ๊ฐ์ํฌ ์ ์๋ค.
๐ก ์ปดํ์ผ ๋น์์๋ ํด๋น ํ์ ์ ๋ฉ์๋์ ์ฐ๊ฒฐ๋์ด ์๋ค๊ฐ ๋ฐํ์ ์ ์ค์ ํด๋น ์ธ์คํด์ค๊ฐ ๋ฉ์๋(์ค๋ฒ๋ผ์ด๋ฉ ํ ๋ฉ์๋)๋ก ๋ฐ์ธ๋ฉ์ด ๋ฐ๋์ด ๋์ํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
๐ก ์์๊ด๊ณ์ ์์ง๋ง ์ค๋ฒ๋ผ์ด๋ฉ ํ ๊ฒ์ด ์๋ ํ์ ๊ฐ์ฒด๊ฐ ๊ณ ์ ํ๊ฒ ๊ฐ์ง๋ ํ์ฅ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ค์ ์ธ์คํด์ค์ ํ์ ์ผ๋ก ๋ค์ด์บ์คํ (ํด๋์ค ํ๋ณํ)์ ํด ์ฃผ์ด์ผ ํ๋ค.
ํด๋์ค ํ๋ณํ์ ์์ ํ์ ํ๋ณํ(up-casting)๊ณผ ํ์ ํ์ ํ๋ณํ(down-casting)์ด ์๋ค. ์์ ํ์ ํ๋ณํ์ ๊ฒฝ์ฐ ๋ฌต์์ ์ผ๋ก ์ผ์ด๋๋ฉฐ, ํ์ ํ์ ํ๋ณํ์ ๋ช ์์ ์ผ๋ก ์์ฑํด์ผ ํ๋ค.
๐ก ํด๋์ค ํ๋ณํ์ ๊ฒฝ์ฐ ๋ฐํ์์ ์กด์ฌํ๋ ํ์ ๊ณผ ํ๋ณํํ๋ ค๋ ํ์ ์ด ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ ClassCastException์ด ๋ฐ์ํ๋ค. ๊ทธ๋ ๊ธฐ์ ์กฐ๊ธ ๋ ๋ฐํ์ ์ ์์ ํ ํ๋ณํ์ ํ๊ธฐ ์ํด instanceof ์ฐ์ฐ์๋ฅผ ์ด์ฉํ ์ ์๋ค. instanceof ์ฐ์ฐ์๋ ๋ ํผ๋ฐ์ค ๋ณ์๊ฐ ์ค์ ๋ก ์ด๋ค ํด๋์ค ํ์ ์ ์ธ์คํด์ค์ธ์ง ํ์ธํ์ฌ true or false๋ฅผ ๋ฐํํ๋ค.
If(๋ ํผ๋ฐ์ค ๋ณ์ instanceof ํด๋์ค ํ์
) {
// true์ผ ๋ ์ฒ๋ฆฌํ ๋ด์ฉ, ํด๋น ํด๋์ค ํ์
์ผ๋ก down-castingํ ๊ฒ
}
Car car = new Sonata();
if(car instanceof Sonata) {
((Sonata) car).moveSonata();
} else if(car instanceof Avante) {
((Avante) car).moveAvante();
} else if(car instanceof Grandure) {
((Grandure) car).moveGrandure();
}
๐ก ์ถ์ ๋ฉ์๋(๋ฉ์๋์ ๊ธฐ๋ฅ์ด ์๊ณ ๋ฉ์๋์ ํค๋๋ถ๋ง ์กด์ฌํ๋ ๋ถ์์ ํ ๋ฉ์๋)๋ฅผ 0๊ฐ ์ด์ ํฌํจํ๋ ํด๋์ค๋ก ์ค์ค๋ก ์์ ์ ์์ฑ์๋ฅผ ํ์ฉํ ์ธ์คํด์ค ์์ฑ์ด ๋ถ๊ฐ๋ฅํ๋ค. ๋ฐ๋ผ์ ์ถ์ ํด๋์ค๋ ๋ถ์์ ํ ํด๋์ค๋ผ๊ณ ๋ณผ ์ ์๋ค.
์ถ์ ํด๋์ค๋ ์์์ ํ์ฉํด ํ์ ํด๋์ค ํ์ ์ ์ธ์คํด์ค๋ฅผ ์ด์ฉํด์ ์ธ์คํด์ค๋ฅผ ์์ฑํด์ผ ํ๋ค.
์ถ์ ๋ฉ์๋๋ฅผ ํ๋๋ผ๋ ํฌํจํ๋ฉด ๋ถ์์ ํ๋ค๊ณ ๋ณผ ์ ์๋ ํด๋์ค์ด๋ฏ๋ก ๋ฐ๋์ ์ถ์ ํด๋์ค๊ฐ ๋์ด์ผ ํ๋ค.
๐ก ์ถ์ ํด๋์ค๋ ์ค์ค๋ก ์ธ์คํด์ค๋ ๋ง๋ค์ง ๋ชปํ์ง๋ง ๋คํ์ฑ ์ ์ฉ์ ์ํ ๋ถ๋ชจ ํ์ ์ญํ ์ ํด ๋ผ ์ ์๋ค.
์ถ์ ๋ฉ์๋๋ฅผ ํฌํจํ ์ถ์ ํด๋์ค๋ ์ถ์ ๋ฉ์๋๋ฅผ ํตํด ์์ ํด๋์ค์ ์ค๋ฒ๋ผ์ด๋ฉ์ ๋ํ ๊ฐ์ ์ฑ์ ๋ถ์ฌํ ์ ์๋ค.
(์ถ์ ํด๋์ค๋ฅผ ์์๋ฐ๋ ์์ ํด๋์ค๋ ๋ฐ๋์ ์ถ์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํด์ผ ํ๋ค.)
์ด๋ ํ์ ๊ธฐ๋ฅ์ ์ ์ํด ์ผ๊ด๋ ์ธํฐํ์ด์ค(๋์ผ ๊ธฐ๋ฅ)๋ฅผ ์ ๊ณตํจ์ ์์ด ๋์์ด ๋๋ค.
๐ก ์ถ์ ๋ฉ์๋์ ์์ ํ๋๋ง ๊ฐ์ง ์ ์๋ ํด๋์ค์ ๋ณํ์ฒด์ด๋ค.
์์๊ณผ ๋ฌ๋ฆฌ implements๋ผ๋ ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉฐ ์์ ํด๋์ค ์ ์ฅ์์ โ์์ ๋ฐ์๋คโ๊ณ ๋งํ์ง ์๊ณ โ๊ตฌํํ๋คโ๋ผ๋ ํํ์ ์ด๋ค.
interface TestInter {
// ๋ชจ๋ ํ๋๋ public static final๋ง ๊ฐ๋ฅํ๋ค.
public static final PI1 = 3.1415;
// public static final์ ์๋ตํด๋ ์๋์ผ๋ก ์์ฑ๋๋ค.(์๋ต ๊ฐ๋ฅ)
PI2 = 3.14;
// ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉ์๋๋ public abstract์ฌ์ผ ํ๋ค.
public abstract void method1();
// public abstract๋ฅผ ์๋ตํด๋ ์๋์ผ๋ก ์์ฑ๋๋ค.(์๋ต ๊ฐ๋ฅ)
void method2();
}
class Person implements Instinct, Serializable {
@Override
public void eating(String food) {
System.out.println("์ฌ๋์ " + food + "๋ฅผ ์๋ฆฌํ๊ณ ์๊ธฐ๋ฅผ ํ์ฉํด ์์์ ๋จน๋๋ค.");
}
}
๐ก ์ธํฐํ์ด์ค๋ ๊ณต์ ๋ฅผ ๋ชฉ์ ์ผ๋ก ํ๋ ์์(public static final ํ๋)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ณตํตํ(public abstract ๋ฉ์๋)ํด์ ๊ฐ์ ์ฑ์ ๋ถ์ฌํ ๋ชฉ์ ์ผ๋ก ๋ง๋ค์ด ์ก๋ค.(๊ณตํต๋ ์ธํฐํ์ด์ค)
๋ํ ์๋ฐ์ ๋จ์ผ ์์์ด๋ผ๋ ๋จ์ ์ ์ด๋ ์ ๋ ๊ทน๋ณตํ๊ธฐ ์ํด ์ฌ์ฉ๋๊ธฐ๋ ํ๋ฉฐ ๋ชจ๋ ํด๋์ค๋ ํ๋์ ๋ถ๋ชจ ํด๋์ค ์ธ์๋ ์ฌ๋ฌ ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ ์๋ค.
public class Application implements InterOne, InterTwo {
@Override
public void interOneMethod() {}
@Override
public void interTwoMethod() {}
}
๊ตฌ๋ถ | ์ถ์ ํด๋์ค | ์ธํฐํ์ด์ค |
---|---|---|
์์ ๊ฐ๋ฅ ๋ฒ์ | ๋จ์ผ ์์ | ๋ค์ค ์์ |
ํค์๋ | extends ์ฌ์ฉ | implements ์ฌ์ฉ |
์ถ์ ๋ฉ์๋ ๊ฐฏ์ | abstract ๋ฉ์๋ 0๊ฐ ์ด์ | ๋ชจ๋ ๋ฉ์๋๋ abstract |
abstract ํค์๋ ๋ช ์ | ๋ช ์์ ์ฌ์ฉ | ๋ฌต์์ ์ผ๋ก abstract |
๊ตฌ๋ถ | ์ถ์ ํด๋์ค | ์ธํฐํ์ด์ค |
---|---|---|
์์ฒด ์ธ์คํด์ค ์์ฑ | ์์ฑ ๋ถ๊ฐ | ์์ฑ ๋ถ๊ฐ |
๋คํ์ฑ ์ ์ฉ ์ ์์ ํ์ ํ์ฉ ๊ฐ๋ฅ ์ ๋ฌด | ๊ฐ๋ฅ | ๊ฐ๋ฅ |