추상클래스란 형식을 일정하게 만들기 위해 존재하는 클래스다.
추상클래스에는 추상 메서드를 만들 수 있는데
추상메서드란, 메서드의 body를 구현하지 않고 반환형, 매개변수, 메서드의 이름만 남겨놓는 것을 말한다.
abstract class Test3 { // 추상클래스
void function1() {
System.out.println("내용");
} // 추상클래스도 일반메서드를 포함할 수 있다
abstract void function2(); // 추상메서드
}
추상클래스 Test3과 추상메서드인 function2는 앞에 abstract를 붙여준다.
function2를 보면 메서드의 body부분은 구현되지않고 바로 세미콜론(;)으로 마무리된 것을 알 수 있다.
이러한 특징을 가지고 있는 추상클래스는 객체화할 수 없다.
이 추상클래스는 다른 클래스가 상속받아서 사용하게 되는데, 상속받는 서브클래스에서 구현되지않은 추상메서드를 오버라이딩 하여 구현해준다.
- 추상 클래스 : 구체적인 내용이 없어 객체화(instantiate)할 수 없는 클래스, 추상 메서드를 포함한다
- 추상 메서드 : 함수의 형태는 지정되어 있으나, 내용은 없어서 호출할 수 없는 함수
추상메서드를 상속받는 Sub클래스
class Sub extends Test3 {
@Override
void function2() {
System.out.println("상속받아서 오버라이딩으로 구현한 내용");
추상클래스는 생성자를 직접 호출하여 객체를 생성할 수 없다.
하지만, 별도의 서브클래스를 작성하지 않고 즉석에서 서브클래스를 만들고 객체를 생성할 수 있다!
즉석에서 만들어지기 때문에 클래스에 부여되는 이름은 별도로 없다
이런 형식을 익명클래스 (Anonymous Inner Type)라고 한다
abstract class Playable {
String name;
public Playable(String name) { // 추상클래스 생성자
this.name = name;
}
public abstract void attack();
}
public class Ex05 {
public static void main(String[] args) {
Playable ob = new Playable("마리오") { // Playable을 상속받는 이름없는 서브 클래스
@Override
public void attack() {
System.out.printf("%s가 적을 밟아서 공격합니다\n", name);
} // 즉석에서 메서드 오버라이딩하여 사용
};
ob.attack();
}// end of main
}// end of class
맨 위의 Playable 클래스는 attack 추상메서드를 지닌 추상클래스이다.
원래라면 생성자를 직접 호출하여 객체생성이 불가하지만
그자리에서 즉석으로 중괄호{ }를 통해 내부에 서브 클래스를 익명으로 구현하여 추상메서드를 오버라이딩 하였다.
이렇게 만들어진 익명클래스의 객체 ob는 attack메서드를 호출하였을 때 잘 불러와진다!
출력 :
마리오가 적을 밟아서 공격합니다