CH7-33,34 추상클래스의 작성(1)
[자바의 정석 - 기초편] ch7-33,34 추상클래스의작성1
저번시간 추상클래스에 대해 배웠다. 추상클래스는 추상메서드(미완성 메서드)를 포함하는 클래스이다.
게임을 만든다고 가정하면, 마린, 탱크, 드랍쉽은 위치정보, 움직이는 함수, 멈추는 함수등은 모두 공유한다. 이렇게 어떤 클래스들이 공유하는 기능을 뽑아서 추상클래스로 만들기도 한다.
이때 move함수와 stop함수는, 드랍쉽같은경우 공중에서 움직이기때문에 다른 방식으로 구현해줘야한다. 즉 선언부는 공유하지만 바디는 불일치함. 이럴때 일치하는 부분(선언부)만 추출해서 관리하는 추상클래스가 필요하다.
위의 예제에서는 추상클래스로 Unit을 만들어냈다.
위처럼 중복되는 영역을 추상클래스로 추출해서 관리하면… 각 자식 클래스에서 중복되는 코드가 줄어드는 장점도 있다.
그리고 위처럼 추상클래스 이용하면… 다형성 이용한 객체배열이 가능하다는 장점도 있다.
심지어 저렇게 각각의 move를 호출해줄 수 있다!!
group[i]
는 Unit
타입이지만, 다형성 덕분에 그 자식클래스(자식타입의)의 메서드도 다 실행가능함.
또한 해당메서드도 추상메서드에서 가져와서 완성시킨 메서드이기 때문에(move
)조상 타입으로도 해당 메서드를 다룰 수 있음.
아래가 바로 다형성의 장점을 보여주는 예제이다.
public class Ex7_10 {
public static void main(String[] args) {
Unit[] group = { new Marine(), new Tank(), new Dropship()};
for(int i = 0; i <group.length; i++)
{
**group[i].move(100, 200);**
}
}
}
abstract class Unit {
int x, y;
abstract void move(int x, int y);
void stop() {}
}
class Marine extends Unit {
void move (int x, int y) {
System.out.println("마린이 움직입니다."+x+","+y);
}
void stimPack() {}
}
class Tank extends Unit {
void move (int x, int y) {
System.out.println("탱크가 움직입니다."+x+","+y);
}
}
class Dropship extends Unit {
void move (int x, int y) {
System.out.println("드랍쉽이 움직입니다."+x+","+**(y+100)**);
}
}
메인메서드에서 객체 배열의 각각의 move매서드를 통해 동일한 값을 할당해서 실행시켜주고 있다. 이것만 해도 신기한데, 각각의 move가 다 다르게 작동할 수도 있음. 드랍쉽같은 경우 y좌표에 100을 더 더한다.