์๋ฐ์ ๋คํ์ฑ์ ๊ทน๋ํํ์ฌ ๊ฐ๋ฐ์ฝ๋ ์์ ์ ์ค์ด๊ณ ์ ์ง๋ณด์๋ฅผ ์ฉ์ดํ๊ฒ ํ๊ธฐ ์ํจ
๋คํ์ฑ? ๋์ผํ ๋ฉ์์ง๋ฅผ ์์ ํ์ ๋ ๊ฐ์ฒด์ ํ์ ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์๋ตํ ์ ์๋ ๋ฅ๋ ฅ
์ถ์๋ฉ์๋๋ฅผ ๊ฐ์ง์ผ๋ก์จ ๋คํ์ฑ์ ๊ทน๋ํํ๋ฉด์ ์ด๋ค ์ญํ ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ(๊ฐ์ฒด๋ค์ด ๋ฐ๋ผ์ผ ํ๋ ์ฑ
์์ ์งํฉ์ ์์ ํ ๊ฒ)์ด๋ผ๋ ๊ณตํต์ ์ด ์๋ค.
ํ์ง๋ง ์ถ์ ํด๋์ค๋ is-a๊ด๊ณ๋ก -๋ -์ด๋ค.์ ๊ฐ๋
์ด๋ฉฐ ์ฑ
์์ ์ผ๋ถ๋ฅผ ๊ตฌํํด๋์ ๊ฒ์ด๊ณ ์ธํฐํ์ด์ค๋ has-a์ ๊ด๊ณ๋ก -๋ -๋ฅผ ํ ์ ์๋ค์ ๊ฐ๋
์ผ๋ก ์ฑ
์์ ์งํฉ๋ค์ ๋์ดํด ๋์ ๊ฒ.
์ด๋ ์ด๋ฌํ ๊ด๊ณ๊ฐ ๊ฐ์ฒด์งํฅ์ ์์ด ์ค์ํ ๊ฒ์ ๊ฐ์ฒด์ ์์ฑ์ด ์๋๋ผ ๊ฐ์ฒด์ ํ๋๊ฐ์ ๊ด๊ณ๋ผ๋ ๊ฒ.
ํ๋ง๋๋ก ๋ญ์ ์๋ค, ๋งฅ์ os์ด๋ค ์ ๊ฐ์ ๋ฌธ์ฅ์ด ์์๋ ์ด ๋ฌธ์ฅ๋ค ์์ ํด๋ผ์ด์ธํธ ์
์ฅ์์ ๋ผ๋ ๋ง์ด ๋น ์ ธ์๋ ๊ฒ์ด๋ค. ์ค์ ์ธ๊ณ์ ๊ด์ ์ผ๋ก ๋ฐ๋ผ๋ณด๋ฉฐ ๊ฐ์ฒด๊ฐ์ ๊ด๊ณ๋ฅผ ์ ์ํ๋ ๊ฒ์ด ์๋ ์ด ๊ฐ์ฒด๋ค์ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ ์
์ฅ์์ ๋ฐ๋ผ๋ณด๋ฉฐ ํน์ ๊ฐ์ฒด์ ํ๋์ ํตํด ๊ด๊ณ๋ฅผ ๋งบ์ด์ผ ํ๋ค.
์์์ ๊ฐ์ฅํฐ ๋ฌธ์ ์ ์ ์บก์ํ๋ฅผ ์๋ฐํ๋ค๋ ๊ฒ๊ณผ ์ค๊ณ๊ฐ ์ ์ฐํ์ง ์๋ค๋ ๊ฒ.
์ฝ๋์ ์ฌ์ฌ์ฉ์ ์ํด์๋ ์์์ด ์๋๋ผ ํฉ์ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์งํ๊ณ ์์์ ํ์ ๊ณ์ธต์ ๊ตฌ์กฐํํ๊ธฐ ์ํด ์ฌ์ฉํด์ผ ํ๋ค.
์์กด์ฑ์ ์ํ ์ํฅ์ด ์ ์ ๊ฒฝ์ฐ์๋ ์ถ์ํ์ ์์กดํ๊ณ ์์กด์ฑ์ ๋ช ์์ ์ผ๋ก ๋๋ฌ๋ด๋ ๊ฒ์ด ์ข์ ์ค๊ณ ์ต๊ด์ด๋ค.
- ์๋ธ ํด๋์ฑ : ๋ค๋ฅธ ํด๋์ค์ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ ๋ชฉ์ ์ผ๋ก ์์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ. ์์๊ณผ ๋ถ๋ชจํด๋์ค๊ฐ์ ํ๋์ด ํธํ๋์ง ์์ ์์์ธ์คํด์ค๊ฐ ๋ถ๋ชจ์ธ์คํด์ค๋ฅผ ๋์ฒดํ ์์๊ณ ์ด๋ฅผ
๊ตฌํ ์์/ํด๋์ค ์์์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. - ์๋ธ ํ์ดํ : ํ์ ๊ณ์ธต์ ๊ตฌ์ฑํ๊ธฐ ์ํด ์์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ. ์์๊ณผ ๋ถ๋ชจํด๋์ค๊ฐ์ ํ๋์ด ํธํ๋์ด ์ธ์คํด์ค๋ฅผ ๋์ฒดํ ์ ์๋ค.
- ๊ฐ๋ฐ ๊ธฐ๊ฐ ๋จ์ถ : ํ๋ด์์ ์๋ก ๋ค๋ฅธ ๋ถ๋ถ์ ๊ฐ๋ฐํ ๋ ์ธํฐํ์ด์ค๋ง ์ ์ ์ํด๋์ด๋ ์๋ก์ ๊ฐ๋ฐ์ด ๋๋์ง ์์๋ ๋ฐ๋ก ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
- ํด๋์ค๊ฐ์ ๋ฎ์ ๊ฒฐํฉ๋ : ์ฝ๋์ ์ข ์์ ์ค์ด๊ณ ์ ์ง๋ณด์์ฑ์ ๋์ผ ์ ์๋ค.
- ํ์คํ ๊ฐ๋ฅ : ํ์ ์์๋ ์ผ์ ํ ํ์ ํํ๋ก ๊ฐ๋ฐ์ ํ ์ ์๊ฒ ํ๋ค.
- ํ๋๋ก๋ ์์๋ง ๊ฐ๋ฅ ( ๋ณ์๋ ๋ถ๊ฐ๋ฅ ํ๋ค. ) : ๋ฌด์กฐ๊ฑด
public static final๋ก ์ ์ธ ๋๋ฉฐ ์๋ต ๊ฐ๋ฅ - ์ถ์ ๋ฉ์๋ ์กด์ฌ : ๋ฌด์กฐ๊ฑด public abstract์ผ๋ก ์ ์ธ๋๋ฉฐ ์๋ต ๊ฐ๋ฅ
์ธ์คํด์ค ์์ด ์ํํ ์ ์๋ ํ๋์ ์ ์ ํ ๊ฒ์ผ๋ก ํด๋น ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋ชจ๋ ๊ฐ์ฒด์๊ฒ ํด๋น ํ์ ๊ณผ ๊ด๋ จ๋ ์ ํธ,ํฌํผ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๊ณ ์ถ์ ๋ ์ด์ฉ ํ ์ ์๋ค.
public interface ExInterface {
static String staticMethod(){
return "์คํํฑ ๋ฉ์๋์
๋๋ค";
}
}
// byte code
public static method()I
L0
LINENUMBER 5 L0
ICONST_1
IRETURN
MAXSTACK = 1
MAXLOCALS = 0
}์ ๊ทผ์ง์ ์๋ฅผ ์๋ตํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก public์ด ๋ถ๊ฒ๋๊ณ java8์์๋ static method๊ฐ public๋ง ๊ฐ๋ฅํ์ง๋ง java9 ์ด์๋ถํฐ๋ private๋ ๊ฐ๋ฅํ๋ค. ๋น์ฐํ private์ด๊ธฐ ๋๋ฌธ์ ์ธ๋ถ์์๋ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋ค.
- ๊ตฌํ๋ถ๊ฐ ์กด์ฌํด์ผ ํ๋ค.
- ํด๋น ์ธํฐํ์ด์ค ๋ด๋ถ์์๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
์ถ์ ๋ฉ์๋๊ฐ ์๋๋ผ ๊ตฌํ์ด ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ฝ๋์ ์ค๋ณต์ ํผํ๊ณ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ
- ํด๋น ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ตฌํ์ฒด๋ ๋ชจ๋ฅด๊ฒ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๋ง์ ์ํ์ ์์ง๊ฐ ์๋ค. ( ๋ฉ์๋์ ์กฐ๊ฑด๋ค์ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ์ปดํ์ผํ์์๋ ๊ด์ฐฎ๋๋ผ๊ณ ๋ฐํ์์ ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๋ค. -> ๋ฌธ์ํ๋ฅผ ์ฒ ์ ํ ํ์ฌ ์ด๋ฐ ์ํ๋ฐ์์ ๊ฐ๋ฅ์ฑ์ ์ต๋ํ ์ค์ด์.)
public interface Foo {
void printName();
/**
* @implSpec ์ด ๊ตฌํ์ฒด๋ getName()์ผ๋ก ๊ฐ์ ธ์จ ๋ฌธ์์ด์ ๋๋ฌธ์๋ก ๋ฐ๊ฟ์ถ๋ ฅํ๋ค.
*/
default void printNameUpperCase(){
System.out.println(getName().toUpperCase());
}
String getName();
}์ด Foo๋ฅผ ๊ตฌํํ ๊ฐ์ฒด๊ฐ getName()์ด๋ผ๋ ํจ์์ ๋ฐํ์ null๋ก ์ ์ํ๊ณ printNameUpperCase()๋ฅผ ์ฌ์ฉํ๋ คํ๋ค๋ฉด null์์ toUpperCase()๋ฅผ ์ฐธ์กฐํ๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์ runtime ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ด๋ฌํ ๋ฌธ์ ์ ๋๋ฌธ์ ๋ฌธ์ํ๋ฅผ ๊ผผ๊ผผํ ํ๊ฑฐ๋ ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ๊ผผ๊ผผํ ํ์ฌ ์ ์ ํด์ผํ๋ค.
/**
* null ๋ฐฉ์ง ํ์ฌ ๊ตฌํ
*/
default void printNameUpperCase(){
if(getName() == null) System.out.println("");
else System.out.println(getName().toUpperCase());
}-
Object ํ์ ์ด ์ ๊ณตํ๋ ๋ฉ์๋๋ ๊ธฐ๋ณธ๋ฉ์๋๋ก ์ ์๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.

