๐ฆ ์๋ฐ ์ธํฐํ์ด์ค ์ ๋ฆฌ ๐ฆ
๋ค๋ฅธ ํด๋์ค๋ฅผ ์์ฑํ ๋ ๊ธฐ๋ณธ์ด ๋๋ ํ์ ์ ๊ณต
ํด๋์ค ์ฌ์ด์ ์ค๊ฐ ๋งค๊ฐ ์ญํ ๊น์ง ๋ด๋นํ๋ ์ผ์ข
์ ์ถ์ ํด๋์ค
์๋ฐ์์ ์ถ์ ํด๋์ค๋ ์ถ์ ๋ฉ์๋๋ฟ๋ง ์๋๋ผ ์์ฑ์, ํ๋, ์ผ๋ฐ ๋ฉ์๋๋ฅผ ํฌํจํ ์ ์๋ค.
interface <interface_name> {
public static final <value_type> <value_name> = <value>; // public abstract final ์๋ต ๊ฐ๋ฅ
public abstract <method_type> <method_name> (); // public abstract ์๋ต ๊ฐ๋ฅ
<method_type> <method_name> ();
}
interface ํค์๋ ์ฌ์ฉํด ์ ์ธํ๋ฉฐ, ๋ฉ์๋์ ์ ์๋ง ๋ช
์ํ๋ค.
๋ชจ๋ ๋ฉ์๋๋ public abstract์ด์ด์ผ ํ๋ฉฐ, public static final๊ณผ public static ์ ์ด์๋ ์๋ตํ๋๋ผ๋ ์ปดํ์ผ๋ฌ๊ฐ ์ปดํ์ผํ ๋ ์๋์ผ๋ก ์ถ๊ฐํ๋ค.
์ธํฐํ์ด์ค ๋ด์์ ๋ณ์๋ฅผ ์ ์ธํ ๋์๋ ์์(final)๋ง ์ ์ํ ์ ์๋ค.
๊ทธ ์์ฒด๋ก๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ, ๊ตฌํ๋ถ๋ฅผ ๋ง๋ค์ด์ฃผ๋ ํด๋์ค์ ๊ตฌํ๋์ด์ผ ํ๋ค.
interface ๋ถ์ด๋นตํ {
void make๋ถ์ด๋นต();
}
public class ์ํฌ๋ฆผ๋ถ์ด๋นต implements ๋ถ์ด๋นตํ {
@Override
public void make๋ถ์ด๋นต() {
...code
}
}
ํด๋์ค๋ implements ํค์๋๋ฅผ ํตํด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ ์์ผ๋ฉฐ, ์ธํฐํ์ด์ค ๋ด์ ๋ช
์๋ ๋ฉ์๋์ ์ ์๋ฅผ @Override๋ก ์์๋ฐ์ ๊ตฌํํ ์ ์๋ค.
@Override ์ฌ์ฉ ์ด์
1. ์ปดํ์ผ๋ฌ ์ฒดํฌ ๊ธฐ๋ฅ : ์ปดํ์ผ๋ฌ๊ฐ ํด๋น ์ด๋ ธํ ์ด์ ์ ํตํด ๋ถ๋ชจ ํด๋์ค/์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ์ ํํ๊ฒ ์ฌ์ ์ํ๋์ง ๊ฒ์ฌํด ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ ์ค์
2. ๊ฐ๋ ์ฑ ํฅ์ : ๋ถ๋ชจ์ ๋ฉ์๋ ์ฌ์ ์ํ ๊ฒ์ด๋ผ๋ ์ ๋ณด๋ฅผ ๋ช ํํ ์ ๋ฌ
3. ๋ฆฌํฉํ ๋ง ์์ ์ฑ : ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋ ์ ์๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๊ฐ ๋ฌธ์ ๊ฐ์ ๋ฐ ์์ ํ๋๋ก ์ง์ํด ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ ์ค์
์ด๋ ํด๋น ํด๋์ค๋ ์ธํฐํ์ด์ค ๋ด์ ๋ช
์๋ ๋ชจ๋ ์ถ์ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
๋ง์ฝ ๋ชจ๋ ์ถ์ ๋ฉ์๋๋ฅผ ๊ตฌํํ์ง ์๋๋ค๋ฉด abstract ํค์๋๋ฅผ ์ฌ์ฉํด ์ถ์ ํด๋์ค๋ก ์ ์ธํด์ผ ํ๋ค.
interface ๋ถ์ด๋นตํ {
void make๋ถ์ด๋นต();
}
public class ์ํฌ๋ฆผ๋ถ์ด๋นต implements ๋ถ์ด๋นตํ {
@Override
public void make๋ถ์ด๋นต() {
...code
}
}
public class ํฅ๋ถ์ด๋นต implements ๋ถ์ด๋นตํ {
@Override
public void make๋ถ์ด๋นต() {
...code
}
}
๋, ํ๋์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ๋ฌ ๊ฐ์ ํด๋์ค๊ฐ ๊ตฌํํ ์ ์๋ค. (= ๋ค์ค ๊ตฌํ)
interface ๋ถ์ด๋นตํ {
void make๋ถ์ด๋นต();
}
public class ๋ถ์ด๋นต {
...code
}
public class ์ํฌ๋ฆผ๋ถ์ด๋นต extends implements ๋ถ์ด๋นตํ {
@Override
public void make๋ถ์ด๋นต() {
...code
}
}
ํด๋์ค ์์๊ณผ ์ธํฐํ์ด์ค ๊ตฌํ์ ๋์์ ๊ฐ๋ฅํ๋ค.
๋ค์ค ๊ตฌํ์ ํตํด ์ฌ๋ฌ ๊ฐ์ ๊ณตํต์ ์ธ ๊ธฐ๋ฅ์ ํ๋ ์ธํฐํ์ด์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ค์ํ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์๋ค.
์๋ฅผ ๋ค๋ฉด, ๊ฒ์ ๋ด ์บ๋ฆญํฐ์ ๋ฌด๊ธฐ(weapon)๋ ์ฌ๋ฌ ์ข
๋ฅ๊ฐ ์กด์ฌํ๋ค.
์ฌ๊ธฐ์ ๋ฌด๊ธฐ์ ์ข
๋ฅ๋ ์นผ(knife), ์ด(gun), ์ฃผ๋จน(fist)๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ๊ฐ์ ํ๋ค.
์บ๋ฆญํฐ๋ ์ ์ ๊ฐ ์ํ ๋ ๋ฌด๊ธฐ๋ฅผ ๋ฐ๊ฟ ์ ์์ด์ผ ํ๋ค.
๋, ๋ฌด๊ธฐ๋ก ๊ณต๊ฒฉ(attack)๊ณผ ๋ง๊ธฐ(defend)๋ฅผ ํ ์ ์๋ค.
๋ง์ฝ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ตฌํํ ๊ฒฝ์ฐ, ์บ๋ฆญํฐ๋ ๋ชจ๋ ๋ฌด๊ธฐ์ ๋์์ ์๊ณ ์์ด์ผ ํ๋ค.
๋, ๋ชจ๋ ๋ฌด๊ธฐ์ ์ข
๋ฅ๋ฅผ ๋ณ์๋ enum์ผ๋ก ์ ์ฅํ๊ณ ์์ด์ผ ํ๋ฉฐ, ๋ฌด๊ธฐ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋์์ ํ๋๋ก ๊ตฌํํด์ผ ํ๋ค.
public class ์บ๋ฆญํฐ {
private String ๋ฌด๊ธฐ๋ชจ๋;
public void change๋ฌด๊ธฐ(String ์๋ก์ด๋ฌด๊ธฐ) {
if (์๋ก์ด๋ฌด๊ธฐ.equals("์ฃผ๋จน") {
๋ฌด๊ธฐ๋ชจ๋ = "fist";
return;
}
if (์๋ก์ด๋ฌด๊ธฐ.equals("์นผ") {
๋ฌด๊ธฐ๋ชจ๋ = "knife";
return;
}
๋ฌด๊ธฐ๋ชจ๋ = "gun";
return;
}
public Integer attack() {
int damage = 1;
if (๋ฌด๊ธฐ๋ชจ๋.equals("gun")) {
damage = 10;
}
if (๋ฌด๊ธฐ๋ชจ๋.equals("knife") {
damage = 5;
}
return damage;
}
public Integer defend() {
int damage = 1;
if (๋ฌด๊ธฐ๋ชจ๋.equals("gun")) {
damage = -10;
}
if (๋ฌด๊ธฐ๋ชจ๋.equals("knife") {
damage = -5;
}
return damage;
}
}
์ด ๊ฒฝ์ฐ ์ค๋ณต๋ ์ฝ๋๊ฐ ๋ง์์ง๊ณ , ์ฝ๋์ ๊ธธ์ด๊ฐ ๊ธธ์ด์ ธ ๊ฐ๋
์ฑ์ด ๋จ์ด์ง๋ค.
๋, ์๋ก์ด ๋ฌด๊ธฐ๋ฅผ ์ถ๊ฐํ ๊ฒฝ์ฐ ๊ฑฐ์ ๋ชจ๋ ๋ฉ์๋๋ฅผ ์์ ํด์ผ ํจ์ผ๋ก ์ ์ง๋ณด์๊ฐ ์ข์ง ์๋ค.
ํ์ง๋ง ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํด ๊ตฌํํ ๊ฒฝ์ฐ, ๊ณตํต๋ ๊ธฐ๋ฅ(attack, defend ๋ฑ)์ ๋ฌด๊ธฐ ์ธํฐํ์ด์ค์ ์ ์ํด๋๊ณ , ๊ฐ ๋ฌด๊ธฐ ํด๋์ค์์ ์ด๋ฅผ ์์ ๋ง์ ๋ฐฉ์์ผ๋ก ๊ตฌํํจ์ผ๋ก์จ ๋คํ์ฑ(Polymorphism) ์ ์คํํ ์ ์๋ค.
์ฆ, ์บ๋ฆญํฐ ํด๋์ค๋ ๋ฌด๊ธฐ๊ฐ ์ด, ์นผ, ์ฃผ๋จน ์ค ๋ฌด๊ธฐ ์ธํฐํ์ด์ค๋ง์ ๋ฐ๋ผ๋ณด๊ณ attack()์ด๋ defend()๋ฅผ ํธ์ถํ ์ ์์ผ๋ฉฐ, ์ด๋ฌํ ์ค๊ณ๋ ํ์ฅ์ฑ๊ณผ ์ ์ง๋ณด์ ์ธก๋ฉด์์ ๋งค์ฐ ์ข๋ค.
interface ๋ฌด๊ธฐ {
Integer attack();
Integer defend();
}
๋ฌด๊ธฐ ์ธํฐํ์ด์ค๋ attack๊ณผ defend ๋ฉ์๋์ ์ ์๋ฅผ ๋ช
์ํ ์ ์๋ค.
์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ๊ณตํต๋ ๊ธฐ๋ฅ์ ์ค๋ณตํด์ ์์ฑํ์ง ์์ ์ ์๋ค.
public class ์ด implements ๋ฌด๊ธฐ {
@Override
public Integer attack() {
return 10;
}
@Override
public Integer defend() {
return -10;
}
}
public class ์นผ implements ๋ฌด๊ธฐ {
@Override
public Integer attack() {
return 5;
}
@Override
public Integer defend() {
return -5;
}
}
public class ์ฃผ๋จน implements ๋ฌด๊ธฐ {
@Override
public Integer attack() {
return 1;
}
@Override
public Integer defend() {
return -1;
}
}
๋, ์นผ, ์ด, ์ฃผ๋จน๋ฅผ ํด๋์ค๋ก ๊ตฌํํด ๋ฌด๊ธฐ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด ๋ฌด๊ธฐ ๋ง๋ค ์๋ก ๋ค๋ฅธ ๋ฐ๋ฏธ์ง๋ฅผ ์ฃผ๋ ๋์์ ์ ์ํ ์ ์๋ค.
public class ๋๋น implements ๋ฌด๊ธฐ {
@Override
public Integer attack() {
return 2;
}
@Override
public Integer defend() {
return -2;
}
}
์๋ก์ด ๋ฌด๊ธฐ๋ฅผ ์ถ๊ฐํ๊ฒ ๋ ๊ฒฝ์ฐ ํด๋์ค๋ฅผ ์ ์ํด ๋ฌด๊ธฐ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ฉด ๋๋ค.
๋ฐ๋ผ์ ๊ธฐ์กด ๋ก์ง์ ์์ ํ์ง ์๊ณ ์๋ก์ด ๋ฌด๊ธฐ๋ฅผ ์ถ๊ฐํ ์ ์๊ฒ ๋จ์ผ๋ก์จ ์ ์ง๋ณด์๊ฐ ์ข์์ง๋ค.
๊ทธ ๊ฒฐ๊ณผ, ์บ๋ฆญํฐ๋ ํ๋์ ์ธํฐํ์ด์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ค์ํ ๋ฌด๊ธฐ๋ฅผ ๊ฐ์ง ์ ์๊ฒ ๋๋ค.
public class ์บ๋ฆญํฐ {
private ๋ฌด๊ธฐ ๋ฌด๊ธฐ;
public ์บ๋ฆญํฐ(๋ฌด๊ธฐ ์ด๊ธฐ๋ฌด๊ธฐ) {
this.๋ฌด๊ธฐ = ์ด๊ธฐ๋ฌด๊ธฐ;
}
public void change๋ฌด๊ธฐ(๋ฌด๊ธฐ ์๋ก์ด๋ฌด๊ธฐ) {
this.๋ฌด๊ธฐ = ์๋ก์ด๋ฌด๊ธฐ; // ๋ฌด๊ธฐ ๋ณ๊ฒฝ
}
public void ๊ณต๊ฒฉ() {
System.out.println("๊ณต๊ฒฉ๋ ฅ: " + ๋ฌด๊ธฐ.attack());
}
public void ๋ฐฉ์ด() {
System.out.println("๋ฐฉ์ด๋ ฅ: " + ๋ฌด๊ธฐ.defend());
}
}
public class Main {
public static void main(String[] args) {
์บ๋ฆญํฐ ๋ = new ์บ๋ฆญํฐ(new ์ฃผ๋จน());
๋.๊ณต๊ฒฉ(); // ์ฃผ๋จน ๊ณต๊ฒฉ
๋.๋ฐฉ์ด();
๋.change๋ฌด๊ธฐ(new ์นผ());
๋.๊ณต๊ฒฉ(); // ์นผ ๊ณต๊ฒฉ
๋.๋ฐฉ์ด();
๋.change๋ฌด๊ธฐ(new ์ด());
๋.๊ณต๊ฒฉ(); // ์ด ๊ณต๊ฒฉ
๋.๋ฐฉ์ด();
}
}
์บ๋ฆญํฐ ํด๋์ค๋ ๋ด๋ถ์ ๋ฌด๊ธฐ ์ธํฐํ์ด์ค ํ์
์ ๋ณ์ ํ๋๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์์ฑ์๋ change๋ฌด๊ธฐ() ๋ฉ์๋๋ฅผ ํตํด ๋ฌด๊ธฐ๋ฅผ ๊ต์ฒดํ ์ ์๋ค.
'๋'๋ผ๋ ์บ๋ฆญํฐ๋ฅผ ์์ฑํ๋ฉด์ ์ฃผ๋จน ํด๋์ค๋ฅผ ๋ฌด๊ธฐ๋ก ์ค์ ํ๋ค. ์ด๋ ์บ๋ฆญํฐ์ ๋ฌด๊ธฐ๋ ์ฃผ๋จน์ด๋ฉฐ, ๊ณต๊ฒฉ๊ณผ ๋ฐฉ์ด๋ฅผ ํ ๊ฒฝ์ฐ ๊ฐ๊ฐ 1๊ณผ -1์ ๋ฐ๋ฏธ์ง๋ฅผ ๊ฐ๋๋ค. ์ดํ ์๋ก์ด ๋ฌด๊ธฐ๋ก ์นผ์ด๋ ์ด์ ์ ํํ ๊ฒฝ์ฐ, ํด๋น ๋ฌด๊ธฐ ํด๋์ค ๋ด ๋ฉ์๋๋ก ๋์ํ๊ฒ ๋๋ฉด์ ์๋ก ๋ค๋ฅธ ๋ฐ๋ฏธ์ง๋ฅผ ๊ฐ๊ฒ ๋๋ค.
์ฆ, ๋ฌด๊ธฐ์ ์ค์ ๊ตฌํ์ฒด๊ฐ ๋ฌด์์ด๋์ ๋ฐ๋ผ attack()๊ณผ defend() ๋ฉ์๋์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ค.
์ด๋ ์๋ฐ์ ๋คํ์ฑ ๊ฐ๋ ์ ํ์ฉํ ๊ฒ์ผ๋ก, ๋ฌด๊ธฐ ํ์ ์ผ๋ก ์ ์ธ๋ ๋ณ์๋ ์ค์ ๋ก ์ด๋ค ๋ฌด๊ธฐ ๊ฐ์ฒด๊ฐ ์ฌ์ฉ๋๋์ง ์ ์ฐํ๊ฒ ๋์ํ ์ ์๋ค.
์๋ฐ์ ๋คํ์ฑ
๊ฐ์ ์๋ฃํ์ ์ฌ๋ฌ๊ฐ์ง ํ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋์ ํด ๋ค์ํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ด๋ผ ์ ์๋ ์ฑ์ง
์ฆ, ํด๋์ค๊ฐ ์์ ๊ด๊ณ์ ์์ ๋ ๋ํ๋๋ ๋ค์ฑ๋ก์ด ์ฑ์ง์ด๋ค.
๋ํ์ ์ผ๋ก ์ค๋ฒ๋ก๋ฉ, ์ค๋ฒ๋ผ์ด๋ฉ, ์ ์บ์คํ , ๋ค์ด์บ์คํ , ์ธํฐํ์ด์ค, ์ถ์๋ฉ์๋, ์ถ์ํด๋์ค๊ฐ ์๋ค.
๋, ํด๋น ๊ตฌ์กฐ๋ ๋์์ธ ํจํด ์ค ์ ๋ต ํจํด์ ์ฌ์ฉํ๋ค๊ณ ๋ณผ ์ ์๋ค.
์ ๋ต ํจํด
์คํ(๋ฐํ์) ์ค ์๊ณ ๋ฆฌ์ฆ ์ ๋ต์ ์ ํํด ๊ฐ์ฒด ๋์์ด ์ค์๊ฐ์ผ๋ก ๋ฐ๋๋๋ก ํ ์ ์๊ฒ ํ๋ ํ์ ๋์์ธ ํจํด
์ฐธ๊ณ -์ธํฐํ์ด์ค
์ฐธ๊ณ -์ธํฐํ์ด์ค ์๋ฏธ
์ฐธ๊ณ -๋คํ์ฑ
์ฐธ๊ณ -์ ๋ต ํจํด