만약 덧셈기능을 필요로 하는 클래스 2개가 있다. 하나는 정수의 덧셈을, 하나는 실수의 덧셈 기능을 필요로 한다. 각각의 클래스에서 정수 덧셈을 하는 클래스를 만들고, 실수 덧셈을 하는 클래스를 각각 만들어도 된다. 하지만 덧셈이라는 공통된 성질을 지녔기 때문에 super-class에 추상메소드 형태로 덧셈 메소드를 추상 메소드로 선언만 해놓고, 상속 받은 아래 2개의 서브 클래스에서 각각을 오버라이딩(구체화) 시켜주어 사용해도 된다. 이와 같이 추상메소드를 사용하면 구체적인 내용은 조금 다를지라도 비슷한 기능을 필요로 하는 또다른 클래스가 생긴다면, 해당 클래스를 상속받아 오버라이딩만 하면 되는 식으로 코드의 확장이 가능하다.
추상 메소드는 abstract 키워드가 반드시 앞에 붙게된다.
abstract public void disp();
추상메소드도 메소드이지만 메소드명() { } 의 형태가 아닌, 메소드명(); 의 형태를 지니게 된다.
추상 메소드를 지닌 클래스는 반드시 추상 클래스가 되어, abstract 키워드가 앞에 붙게 된다.
abstract class ClassA { }
추상 클래스(super-class)를 상속받은 sub-class들은 추상 클래스(super-class)가 지닌 추상 메소드를 반드시 오버라이딩(overriding)해야한다. 추상 메소드를 사용하지 않더라도, 추상 클래스를 상속받았다면 반드시 오버라이딩 해야한다.
추상 메소드를 오버라이딩하여 사용하고 싶은 sub-class들은 extends 키워드를 사용하여, super-class(추상 클래스)를 상속받으면 된다.
package study;
abstract class ClassA { //추상 메소드를 지닌 추상 클래스
//추상 메소드를 지닌 클래스는 abstract 키워드를 반드시 붙여주어야 한다.
//추상 메소드를 지닌 클래스는 문법적으로 반드시 추상 클래스가 된다.
// ⭐ 추상메소드
abstract public void displayA(); //abstract 키워드 필요.
}
//추상 클래스를 상속받은 클래스(오버라이딩 반드시 필요)
class ClassB extends ClassA{
//⭐오버라이딩 메소드 앞 줄에는 @Override 반드시 붙여주기.
//안 붙여도 문법적으로 아무 문제가 없지만, 코드를 쉽게 읽기 위해서 꼭 필요하다.
@Override
public void displayA() {
System.out.println("ClassB");
}
}
//추상 클래스를 상속받은 또 다른 클래스(오버라이딩 반드시 필요)
class ClassC extends ClassA{
@Override
public void displayA() {
System.out.println("ClassC");
}
}
//public class
public class StudyJava {
ClassB cb = new ClassB();
ClassC cc = new ClassC();
public static void main(String[] args) {
StudyJava sj = new StudyJava();
sj.cb.displayA();
sj.cc.displayA();
}
}