- [JAVA] ์ธํฐํ์ด์ค๋? (๋คํ์ฑ, ์ถ์ํด๋์ค, implements) ๋ชฉ์ฐจ
๐ ์ถ์ํด๋์ค
๋ฏธ์์ฑ ๋ฉ์๋(์ถ์ ๋ฉ์๋)๋ฅผ ํฌํจํ๊ณ ์๋ ํด๋์ค. (์ผ๋ฐ ๋ฉ์๋ ๋๋ ๋ฉค๋ฒ๋ณ์ ํฌํจ ๊ฐ๋ฅ)
ํด๋์ค ์์ abstract
๋ผ๋ ํค์๋๋ง ๋ถ์ด๋ฉด ๋๋ค.
๐จ ์ธ์คํด์ค(ํด๋์ค๋ก๋ถํฐ ๋ง๋ค์ด์ง ๊ฐ์ฒด)๋ฅผ ์์ฑํ ์ ์๋ค.
๐จ ์์์ ํตํด์ ์์ ํด๋์ค์ ์ํด์๋ง ์์ฑ๋ ์ ์๋ค.
abstract class ํด๋์ค ์ด๋ฆ {
...
}
๐ ์ถ์๋ฉ์๋
์์ abstract
ํค์๋๊ฐ ๋ถ๊ณ , ๊ตฌํ๋ถ(์ค๊ดํธ{}
๋ก ๊ฐ์ธ์ ธ ์๋ ๋ถ๋ถ)๋ฅผ ์์ค ๋ฉ์๋
abstract ๋ฆฌํดํ์
๋ฉ์๋์ด๋ฆ();
๊ตฌํ๋ถ๋ ์์์ ํตํด ์์ฑ๋ ์ ์๋ค.
abstract class Player { // ์ถ์ ํด๋์ค
abstract void play(int pos); // ์ถ์ ๋ฉ์๋
abstract void stop(); // ์ถ์ ๋ฉ์๋
}
class AudioPlayer extends Player {
void play(int pos) { ... }; // ์ถ์ ๋ฉ์๋๋ฅผ ๊ตฌํ
void stop { ... }; // ์ถ์ ๋ฉ์๋๋ฅผ ๊ตฌํ
}
abstract class AbstractPlayer extends Player {
void play(int pos) { ... } // ์ถ์ ๋ฉ์๋๋ฅผ ๊ตฌํ
}
๐ ์ธํฐํ์ด์ค
์ผ์ข
์ ์ถ์ํด๋์ค.
์ค์ง! ์ถ์๋ฉ์๋์ ์์(๋ณํ์ง ์๋ ๊ฐ)๋ง์ ๋ฉค๋ฒ๋ก ๊ฐ์ง ์ ์๋ค.
interface ์ธํฐํ์ด์ค ์ด๋ฆ {
public static final ํ์
์์์ด๋ฆ = ๊ฐ;
public abstract ๋ฉ์๋์ด๋ฆ(๋งค๊ฐ๋ณ์๋ชฉ๋ก);
}
๐จ ๋ชจ๋ ๋ฉค๋ฒ ๋ณ์๋ public static final
์ด์ด์ผํ๋ฉฐ, ์ด๋ฅผ ์๋ตํ ์ ์๋ค.
๐จ ๋ชจ๋ ๋ฉ์๋๋ public abstract
์ด์ด์ผํ๋ฉฐ, ์ด๋ฅผ ์๋ตํ ์ ์๋ค.
(์๋ต๋ ์ ์ด์๋ ์ปดํ์ผ ์์ ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก ์ถ๊ฐํด์ค๋ค.)
๐ ์ธํฐํ์ด์ค์ ์์
์ธํฐํ์ด์ค๋ ์ธํฐํ์ด์ค๋ก๋ถํฐ๋ง ์์๋ฐ์ ์ ์๋ค.
ํด๋์ค์ ๋ฌ๋ฆฌ, ๋ค์ค ์์ ๊ฐ๋ฅ. (ํ์ง๋ง, ์๋ฐ์์ ์ธํฐํ์ด์ค๋ก ๋ค์ค ์์์ ๊ตฌํํ๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์๋ค.)
interface Movable {
void move(int x, int y);
}
interface Attackable {
void attack(Unit u);
}
interface Fightable extends Movable, Attackable { ... }
๐ ์ธํฐํ์ด์ค์ ๊ตฌํ
implements
('๊ตฌํํ๋ค'๋ผ๋ ๋ป) ํค์๋๋ก ์ธํฐํ์ด์ค ๋ด๋ถ์ ์ถ์๋ฉ์๋๋ฅผ ์์ฑํด ์ค ์ ์๋ค.
class ํด๋์ค ์ด๋ฆ implements ์ธํฐํ์ด์ค์ด๋ฆ {
// ์ธํฐํ์ด์ค์ ์ ์๋๋ ์ถ์๋ฉ์๋ ๊ตฌํ
}
class Fighter implements Fightable {
pulic void move(int x, int y) { ... }
public void attack(Unit u) { ... }
}
๐จ ์ผ๋ถ์ ์ถ์๋ฉ์๋๋ง ์์ฑํด ์ฃผ๊ณ ์ถ๋ค๋ฉด abstract
๋ฅผ ๋ถ์ฌ์ ์ถ์ํด๋์ค ๋ก ์ ์ธํด์ค์ผํ๋ค.
abstract class Fighter implements Fightable {
public void move(int x, int y) { ... }
}
๐จ ์์(extends
)๊ณผ ๊ตฌํ(implements
)์ ๋์์ ์ฌ์ฉํ ์ ์๋ค.
class Fighter extends Unit implements Fightable {
public void move(int x, int y) { ... }
public void attack(Unit u) { ... }
}
๐ ์ธํฐํ์ด์ค์ ์ฅ์
- ๊ฐ๋ฐ ์๊ฐ์ ๋จ์ถ ์ํฌ ์ ์๋ค.
- ํ์คํ๊ฐ ๊ฐ๋ฅํ๋ค.
- ์๋ก ๊ด๊ณ ์๋ ํด๋์ค๋ค์๊ฒ ๊ด๊ณ๋ฅผ ๋งบ์ด์ค ์ ์๋ค.
- ๋ ๋ฆฝ์ ์ธ ํ๋ก๊ทธ๋๋ฐ์ด ๊ฐ๋ฅํ๋ค.
๐ ๋คํ์ฑ
์ฌ๋ฌ๊ฐ์ง ํํ๋ฅผ ๊ฐ์ง ์ ์๋ ๋ฅ๋ ฅ.
์กฐ์ ํด๋์ค ํ์
์ ์ฐธ์กฐ๋ณ์๋ก ์์ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ ์ ์๋๋ก ํ๋ ๊ฒ.
class Tv { // ์กฐ์ ํด๋์ค
boolean power;
int channeel;
void power() { power = !power; }
void channelUp { ++channel; }
void channelDown { --channel; }
}
class CaptionTv extends Tv { // ์์ ํด๋์ค
String text;
void caption() { ... }
}
Tv t = new CaptionTv(); // ์กฐ์ ํ์
์ ์ฐธ์กฐ๋ณ์๋ก ์์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐ
์ฐธ์กฐ๋ณ์ t
์ ํ์
์ด ์กฐ์(Tv
)์ด๊ธฐ ๋๋ฌธ์ ์ค์ ์ธ์คํด์ค๊ฐ CaptionTv
๋ผ ํ ์ง๋ผ๋,
์ฐธ์กฐ๋ณ์ t
๋ก๋ CaptionTv
์ธ์คํด์ค์ ๋ชจ๋ ๋ฉค๋ฒ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
Tv
ํด๋์ค์ ๋ฉค๋ฒ๋ค๋ง ์ฌ์ฉํ ์ ์๋ค.
๋๋ฌธ์ ์ฐธ์กฐ๋ณ์๊ฐ ์ฌ์ฉํ ์ ์๋ ๋ฉค๋ฒ์ ๊ฐ์๋ ์ธ์คํด์ค์ ๋ฉค๋ฒ ๊ฐ์๋ณด๋ค ๊ฐ๊ฑฐ๋ ์ ๋ค.
๐ ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํ ๋คํ์ฑ
์ธํฐํ์ด์ค๋ ์ด๋ค ํด๋์ค๋ฅผ ๊ตฌํ(implements
) ํ๋ฉด์ ์์ฑ๋ ์ ์๋ค๊ณ ํ๋ค.
์ฆ, ๊ตฌํํ ํด๋์ค์ ์กฐ์์ด๋ผํ ์ ์๋ ์
์ด๋ค.
๋๋ฌธ์ ์์ ์ค๋ช ํ ๋คํ์ฑ์ ํน์ง์ด ์ธํฐํ์ด์ค์์๋ ์ ์ฉ๋๋ค.
์ธํฐํ์ด์ค Fightable
์ ํด๋์ค Fighter
๊ฐ ๊ตฌํํ์ ๋,
์๋์ ๊ฐ์ด ์ฐธ์กฐ๋ณ์(f
)์ ํ์
์ ์กฐ์(Fightable
)์ผ๋ก ์ ์ํด ์ค ์ ์๋ค.
Fightable f = new Fighter();
๐จ๋งค๊ฐ๋ณ์์ ํ์ ์ด ์ธํฐํ์ด์ค์ธ ๊ฒฝ์ฐ๐จ
void attack(Fightable f) {
...
}
Fightable
์ธํฐํ์ด์ค ํ์
์ ๋งค๊ฐ๋ณ์ f
๊ฐ ๊ฐ๋ ์๋ฏธ๋
๋ฉ์๋ ํธ์ถ ์ ํด๋น ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ ๊ณตํด์ผํ๋ค๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ attack
๋ฉ์๋๋ฅผ ํธ์ถํ ๋๋ ๋งค๊ฐ๋ณ์๋ก Fightable
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋๊ฒจ์ฃผ์ด์ผ ํ๋ค.
attac(new Fighter());
๐จ๋ฆฌํดํ์ ์ด ์ธํฐํ์ด์ค์ธ ๊ฒฝ์ฐ๐จ
Fightable method() {
Fighter f = new Fighter();
return f;
}
๋ฉ์๋๊ฐ ํด๋น ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ฐํํด์ผํ๋ค๋ ์๋ฏธ์ด๋ค.