์๋ก
Spring ๊ณต๋ถํ๋ ์ค interface๋ถ๋ถ์ ๋ํด ์ดํด๊ฐ ๋ถ์กฑํ ๊ฒ ๊ฐ์ ์์ธํ๊ฒ ํ๋ฒ ์ ๋ฆฌํด ๋ณด๋ ค๊ณ ํฉ๋๋ค.
๋ชฉ์ฐจ
1. ์ธํฐํ์ด์ค๋?
2. ์ธํฐํ์ด์ค์ ์์ฑ ๋ฐฉ๋ฒ
3. ์ธํฐํ์ด์ค์ ์์
4. ์ธํฐํ์ด์ค์ ๊ตฌํ
5. ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํ ๋คํ์ฑ
6. ์ธํฐํ์ด์ค์ ์ฅ์
1. ์ธํฐํ์ด์ค๋?
์ธํฐํ์ด์ค๋ ์ผ์ข ์ ์ถ์ ํด๋์ค์ ๋๋ค. ์ธํฐํ์ด์ค๋ ์ถ์ ํด๋์ค์ฒ๋ผ ์ถ์ ๋ฉ์๋๋ฅผ ๊ฐ์ง๋ง ์ถ์ ํด๋์ค๋ณด๋ค ์ถ์ํ ์ ๋๊ฐ ๋์์ ์ถ์ ํด๋์ค์ ๋ฌ๋ฆฌ ๋ชธํต์ ๊ฐ์ถ ์ผ๋ฐ ๋ฉ์๋ ๋๋ ๋ฉค๋ฒ ๋ณ์๋ฅผ ๊ตฌ์ฑ์์ผ๋ก ๊ฐ์ง ์ ์์ต๋๋ค. ์ค์ง "์ถ์ ๋ฉ์๋"์ "์์"๋ง์ ๋ฉค๋ฒ๋ก ๊ฐ์ง ์ ์์ต๋๋ค.
์ถ์ ํด๋์ค๋ฅผ ๋ถ๋ถ์ ์ผ๋ก๋ง ์์ฑ๋ '๋ฏธ์์ฑ ์ค๊ณ๋'๋ผ๊ณ ํ๋ค๋ฉด, ์ธํฐํ์ด์ค๋ ๊ตฌํ๋ ๊ฒ์ ์๋ฌด๊ฒ๋ ์๊ณ ๋ฐ๊ทธ๋ฆผ๋ง ๊ทธ๋ ค์ ธ ์๋ '๊ธฐ๋ณธ ์ค๊ณ๋'๋ผ ํ ์ ์์ต๋๋ค.
์ธํฐํ์ด์ค๋ ์ถ์ ํด๋์ค์ฒ๋ผ ์์ฑ๋์ง ์์ ๋ถ์์ ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ทธ ์์ฒด๋ง์ผ๋ก ์ฌ์ฉ๋๊ธฐ๋ณด๋ค๋ ๋ค๋ฅธ ํด๋์ค๋ฅผ ์์ฑํ๋๋ฐ ๋์์ ์ค ๋ชฉ์ ์ผ๋ก ์์ฑ๋ฉ๋๋ค.
2. ์ธํฐํ์ด์ค์ ์์ฑ ๋ฐฉ๋ฒ
์ธํฐํ์ด์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ ํด๋์ค๋ฅผ ์์ฑํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ๋ค๋ง ํค์๋๋ก class ๋์ interface๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ๋ง ๋ค๋ฆ ๋๋ค. ๊ทธ๋ฆฌ๊ณ interface์๋ ํด๋์ค์ ๊ฐ์ด ์ ๊ทผ์ ์ด์๋ก public ๋๋ default๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
interface ์ธํฐํ์ด์ค์ด๋ฆ{
public static final ํ์
์์์ด๋ฆ = ๊ฐ;
public abstract ๋ฉ์๋์ด๋ฆ(๋งค๊ฐ๋ณ์๋ชฉ๋ก);
}
์ผ๋ฐ์ ์ธ ํด๋์ค์ ๋ฉค๋ฒ๋ค๊ณผ ๋ฌ๋ฆฌ ์ธํฐํ์ด์ค์ ๋ฉค๋ฒ๋ค์ ๋ค์๊ณผ ๊ฐ์ ์ ์ฝ์ฌํญ์ด ์์ต๋๋ค.
- ๋ชจ๋ ๋ฉค๋ฒ ๋ณ์๋ public static final ์ด์ด์ผ ํ๋ฉฐ, ์ด๋ฅผ ์๋ตํ ์ ์๋ค.
- ๋ชจ๋ ๋ฉ์๋๋ public abstract ์ด์ด์ผ ํ๋ฉฐ, ์ด๋ฅผ ์๋ตํ ์ ์๋ค.(๋จ, static๋ฉ์๋์ default ๋ฉ์๋๋ JDK1.8๋ถํฐ ์์ธ)
interface PlayingCard {
public static final int SPADE = 4;
final int DIAMOND = 3; // public static final int DIAMOND = 3;
static int HEART = 2; // public static final int HEART = 2;
int CLOVER = 1; // public static final int CLOVER = 1;
public abstract String getCardNumber();
String getCardKing(); // public abstract String getCardKind();
}
์๋ต๋ ์ ์ด์๋ ์ปดํ์ผ ์์ ์ปดํ์ผ๋ฌ๊ฐ ์๋์ ์ผ๋ก ์์ ๊ฐ์ด ์ถ๊ฐํด ์ค๋๋ค.
3. ์ธํฐํ์ด์ค์ ์์
์ธํฐํ์ด์ค๋ ์ธํฐํ์ด์ค๋ก๋ถํฐ๋ง ์์๋ฐ์ ์ ์์ผ๋ฉฐ, ํด๋์ค์๋ ๋ฌ๋ฆฌ ๋ค์ค ์์, ์ฆ ์ฌ๋ฌ ๊ฐ์ ์ธํฐํ์ด์ค๋ก๋ถํฐ ์์์ ๋ฐ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค.(์ฐธ๊ณ : ์ธํฐํ์ด์ค๋ ํด๋์ค์ ๋ฌ๋ฆฌ Objectํด๋์ค์ ๊ฐ์ ์ต๊ณ ์กฐ์์ด ์์ต๋๋ค.)
interface Movable {
/** ์ง์ ๋ ์์น(x, y)๋ก ์ด๋ํ๋ ๊ธฐ๋ฅ์ ๋ฉ์๋ */
void move(int x, int y);
}
interface Attackable {
/** ์ง์ ๋ ๋์(u)์ ๊ณต๊ฒฉํ๋ ๊ธฐ๋ฅ์ ๋ฉ์๋ */
void attack(Unit u);
}
interface Fightable extends Movable, Attackable {}
ํด๋์ค์ ์์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ ์ธํฐํ์ด์ค(Fightable)๋ ์กฐ์ ์ธํฐํ์ด์ค(Movable, Attackable)์ ์ ์๋ ๋ฉค๋ฒ๋ฅผ ๋ชจ๋ ์์๋ฐ์ต๋๋ค.
๊ทธ๋์ Fightable์์ฒด์๋ ์ ์๋ ๋ฉค๋ฒ๊ฐ ํ๋๋ ์์ง๋ง ์กฐ์ ์ธํฐํ์ด์ค๋ก๋ถํฐ ์์๋ฐ์ ๋ ๊ฐ์ ์ถ์ ๋ฉ์๋, move(int x, int y)์ attack(Unit u)์ ๋ฉค๋ฒ๋ก ๊ฐ๊ฒ ๋ฉ๋๋ค.
4. ์ธํฐํ์ด์ค์ ๊ตฌํ
์ธํฐํ์ด์ค๋ ์ถ์ ํด๋์ค์ฒ๋ผ ๊ทธ ์์ฒด๋ก๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ, ์ถ์ ํด๋์ค๊ฐ ์์์ ํตํด ์ถ์ ๋ฉ์๋๋ฅผ ์์ฑํ๋ ๊ฒ์ฒ๋ผ, ์ธํฐํ์ด์ค๋ ์์ ์๊ฒ ์ ์๋ ์ถ์ ๋ฉ์๋์ ๋ชธํต์ ๋ง๋ค์ด์ฃผ๋ ํด๋์ค๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
class ClassName implements InterfaceName {
// ์ธํฐํ์ด์ค์ ์ ์๋ ์ถ์๋ฉ์๋ ๊ตฌํ
}
interface InterfaceName{
}
์ธํฐํ์ด์ค๋ ๊ตฌํํ๋ค๋ ์๋ฏธ์ ํค์๋ 'implements'๋ฅผ ์ฌ์ฉํ์ฌ ์์ ๊ฐ์ด ๊ตฌํํ ์ ์์ต๋๋ค.
abstract class Fighter implements Fightable {
public void move(int x, int y) { /* ๋ด์ฉ ์๋ต */ }
}
๋ง์ผ ๊ตฌํํ๋ ์ธํฐํ์ด์ค์ ๋ฉ์๋ ์ค ์ผ๋ถ๋ง ๊ตฌํํ๋ค๋ฉด, abstract๋ฅผ ๋ถ์ฌ์ ์์ ๊ฐ์ด ์ถ์ ํด๋์ค๋ก ์ ์ธํด์ผ ํฉ๋๋ค.
class Fighter extends Unit implements Fightable {
public void move(int x, int y) { /* ๋ด์ฉ ์๋ต */ }
public void attack(Unit u) { /* ๋ด์ฉ ์๋ต */ }
}
๊ทธ๋ฆฌ๊ณ ์์ ๊ฐ์ด ์์๊ณผ ๊ตฌํ์ ๋์์ ํ ์๋ ์์ต๋๋ค.
ํ๋ฒ ์๋์ ์ ์ฒด ์ฝ๋๋ฅผ ํ๋ฒ ์์๋ก ๋ค์ด ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
class FighterTest {
public static void main(String[] args) {
Fighter f = new Fighter();
if (f instanceof Unit) {
System.out.println("f๋ Unitํด๋์ค์ ์์์
๋๋ค.");
}
if (f instanceof Fightable) {
System.out.println("f๋ Fightable์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ต๋๋ค.");
}
if (f instanceof Movable) {
System.out.println("f๋ Movable์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ต๋๋ค.");
}
if (f instanceof Attackable) {
System.out.println("f๋ Attackable์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ต๋๋ค.");
}
if (f instanceof Object) {
System.out.println("f๋ Objectํด๋์ค์ ์์์
๋๋ค.");
}
}
}
class Fighter extends Unit implements Fightable {
public void move(int x, int y) { /* ๋ด์ฉ ์๋ต */ }
public void attack(Unit u) { /* ๋ด์ฉ ์๋ต */ }
}
class Unit {
int currentHP; // ์ ๋์ ์ฒด๋ ฅ
int x; // ์ ๋์ ์์น(x์ขํ)
int y; // ์ ๋์ ์์น(y์ขํ)
}
interface Fightable extends Movable, Attackable {
}
interface Movable {
void move(int x, int y);
}
interface Attackable {
void attack(Unit u);
}
์ค์ ๋ก Fighterํด๋์ค๋ Unitํด๋์ค๋ก๋ถํฐ ์์๋ฐ๊ณ Fightable์ธํฐํ์ด์ค๋ง์ ๊ตฌํํ์ง๋ง, Unitํด๋์ค๋ Objectํด๋์ค์ ์์์ด๊ณ , Fightable์ธํฐํ์ด์ค๋ Attackable๊ณผ Movable์ธํฐํ์ด์ค์ ์์์ด๋ฏ๋ก Fighterํด๋์ค๋ ์ด ๋ชจ๋ ํด๋์ค์ ์ธํฐํ์ด์ค์ ์์์ด ๋๋ ์ ์ด ๋ฉ๋๋ค.
5. ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํ ๋คํ์ฑ
์ธํฐํ์ด์ค๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์ ์กฐ์์ด๋ผ ํ ์ ์์ผ๋ฏ๋ก ํด๋น ์ธํฐํ์ด์ค ํ์ ์ ์ฐธ์กฐ ๋ณ์๋ก ์ด๋ฅผ ๊ตฌํํ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ ์ ์์ผ๋ฉฐ, ์ธํฐํ์ด์ค ํ์ ์ผ๋ก์ ํ ๋ณํ๋ ๊ฐ๋ฅํฉ๋๋ค.
Fightable f = new Fighter();
์๋ฅผ ๋ค์ด ์์ ๊ฐ์ด ์ธํฐํ์ด์ค Fightable์ ํด๋์ค Fighter๊ฐ ๊ตฌํํ์ ๋, ๋ค์๊ณผ ๊ฐ์ด Fighter์ธ์คํด์ค๋ฅผ Fightableํ์ ์ ์ฐธ์กฐ ๋ณ์๋ก ์ฐธ์กฐํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค.
void attack(Fightable f){
// ๋ด์ฉ ์๋ต
}
๋ฐ๋ผ์ ์ธํฐํ์ด์ค๋ ์์ ๊ฐ์ด ๋ฉ์๋์ ๋งค๊ฐ๋ณ์์ ํ์ ์ผ๋ก๋ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
์ธํฐํ์ด์ค ํ์ ์ ๋งค๊ฐ๋ณ์๊ฐ ๊ฐ๋ ์๋ฏธ๋ ๋ฉ์๋ ํธ์ถ ์ ํด๋น ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ ๊ณตํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋์ attack๋ฉ์๋๋ฅผ ํธ์ถํ ๋๋ ๋งค๊ฐ๋ณ์๋ก Fightable์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋๊ฒจ์ฃผ์ด์ผ ํฉ๋๋ค.
class Fighter extends Unit implements Fightable {
public void move(int x, int y) { /* ๋ด์ฉ ์๋ต */}
public void attack(Fightable f) { /* ๋ด์ฉ ์๋ต */}
}
ํ๋ฒ ์์ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Fightable์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ Fighterํด๋์ค๊ฐ ์์ ๋, attack๋ฉ์๋์ ๋งค๊ฐ๋ณ์๋ก Fighter์ธ์คํด์ค๋ฅผ ๋๊ฒจ์ค ์ ์์ต๋๋ค. ์ฆ, attack(new Fighter())์ ๊ฐ์ด ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
Fightable method() {
//...
Figther fighter = new Fighter();
return fighter;
}
๊ทธ๋ฆฌ๊ณ ์์ ๊ฐ์ด ๋ฉ์๋์ ๋ฆฌํด ํ์ ์ผ๋ก ์ธํฐํ์ด์ค์ ํ์ ์ ์ง์ ํ๋ ๊ฒ ์ญ์ ๊ฐ๋ฅํฉ๋๋ค.
๋ฆฌํด ํ์ ์ด ์ธํฐํ์ด์ค๋ผ๋ ๊ฒ์ ๋ฉ์๋๊ฐ ํด๋น ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์์ ์ฝ๋์์๋ method()์ ๋ฆฌํด ํ์ ์ด Fightable์ธํฐํ์ด์ค์ด๊ธฐ ๋๋ฌธ์ ๋ฉ์๋์ return๋ฌธ์์ Fightable์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ Fighterํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ฐํํฉ๋๋ค.
์๋์ ๋คํ์ฑ ์์ ์ฝ๋๋ฅผ ํ๋ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
interface Parseable {
// ๊ตฌ๋ฌธ ๋ถ์์์
์ ์ํํ๋ค.
public abstract void parse(String fileName);
}
class ParserManager {
// ๋ฆฌํดํ์
์ด Parseable์ธํฐํ์ด์ค์ด๋ค.
public static Parseable getParser(String type) {
if (type.equals("XML")) {
return new XMLParser();
} else {
Parseable p = new HTMLParser();
return p;
// return new HTMLParser();
}
}
}
class XMLParser implements Parseable {
public void parse(String fileName) {
/* ๊ตฌ๋ฌธ ๋ถ์์์
์ ์ํํ๋ ์ฝ๋๋ฅผ ์ ๋๋ค. */
System.out.println(fileName + "- XML parsing completed.");
}
}
class HTMLParser implements Parseable {
public void parse(String fileName) {
/* ๊ตฌ๋ฌธ ๋ถ์์์
์ ์ํํ๋ ์ฝ๋๋ฅผ ์ ๋๋ค. */
System.out.println(fileName + "-HTML parsing completed.");
}
}
class ParserTest {
public static void main(String args[]) {
Parseable parser = ParserManager.getParser("XML");
parser.parse("document.xml");
parser = ParserManager.getParser("HTML");
parser.parse("document2.html");
}
}
๋ง์ผ ๋์ค์ ์๋ก์ด ์ข ๋ฅ์ NewXMLParserํด๋์ค๊ฐ ๋์๋ ParserTestํด๋์ค๋ ๋ณ๊ฒฝํ ํ์ ์์ด, ParserManagerํด๋์ค์ getParser๋ฉ์๋์์ 'return newXMLParser(); ๋์ 'return new NewXMLParser();'๋ก ๋ณ๊ฒฝํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
์ด๋ฌํ ์ฅ์ ์ ํนํ ๋ถ์ฐ ํ๊ฒฝ ํ๋ก๊ทธ๋๋ฐ์์ ๊ทธ ์๋ ฅ์ ๋ฐํํ๋๋ฐ, ์ฌ์ฉ์ ์ปดํจํฐ์ ์ค์น๋ ํ๋ก๊ทธ๋จ์ ๋ณ๊ฒฝํ์ง ์๊ณ ์๋ฒ ์ธก์ ๋ณ๊ฒฝ๋ง์ผ๋ก๋ ์ฌ์ฉ์๊ฐ ์๋ก ๊ฐ์ ๋ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค.
6. ์ธํฐํ์ด์ค์ ์ฅ์
๊ทธ๋ ๋ค๋ฉด ์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ ๊น์? ๊ทธ ์ฅ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๊ฐ๋ฐ ์๊ฐ์ ๋จ์ถ์ํฌ ์ ์๋ค.
- ํ์คํ๊ฐ ๊ฐ๋ฅํ๋ค.
- ์๋ก ๊ด๊ณ์๋ ํด๋์ค๋ค์๊ฒ ๊ด๊ณ๋ฅผ ๋งบ์ด ์ค ์ ์๋ค.
- ๋ ๋ฆฝ์ ์ธ ํ๋ก๊ทธ๋๋ฐ์ด ๊ฐ๋ฅํ๋ค.
์ธํฐํ์ด์ค ์ฅ์ ์์ ์ฝ๋
class RepairableTest {
public static void main(String[] args) {
Tank tank = new Tank();
Dropship dropship = new Dropship();
Marine marine = new Marine();
SCV scv = new SCV();
scv.repair(tank); // SCV๊ฐ Tank๋ฅผ ์๋ฆฌํ๋๋ก ํ๋ค.
scv.repair(dropship);
// scv.repair(marine); // ์ฃผ์์ ํ๋ฉด ์ปดํ์ผ ์๋ฌ ๋ฐ์
}
}
interface Repairable {
}
class GroundUnit extends Unit {
GroundUnit(int hp) {
super(hp);
}
}
class AirUnit extends Unit {
AirUnit(int hp) {
super(hp);
}
}
class Unit {
int hitPoint;
final int MAX_HP;
Unit(int hp) {
MAX_HP = hp;
}
//...
}
class Tank extends GroundUnit implements Repairable {
Tank() {
super(150); // Tank์ HP๋ 150์ด๋ค.
hitPoint = MAX_HP;
}
public String toString() {
return "Tank";
}
//...
}
class Dropship extends AirUnit implements Repairable {
Dropship() {
super(125); // Dropship์ HP๋ 125์ด๋ค.
hitPoint = MAX_HP;
}
public String toString() {
return "Dropship";
}
//...
}
class Marine extends GroundUnit {
Marine() {
super(40);
hitPoint = MAX_HP;
}
//...
}
class SCV extends GroundUnit implements Repairable {
SCV() {
super(60);
hitPoint = MAX_HP;
}
void repair(Repairable r) {
if (r instanceof Unit) {
Unit u = (Unit) r;
while (u.hitPoint != u.MAX_HP) {
/* Unit์ HP๋ฅผ ์ฆ๊ฐ์ํจ๋ค. */
u.hitPoint++;
}
System.out.println(u.toString() + "์ ์๋ฆฌ๊ฐ ๋๋ฌ์ต๋๋ค.");
}
}
//...
}
์ ์ฝ๋๋ ์คํํฌ๋ํํธ ๊ฒ์ ์ ๋์ ๋์์ผ๋ก ํด๋์ค๋ก ๊ตฌํํ ๊ฒ์ ๋๋ค.
๋ชจ๋ ์ ๋๋ค์ ์ต๊ณ ์กฐ์์ Unitํด๋์ค์ด๊ณ ์ ๋์ ์ข ๋ฅ๋ ์ง์ ์ ๋(GroundUnit)๊ณผ ๊ณต์ค ์ ๋(AirUnit)์ผ๋ก ๋๋์ด์ง๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ง์ ์ ๋์๋ Marine, SCV, Tank๊ฐ ์๊ณ , ๊ณต์ค ์ ๋์ผ๋ก๋ Dropship์ด ์์ต๋๋ค. SCV์๊ฒ Tank, Dropship๊ณผ ๊ฐ์ ๊ธฐ๊ณํ ์ ๋์ ์๋ฆฌํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ์ํด repair()๋ฅผ ์ ์ํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ๋๋ค.
void repair(Tank tank) {
// Tank๋ฅผ ์๋ฆฌํ๋ค.
}
void repair(Dropship dropship) {
// Dropship์ ์๋ฆฌํ๋ค.
}
์ด๋ฐ ์์ผ๋ก ์๋ฆฌ๊ฐ ๊ฐ๋ฅํ ์ ๋์ ๊ฐ์๋งํผ ๋ค๋ฅธ ๋ฒ์ ์ ์ค๋ฒ๋ก๋ฉ๋ ๋ฉ์๋๋ฅผ ์ ์ํด์ผ ํ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ํผํ๊ธฐ ์ํด ๋งค๊ฐ๋ณ์์ ํ์ ์ ์ด ๋ค์ ๊ณตํต ์กฐ์์ผ๋ก ํ๋ฉด ์ข๊ฒ ์ง๋ง Dropship์ ๊ณตํต์กฐ์์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๊ณตํต์กฐ์์ ํ์ ์ผ๋ก ๋ฉ์๋๋ฅผ ์ ์ํ๋ค๊ณ ํด๋ ์๋์ ๊ฐ์ด ์ต์ํ 2๊ฐ์ ๋ฉ์๋๊ฐ ํ์ํ ๊ฒ์ ๋๋ค.
void repair(GroundUnit groundUnit) {
// ์ง์์ ๋ ์๋ฆฌ
}
void repair(AirUnit airUnit) {
// ๊ณต์ค์ ๋ ์๋ฆฌ
}
๊ทธ๋ฆฌ๊ณ GroundUnit์ ์์ ์ค์๋ Marine๊ณผ ๊ฐ์ด ๊ธฐ๊ณํ ์ ๋์ด ์๋ ํด๋์ค๋ ํฌํจ๋ ์ ์๊ธฐ ๋๋ฌธ์ repair๋ฉ์๋์ ๋งค๊ฐ๋ณ์ ํ์ ์ผ๋ก GroundUnit์ ๋ถ์ ํฉํฉ๋๋ค.
ํ์ฌ์ ์์๊ด๊ณ์์๋ ์ด๋ค์ ๊ณตํต์ ์ด ์์ต๋๋ค. ๋๋ฌธ์ ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํ์ฌ ๊ธฐ์กด์ ์์์ฒด๊ณ๋ฅผ ์ ์งํ๋ฉด์ ์ด๋ค ๊ธฐ๊ณํ ์ ๋์ ๊ณตํต์ ์ ๋ถ์ฌํ ์ ์์ต๋๋ค.
์๋์ ๊ฐ์ด Repairable์ด๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๊ณ ์๋ฆฌ๊ฐ ๊ฐ๋ฅํ ๊ธฐ๊ณํ ์ ๋์๊ฒ ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋๋ก ํ๋ฉด ๋ฉ๋๋ค.
interface Repairable {
}
// ์ง์์ ๋ ์์, ์๋ฆฌ์ธํฐํ์ด์ค ๊ตฌํ
class SCV extends GroundUnit implements Repairable {
// ...
}
// ์ง์์ ๋ ์์, ์๋ฆฌ์ธํฐํ์ด์ค ๊ตฌํ
class Tank extends GroundUnit implements Repairable {
// ...
}
// ๊ณต์ค์ ๋ ์์, ์๋ฆฌ์ธํฐํ์ด์ค ๊ตฌํ
class Dropship extends AirUnit implements Repairable {
// ...
}
์ด์ ์ด 3๊ฐ์ ํด๋์ค์๋ ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค๋ ๊ณตํต์ ์ด ์๊ฒผ์ต๋๋ค. ์ธํฐํ์ด์ค Repairable์ ์ ์๋ ๊ฒ์ ์๋ฌด๊ฒ๋ ์๊ณ , ๋จ์ง ์ธ์คํด์ค์ ํ์ ์ฒดํฌ์๋ง ์ฌ์ฉ๋ ๋ฟ์ ๋๋ค. Repairable์ธํฐํ์ด์ค๋ฅผ ์ค์ฌ์ผ๋ก ์์๊ณ์ธต๋๋ฅผ ๊ทธ๋ ค๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
repair๋ฉ์๋์ ๋งค๊ฐ๋ณ์ r์ Repairableํ์ ์ด๊ธฐ ๋๋ฌธ์ ์ธํฐํ์ด์ค Repairable์ ์ ์๋ ๋ฉค๋ฒ๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ Repairable์๋ ์ ์๋ ๋ฉค๋ฒ๊ฐ ์์ผ๋ฏ๋ก ์ด ํ์ ์ ์ฐธ์กฐ ๋ณ์๋ก๋ ํ ์ ์๋ ์ผ์ ์๋ฌด๊ฒ๋ ์์ต๋๋ค.
๊ทธ๋์ instanceof์ฐ์ฐ์๋ก ํ์ ์ ์ฒดํฌํ ๋ค ์บ์คํ ํ์ฌ Unitํด๋์ค์ ์ ์๋ hitPoint์ MAX_HP๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํ์์ต๋๋ค. ๊ทธ๋ค์์ ์ ๋์ ํ์ฌ ์ฒด๋ ฅ(hitPoint)์ด ์ ๋์ด ๊ฐ์ง ์ ์๋ ์ต๊ณ ์ฒด๋ ฅ(MAX_HP)์ด ๋ ๋๊น์ง ์ฒด๋ ฅ์ ์ฆ๊ฐ์ํค๋ ์์ ์ ์ํํฉ๋๋ค.
Marine์ Repairable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ง ์์์ผ๋ฏ๋ก SCVํด๋์ค์ repair๋ฉ์๋์ ๋งค๊ฐ๋ณ์๋ก Marine์ ์ฌ์ฉํ๋ฉด ์ปดํ์ผ ์์ ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
'BackEnd๐ฑ > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] StringBuffer์ StringBuilder (0) | 2022.04.06 |
---|---|
[Java] ArrayList vs LinkedList (0) | 2022.04.06 |
[Java] String ํด๋์ค (0) | 2022.04.05 |
[Java] super์ super()์ ๊ฐ๋ (0) | 2022.03.24 |
[Java] static ๊ณผ instance์ ์ฐจ์ด (0) | 2022.03.21 |
[Java] JVM์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์ฑ์์์ ์์ญ์ ๊ดํ ๊ณ ์ฐฐ (0) | 2022.03.18 |
๋๊ธ