스타크래프트로 보는 오버라이딩

질럿, 드라군 유닛 생성
오버로딩으로 생성 시 (한계가 없을때 사용 > 비추) 오버로딩의 한계 …


메소드의 매개변수가 Dragoon, Zealot 레퍼런스 타입인 것을 확인
코드
package ex06.example3;
public class StarApp {
//객체를 매개변수로 받음
public static void gameStart(Zealot u1, Dragoon u2) {
u1.attack();
u2.attack();
}
public static void gameStart(Dragoon u1, Zealot u2) {
u1.attack();
u2.attack();
}
public static void gameStart(Zealot u1, Zealot u2) {
u1.attack();
u2.attack();
}
public static void main(String[] args) {
Zealot z1 = new Zealot("z1");
Dragoon d1 = new Dragoon("d1");
Zealot z2 = new Zealot("z2");
gameStart(z1, d1);
gameStart(d1, z1);
gameStart(z2, z1);
gameStart(z1, z2);
}
}

유닛 하나가 추가될 때마다 경우의 수…
//객체를 매개변수로 받음
public static void gameStart(Zealot u1, Dragoon u2) {
u1.attack();
u2.attack();
}
public static void gameStart(Zealot u1, Zealot u2) {
u1.attack();
u2.attack();
}
public static void gameStart(Zealot u1, River u2) {
u1.attack();
u2.attack();
}
public static void gameStart(Zealot u1, Dark u2) {
u1.attack();
u2.attack();
}
public static void gameStart(Dragoon u1, Zealot u2) {
u1.attack();
u2.attack();
}
public static void gameStart(Dragoon u1, Dragoon u2) {
u1.attack();
u2.attack();
}
public static void gameStart(Dragoon u1, River u2) {
u1.attack();
u2.attack();
}
public static void gameStart(Dragoon u1, Dark u2) {
u1.attack();
u2.attack();
}
public static void gameStart(River u1, Zealot u2) {
u1.attack();
u2.attack();
}
public static void gameStart(River u1, Dragoon u2) {
u1.attack();
u2.attack();
}
public static void gameStart(River u1, River u2) {
u1.attack();
u2.attack();
}
public static void gameStart(River u1, Dark u2) {
u1.attack();
u2.attack();
}
public static void gameStart(Dark u1, Zealot u2) {
u1.attack();
u2.attack();
}
public static void gameStart(Dark u1, Dragoon u2) {
u1.attack();
u2.attack();
}
public static void gameStart(Dark u1, Dark u2) {
u1.attack();
u2.attack();
}
public static void gameStart(Dark u1, River u2) {
u1.attack();
u2.attack();
}
라바와 다크템플러만 추가했더니... 오버로딩을 쓰면 ...... 이런 식으로 .. 나옴 ...
오버로딩은 한계(MAX)가 있을때 사용한다!! 메소드의 개수가 10개 이상일 때 x
리버를 하나 추가 했다고 생각하자.
질럿 > 리버 , 리버 > 리버 , 드라군 > 리버, 리버 > 드라군 , 리버 > 질럿 이렇게
아주 많은 경우의 수가 나오고, 오버로딩으로 구현하면 감당이 되지 않는다!
너무 비효율적 > 오버로딩의 한계라고 함
오버라이딩으로 생성 시 (깔끔!!) ★
package ex06.example4;
public class StarApp {
//객체를 매개변수로 받음
public static void gameStart(Zealot u1, Dragoon u2) {
u1.attack();
u2.attack();
}
public static void main(String[] args) {
Zealot z1 = new Zealot("z1");
Dragoon d1 = new Dragoon("d1");
River r1 = new River("r1");
Dark dark1 = new Dark("dark1");
}
}
각 유닛별 클래스에 Protoss를 상속 받도록 하면 아래와 같이 사용할 수 있다!

gameStart 매개변수 타입도 Protoss, 객체의 타입도 Protoss !! 이런 코드는 재사용성이 용이하고, 유닛이 추가되더라도 객체만 하나 더 생성하면 되기 때문에 관리하기도 쉽다!
<attack이 에러나는 이유>

Protoss 클래스에 attack 이라는 메소드가 없어서. 부모 클래스의 메소드는 무효화 시키기 때문에 아무 것도 적지 않는다.

* u1이 가리키는 건 Protoss 클래스. Protoss의 attack 메소드를 실행하려고 보니 > 자식 클래스들이 attack을 들고 있네? > 무효화! > 자식이 들고 있는 attack 메소드 실행!
z1, d1, r1, dark1 모두 Protoss를 가리킨다. 프로토스는 통로 역할.
<유닛 추가>
이후, 다른 유닛을 하나 더 만들더라도, 걔도 프로토스 타입이기 때문에

이런 것만 하나 더 만들어주면 끝!
오버라이딩으로 완성 코드
<Protoss 클래스>
package ex06.example4;
public class Protoss {
public void attack() {
}
}
<Zealot 클래스>
package ex06.example4;
public class Zealot extends Protoss {
String name;
public Zealot(String name) {
this.name = name;
}
public void attack() {
System.out.println("질럿이 공격합니다 : " + name);
}
}
<Dark 클래스>
package ex06.example4;
public class Dark extends Protoss {
String name;
public Dark(String name) {
this.name = name;
}
public void attack() {
System.out.println("다크템플러가 공격합니다 : " + name);
}
}
<Dragoon 클래스>
package ex06.example4;
public class Dragoon extends Protoss {
String name;
public Dragoon(String name) {
this.name = name;
}
public void attack() {
System.out.println("드라군이 공격합니다 : " + name);
}
}
<River 클래스>
package ex06.example4;
public class River extends Protoss {
String name;
public River(String name) {
this.name = name;
}
public void attack() {
System.out.println("리버가 공격합니다 : " + name);
}
}
<StarApp 클래스>
package ex06.example4;
public class StarApp {
//객체를 매개변수로 받음
public static void gameStart(Protoss u1, Protoss u2) {
u1.attack();
u2.attack();
}
public static void main(String[] args) {
Protoss z1 = new Zealot("z1"); //Zealot, Protoss
Protoss d1 = new Dragoon("d1"); //Dragoon, Protoss
Protoss r1 = new River("r1"); //River, Protoss
Protoss dark1 = new Dark("dark1"); //Dark, Protoss
gameStart(z1, d1);
gameStart(dark1, d1);
}
}

‘추상화’로 만든 것.
오브젝트를 추상화해서 만든다. (상속해서 만든다.)
모두가 부모를 바라보게 만들면 수정할 게 없어서 프로그램 유지·보수에 엄청 편하다.
Share article