-
์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ ์ด default ๋ฉ์๋๋ฅผ ovverride๊ฐ ๊ฐ๋ฅํ๋ค.
-
๊ฐ์ ์ด๋ฆ์ default method๋ฅผ ๊ฐ์ง ์ธํฐํ์ด์ค๋ฅผ ์ฌ๋ฌ๊ฐ ๊ตฌํํ ๋๋ overrideํด์ฃผ์ด์ผ ํ๋ค.

๊ตฌํํ๋ ค๋ ์ธํฐํ์ด์ค๊ฐ ๊ฐ์ ์ด๋ฆ์ default ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด ์ ์ฌ์ง๊ณผ ๊ฐ์ด ์๋ฌ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ฌ์ ์ ํด์ฃผ๊ฑฐ๋ ์ฌ์ฉํ๋ ค๋ ์ธํฐํ์ด์ค๋ฅผ ์ง์ ํ ์ ์๋ค.
@Override
public int method() {
return Ex1.super.method(); //Ex1์ default method๋ฅผ ์ฌ์ฉ
//return Ex2.super.method();
}ํ์ ํธํ์ฑ ์ด ๊ฐ์ฅ ํฐ ๋ชฉ์ ์ผ๋ก ์ด๋ค ์ธํฐํ์ด์ค์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์๋ ์ด๋ฅผ ์์,๊ตฌํํ ํด๋์ค๋ค์ด ๊นจ์ง์ง ์๊ฒ ํ๊ธฐ์ํ ๋ชฉ์ ์ผ๋ก default ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๋ํ์ ์ผ๋ก Collection์ of๋ forEach ๋ฑ์ด ์๋ค.