์๋ฐ์ ์ธํฐํ์ด์ค์ ๋ํด ํ์ตํ์ฌ๋ผ.
์ธํฐํ์ด์ค๋, ์ด๋ ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํด ์ผ์ข ์ ์ฝ์ ๋งบ์ ๊ฒ๊ณผ ๊ฐ๋ค. ์ฆ, ์ฌ์ฉ์๋ ์ธํฐํ์ด์ค์ ์ ํ ์๋๋๋ก๋ง ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์๋ ์ด ๊ธฐ๋ฅ๋ค์ ๊ผญ ๊ตฌํํด์ผ๋ง ํ๋ ๊ฒ์ด๋ค. ์ฌ์ฉ์๋ ์ ๊ณต์๊ฐ ์ด๋ป๊ฒ ๊ตฌํํ๋์ง์ ๋ํด ์์ธํ ์ ํ์๊ฐ ์์ด ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง๋ฉฐ ๋ชจ๋ํ๊ฐ ๊ฐ๋ฅํด์ง๋ค. ๋ํ, ์ ๊ณต์๋ ์์ ์ ์ฝ๋๋ฅผ ๋ ธ์ถํ์ง ์์๋ ๋๋ค๋ ์ฅ์ ๋ ๊ฐ์ง๊ณ ์๋ค.
Java์์ ์ธํฐํ์ด์ค๋ ํด๋์ค์ ๊ฐ์ด ๋ ํผ๋ฐ์ค ํ์ ์ ์ํ๋ฉฐ, ์ค์ง ์์, ๋ฉ์๋ ์๊ทธ๋์ฒ, default ๋ฉ์๋, static ๋ฉ์๋ ๊ทธ๋ฆฌ๊ณ ์ค์ฒฉ๋ ํ์ ๋ง ํฌํจํ ์ ์๋ค.
์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๊ธฐ ์ํด์๋ interface
ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
interface ์ธํฐํ์ด์ค_์ด๋ฆ {
int a = 10; // -> public static final int a = 10;
void ๋ฉ์๋_A(๋งค๊ฐ๋ณ์); // -> public abstract void ๋ฉ์๋_A(๋งค๊ฐ๋ณ์);
int ๋ฉ์๋_B(); // -> public abstract int ๋ฉ์๋_B();
}
์ธํฐํ์ด์ค์์๋ ํ๋์ ๊ฒฝ์ฐ public static final
, ๋ฉ์๋์ ๊ฒฝ์ฐ public abstract
๋ฅผ ์๋ตํด๋ ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก ์ด๋ฅผ ์ถ๊ฐํ๋ค.
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ธฐ ์ํด์๋ implements
ํค์๋๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์์๊ณผ ๋๊ฐ์ ์์น์ ์์ฑํ๋ค.
class ๊ตฌํ์ฒด implements ์ธํฐํ์ด์ค_์ด๋ฆ {
@Override
public void ๋ฉ์๋_A(๋งค๊ฐ๋ณ์) {
...
}
@Override
public int ๋ฉ์๋_B() {
...
}
}
์ธํฐํ์ด์ค์ ์ ์ํ ์ถ์ ๋ฉ์๋๋ ๋ฌด์กฐ๊ฑด ๊ตฌํํด์ผํ๋ฉฐ, ๋ง์ฝ ์ผ๋ถ๋ง ๊ตฌํํด์ผ ๋๋ค๋ฉด abstract
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ถ์ ํด๋์ค๋ก ๋ง๋ค์ด์ผ ํ๋ค.
์ธํฐํ์ด์ค์ ๊ฒฝ์ฐ ๋ด๋ถ ์ถ์ ๋ฉ์๋๊ฐ ์ ์ ๋์ด์์ง ์์ผ๋ฏ๋ก new
ํค์๋๋ฅผ ํตํด ์ธ์คํด์คํ ํ ์ ์์ผ๋ฉฐ ์ด๋ฅผ ๊ตฌํํ ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉํ ์ ์๋ค. ์์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ธํฐํ์ด์ค์ ์ด๋ฅผ ๊ตฌํํ ๊ตฌํ์ฒด์์ ๋คํ์ฑ์ด ์ ์ฉ๋์ด์ง ์ ์๊ธฐ์ ์ธํฐํ์ด์ค ์์ฒด๋ฅผ ํ์
์ผ๋ก ์ง์ ํ ์ ์๋ค.
interface Human {
void say()
}
class User implements Human {
@Override
public void say() {
System.out.println("Hi!")
}
}
์์ ๊ฐ์ด Human
์ด๋ ์ธํฐํ์ด์ค์ ๊ทธ์ ๋ํ ๊ตฌํ์ฒด๊ฐ ์กด์ฌํ ๋, ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
class App {
public static void main(String[] args) {
Human jongnan = new User();
jongnan.say();
}
}
์ธํฐํ์ด์ค ๋ํ ์ธํฐํ์ด์ค๋ก๋ถํฐ extends
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์์ ๋ฐ์ ์ ์๋ค. ํด๋์ค ์์๊ณผ๋ ๋ค๋ฅด๊ฒ ์์์ ์์ด ์ ๋งคํจ์ด ์๊ธฐ์ ๋ค์ค ์์์ด ๋๋ค.
interface Human {
void move();
void say();
}
interface Weapon {
void attack();
}
interface Citizen extends Human {
}
interface Soldier extends Human, Weapon {
}
์์์ ๋ฐ์ ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ ์์ ์ธํฐํ์ด์ค์ ์ถ์ ๋ฉ์๋๊น์ง ๊ตฌํ์ ํด์ผ๋๋ค.
Java 8์์๋ถํฐ ์ธํฐํ์ด์ค์ ์ถ๊ฐ๋ default ๋ฉ์๋๋ ์ถ์ ๋ฉ์๋๊ฐ ์๋ ๊ธฐ๋ณธ ๋ฉ์๋๋ฅผ ๋ฃ์ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ด๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ ์ถ์ ๋ฉ์๋์์ง๋ง, ์ด๋ฅผ ์ถ๊ฐํ ์ด์ ๋ ํจ์จ์ ์ธ ์ ์ง๋ณด์๋ฅผ ์ํด์์ด๋ค. ๊ธฐ์กด ์ธํฐํ์ด์ค์ ํ๋์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ค๋ฉด, ์ด๋ฅผ ๊ตฌํํ ๊ตฌํ์ฒด ๋ชจ๋ ์ถ๊ฐํด์ผํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์๊ธด๋ค. ํ์ง๋ง ์ด๋ฅผ ์ธํฐํ์ด์ค ๋จ์์ ๊ตฌํํ๋ค๋ฉด ํ ๊ณณ๋ง ์๋ณด๋ฉด ๋๋ค.
interface Eng {
void move();
default void say() {
System.out.println("Hi!");
}
}
์์ ๊ฐ์ด default
ํค์๋๋ฅผ ํตํด ์ ์ธ ํ ์ ์์ผ๋ฉฐ ์ ๊ทผ์ ์ด์๋ public
์ผ๋ก ์๋ต์ด ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง ์ฌ๊ธฐ์ ์๋ฌธ์ด ํ๋ ์๊ธด๋ค. ํด๋์ค์์๋ ์ด์ ๊ฐ์ ๋ฌธ์ ๋ก ๋ค์ค ์์์ด ๋ถ๊ฐ๋ฅ ํ๋๋ฐ, ์ด๋ ๊ฒ ํ๋ค๋ฉด ์ธํฐํ์ด์ค๋ ๋ค์ค ์์์ด ๋ถ๊ฐ๋ฅํ๊ฑฐ ์๋๊ฐ?
interface Eng {
default void say() {
System.out.println("Hi!");
}
}
interface Kor {
default void say() {
System.out.println("์๋
!");
}
}
class User implements Eng, Kor {
// ์ปดํ์ผ ์๋ฌ ๋ฐ์!
}
์ง์ ์ฝ๋ฉํด๋ณด๋ฉด ์๊ฒ ์ง๋ง, ์ด๋ ๊ฒ ์ ๋งคํ ์ํฉ์์๋ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ์ฆ, ๋ค์ค ์์์ ๋ง์ ๋์์ง๋ง, ์ด๋ฅผ ํํ ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์กด์ฌํ๋ค. ๋ฐ๋ก ์ ๋งคํ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋ฉด ๋๋ค.
class User implements Eng, Kor {
@Override
public void say() {
Eng.super.say();
}
}
์์ ๊ฐ์ด say
๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋ค๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฉฐ, ์ํ๋ ์ธํฐํ์ด์ค์ default ๋ฉ์๋๋ฅผ ์ ํํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
Java 8์ ๋ํ static ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์๋ค. static
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํ ์ ์์ผ๋ฉฐ ๊ตฌํ์ฒด์์๋ ์ด๋ฅผ ์ฌ์ ์ ํ ์ ์๋ค.
interface User {
static String getType() {
return "Human";
}
void say();
}
class American implements User {
public void say() {
System.out.println("Hi!");
}
}
class Korean implements User {
public void say() {
System.out.println("์๋
!");
}
}
class App {
public static void main(String[] args) {
User kor = new Korean();
String userType = User.getType();
String korType = kor.getType(); // ์๋ฌ๋ฐ์
}
}
์์ ๊ฐ์ด ์ธํฐํ์ด์ค์ ๋ฐ๋ก ์ ๊ทผํ์ฌ ์ฌ์ฉํ์ฌ์ผ ํ๋ฉฐ ๊ทธ๋ ์ง ์์ ์์๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
Java 9๋ถํฐ ์ค๋ณต์ ์ธ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๊ณ ์บก์ํ๋ฅผ ์ํด private ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋์๋ค. 8์์ default์ static ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋๋ฐ ์์ด ์ค๋ณต์ ์ธ ์ฝ๋๊ฐ ์กด์ฌํ ์ ์๋ค. ์ด๋ฅผ ์์ ๊ธฐ ์ํด์๋ ๋๊ฐ์ด default์ static ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์จ ์ ์์ง๋ง, ์ธ๋ถ์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค. ์ด๋ฌํ ์ ์ ๋ณด์ํ๊ธฐ ์ํด private
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์๋ค.
interface User {
default void walk() {
printMove();
}
default void run() {
printMove();
}
default void stop() {
System.out.println("๋ฉ์ถค!");
}
private void printMove() {
System.out.println("์์ง์ ์์!");
}
}
static ๋ฉ์๋์์๋ private static
ํค์๋๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋๋ค.