좀전에 말했던 게임 개발을 한다고 가정해보자. 육군,공군,해군 캐릭터들이 일시에 공격하는 기능을 구현중인데, 서로 객체가 다르기 때문에 호출을 육군.공격, 공군.공격, 해군.공격 이렇게 다 따로따로 호출을 해야한다. 근데 이러다 또 공격 순서가 바뀔땐 메서드 호출순서를 모든 경우의 수에 따라 if문으로 마련해야할거같다.
똑똑한 프로그래머들은 노가다를 싫어한다. 하나하나 다 입력하는거, 어디서 많이 본거같은데. 데이터 값이 너무 많을때 우리가 쓰던게 있었던거 같은데. 아, 배열. 그리고 배열은 왜 쓴다? 반복문을 잘 돌리기 위해 쓰는거다. 그걸 이제 객체로 해보자는게 요지다.
이 부분을 잘해야 버그를 안만든다. 열심히 배우자.
Parent parent = new Child();
ChildClass child = (ChildClass) parent;
public class Unit {
private String name;
// 생성자 정의
public Unit(String name) {
super();
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
// 재정의할 메서드
public void attack() {
System.out.println(this.name + " >> 공격준비");
}
}
public class Army extends Unit {
public Army(String name) {
super(name);
}
@Override
public void attack() {
super.attack();
System.out.println(super.getName() + " >> 지상공격 실행함");
}
public void tank() {
System.out.println(super.getName() + " >> 탱크공격");
}
}
public class Navy extends Unit {
public Navy(String name) {
super(name);
}
@Override
public void attack() {
super.attack();
System.out.println(this.getName() + " >> 어뢰 발사!!");
System.out.println(this.getName() + " >> 지상 상륙");
}
public void nucleus() {
System.out.println(this.getName() + " >> 핵미사일");
}
}
public class AirForce extends Unit {
public AirForce(String name) {
super(name);
}
@Override
public void attack() {
super.attack();
System.out.println(this.getName() + " >> 이륙");
System.out.println(this.getName() + " >> 공중공격 실행함");
}
public void bombing() {
System.out.println(this.getName() + " >> 폭격");
}
}
public class Main01 {
public static void main(String[] args) {
// 각각의 객체를 생성하고 고유의 기능 호출하기
// Unit 클래스를 상속받은 후, 각각의 클래스에 추가적으로 구현한
// 확장 기능을 사용한다.
AirForce af = new AirForce("공군");
Navy nv = new Navy("해군");
Army am = new Army("육군");
// 각각의 객체는 자신들의 고유 기능을 사용할 수 있음
af.bombing();
nv.nucleus();
am.tank();
System.out.println("----------------");
// 모든 객체는 자신의 상위 형태로 암묵적 형변환 가능
Unit temp1 = af;
Unit temp2 = nv;
Unit temp3 = am;
// 형변환이 되더라도 상속받거나 재정의한(Override)
// 자신들의 기본 특성들은 그대로 유지함
temp1.attack();
temp2.attack();
temp3.attack();
System.out.println("----------------");
// 상위 클래스 형태로 형변환이 되면, 자신들의 독립 기능은 사용하지 못함
// temp1.bombing();
// temp2.nucleus();
// temp3.tank();
// 다시 원래의 기능을 되돌리기 위해서는
// 하위 클래스 형태로 명시적 형변환이 필요함
AirForce re1 = (AirForce) temp1;
Navy re2 = (Navy) temp2;
Army re3 = (Army) temp3;
re1.bombing();
re2.nucleus();
re3.tank();
}
}
스타크래프트를 하다보면 드래그를 하면 여러 캐릭터를 한번에 선택할 수있고, 일괄적으로 공격하게 할 수 있다. 또한 고유 스킬들도 사용하게 할 수있다. 객체로는 그렇게 안될까? 혼재된 데이터를 한번에 묶을 수 있는 방법을 우린 이미 배웠다. '배열'이다.
public class Main02 {
public static void main(String[] args) {
/* 부모 클래스에 객체 배열을 생성하고,
* 배열의 요소에 자식 클래스 객체를 할당하면,
* 자동으로 암묵적 형변환이 이루어져
* 순서나 종류에 상관없이 배열에 저장할 수 있다.
*/
// 부대 지정
Unit[] units = new Unit[5];
units[0] = new AirForce("공군1호");
units[1] = new AirForce("공군2호");
units[2] = new Navy("해군1호");
units[3] = new Army("육군1호");
units[4] = new Army("육군2호");
// 부대 일괄 공격
for (int i = 0; i < units.length; i++) {
units[i].attack();
if (units[i] instanceof Army) {
Army a = (Army) units[i];
a.tank();
} else if (units[i] instanceof Navy) {
Navy n = (Navy) units[i];
n.nucleus();
} else {
AirForce f = (AirForce) units[i];
f.bombing();
}
}
}
}
이 포스트는 itpaper.co.kr에서 제공되는 강의자료를 바탕으로 작성되었습니다.