선언되어 있으나 구현이 안되어있는 메소드
선언할 때는 [ abstract ] 를 사용한다.
public abstract void Test();
구현할 때는 서브클래스에서 오버라이딩을 해야한다.
추상메소드와 마찬가지로 abstract로 선언이 되어있으나 구현이 안되어있는 클래스이다.
추상메소드를 하나라도 가진 클래스
클래스 앞에 abstract라고 선언해야함
abstract class Person{ // 추상클래스 선언
public Person( ){ }
public void customer( ) { use( ); }
abstract public void use( ); // 추상메소드
}
body( { } )가 없고 앞에 abstract라고 선언한 메소드가 추상메소드이다.
추상메소드가 하나도 없지만 abstract로 선언된 클래스
abstract class Person{ // 추상클래스 선언
String name;
public void load( String name ){
this.name = name;
}
}
추상메소드와 달리 body가 있어도 abstract가 붙으면 추상클래스이다.
abstract 라고 선언한 추상클래스안에서 객체를 생성하려한다면 오류가 발생한다.
오류메세지
Cannot instantiate the type Shape
( Shape 유형을 인스턴스화할 수 없습니다 )
추상클래스도 상속을 할 수 있는데 두가지 방법이 있다.
추상클래스의 단순 상속
말 그대로 추상클래스를 상속받아 추상메소드를 구현하지 않으면 추상클래스가 된다. 상속받은 추상클래스도 abstract로 선언을 해야한다.
추상클래스 구현 상속
서브클래스에서 슈퍼클래스의 추상메소드를 구현하기 때문에 서브클래스는 추상클래스가 아니다.
즉, 오버라이딩 한 것이다.
밑은 추상클래스를 상속받아 만든 서브클래스에서 추상클래스 내에 있던 메소드를 오버라이딩해 구현한 사례이다. 그래서 재정의된 클래스들은 추상클래스가 아니며 인스턴스를 생성할 수 있다.
원래 Shape 클래스
추상화된 Shape 클래스
이후 서브클래스를 재정의 한다. 안하면 오류가 발생하고 재정의를 하지않고 오류도 안내고 싶다면 abstract를 붙이면 된다. 오버라이딩하기 때문에 추상메소드를 구현하지 않으면 컴파일 오류가 발생한다.
설계와 구현을 분리할 수 있다.
슈퍼클래스에서는 개념정의를 하고 각 서브클래스에 다른 구체적인 행위 구현이 필요하다면 목적에 맞게 추상메소드로 선언하면 된다.
계층적 상속관계를 갖는 클래스구조를 만들때 사용한다.
예제 1-7
위 Calculator 클래스를 상속받은 GoodCalc 구현하기
GoodCalc 클래스 구현
main에서 각 메소드들의 매개변수 값들을 받고 오버라이드된 메소드들에거 계산된 리턴값을 출력시킨다.