추상클래스는 추상메소드를 선언할 수 있는 클래스를 의미한다. 또한 추상클래스는 클래스와는 다르게 상속받는 클래스 없이 그 자체로 인스턴스를 생성할 수 없다.
추상메소드는 설계만 되어있으며 수행되는 코드에 대해서는 작성이 안된 메소드이다. 미완성으로 남겨두는 이유는 상속받는 클래스 마다 반드시 동작이 달라지는 경우에 상속받는 클래스 작성자가 반드시 작성하도록하기 위함이다.
추상 메소드의 형식은 다음과 같다.
abstract 리턴타입 메소드이름();
abstract class Bird{
private int x,y,z;
void fly(int x, int y, int z){
printlocation();
System.out.println("이동합니다.");
this.x = x;
this.y =y;
if (flyable(z)){
this.z = z;
}else{
System.out.println("그 높이로는 날 수 없습니다.");
}
printlocation();
}
abstract boolean flyable(int z);
public void printlocation(){
System.out.println("현재위치("+x+","+y+","+z+")");
}
}
class pigeon extends Bird{
boolean flyable(int z){
return z < 10000;
}
}
class Peacock extends Bird {
@Override
boolean flyable(int z) {
return false;
}
}
public class Main {
public static void main(String[] args) {
Bird pigeon = new pigeon();
Bird peacock = new Peacock();
System.out.println("-- 비둘기 --");
pigeon.fly(1, 1, 3);
System.out.println("-- 공작새 --");
peacock.fly(1, 1, 3);
System.out.println("-- 비둘기 --");
pigeon.fly(3, 3, 30000);
}
}
위 코드에서 추상 메소드는 abstract boolean flyable(int z);이다. fly()메소드에서 z값의 출력을 flyable(int z)에 따라 다르게 해놓고 Bird를 상속받는 자식 클래스에서 추상메소드 flyable()의 수행을 지정해준다.
위 예제를 보면 공작새 클래스에서는 공작새는 날 수 없기 때문에 z값을 지정해도 false만을 반환하며 x,y로만 이동할수 있게 했고, 비둘기 클래스에서는 z값이 10000이상이 되면 false를 반환하게해 10000이상이 되지 않게 했다.
이처럼 상속받는 클래스 마다 동작이 달라야 하는 경우에 추상 메소드를 활용할 수 있다.