스타크래프트로 보는 오버라이딩
질럿, 드라군 유닛 생성
오버로딩으로 생성 시 (한계가 없을때 사용 > 비추) 오버로딩의 한계 …
메소드의 매개변수가 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