인터페이스의 다형성
- 개발시간의 단축
- 표준화 가능
- 관계없는 클래스간에 관계설정 가능
- 독립적인 프로그래밍 가능
1)
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;
}
}
}
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.");
}
}
public 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");
}
}
2)
public class RepairableTest {
public static void main(String[] args) {
Tank t = new Tank();
DropShip d = new DropShip();
Marine m = new Marine();
SCV s = new SCV();
s.repair(t);
s.repair(d);
//marine으로는 인터페이스를 구현하지 않았기 때문에 repair메서드를 부를수 없다.
}
}
class Unit {
int hitPoint;
final int MAX_HP;
Unit(int hp) {
MAX_HP = hp;
}
}
interface Repairable { }
class GroundUnit extends Unit {
GroundUnit(int hp) {
super(hp);
}
}
class AirUnit extends Unit {
AirUnit(int hp) {
super(hp);
}
}
class Tank extends GroundUnit implements Repairable {
Tank() {
super(150);
hitPoint = MAX_HP;
}
public String toString() {
return "Tank";
}
}
class DropShip extends AirUnit implements Repairable {
DropShip() {
super(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) {
//marine은 Repairable을 상속하지 않기 때문에 매개변수로 들어올수 없다
if(r instanceof Unit) {
Unit u = (Unit)r; //형변환이 가능하면 형변환 한다.
while(u.hitPoint == u.MAX_HP) { //hitPoint가 MAX_HP와 같을 때까지 증가시킨다.
u.hitPoint++;
}
System.out.println(u.toString() + "의 수리가 끝났습니다.");
}
}
}
마린은 SCV로 수리되는 유닛이 아니기 때문에 repair메서드를 사용하자고 하기엔 무리가 있다.
마린은 메딕이 필요하다.
때문에 같은 Ground유닛이지만 치료개념인 마린을 수리개념인 탱크, SCV와 분리시키고
수리가 가능한 Air유닛 드랍쉽에도 repair를 적용시키기 위해 인터페이스로 상속하여
각기 다른 클래스를 상속하는 클래스에 인터페이스로 상속관계를 주었다.