여러 클래스들의 공통된 부분을 뽑아서 약식으로 뼈대만 정의해 놓은 부모 클래스
추상 클래스로 부터 상속을 받고, 상속받은 메소드를 필요에 따라 더 자세히 정의한 후 (오버라이딩) 객체를 생성해서 사용하면 된다.
추상 클래스에서 선언만 되어있고 정의가 되어있지 않은 메소드들이 존재할 수 있으므로, 필요에 따라 더 자세히 상속받은 메소드를 재정의 하라는것이다.
멤버변수를 가진다.
추상 클래스를 상속하기 위해서는 extends 를 이용한다.
abstract 메소드를 가지며, 상속한 클래스에서 다시 제대로 구현해줘야 한다.
일반 메소드도 가질 수 있다.
일반 클래스와 마찬가지로 생성자도 있다.
클래스 상속과 마찬가지로 extends 키워드를 활용해 상속하고 abstract 메소드를 구현한다
추상 메소드 : 추상 클래스 안에 선언만 되어 있고, 정의되지 않은 메소드. abstract 키워드로 추상 메소드임을 명시해준다.
=> 추상 메소드는 클래스에서 메소드 정의시 반드시 오버라이딩 해서 내용을 정의해줘야 한다.
추상 메소드의 외의 메소드들도 필요에 따라 메소드가 정의된 내용을 수정하고 싶다면 오버라이딩 하면 된다.
추상 메소드 선언 형태 : public abstract void 메소드명();
추상 클래스인 AbstractClassEx 를 정의해 놓았다.
그런데 메소드 func() 는 추상 메소드이다. 오버라이딩 해줘야한다.
public abstract class AbstractClassEx{
int num;
String str;
public AbstractClassEx() {
System.out.println("AbstractClassEx 생성자1");
}
public AbstractClassEx(int i, String s){
System.out.println("AbstractClassEx 생성자2");
}
this.num = i;
this.str = s;
public void fun1(){
System.out.println(" == fun1() START == ");
}
// 추상 메소드 - 선언부만 있고 내용이 정의되지 않음
// abstract 키워드를 써서 추상 메소드임을 명시함
public abstract void fun2();
}
우리는 아래처럼 클래스 정의시 fun2( ) 를 다시 오버라이딩 해서 반듯이 구현해야한다.
public class ClassEx extends AbstractClassEx {
public classEx() {
System.out.println("ClassEx 생성자");
}
public ClassEx(int i, String s) {
super(i, s);
}
// 추상 메소드를 오버라이딩
@Override
public void fun2(){
System.out.println("== fun2 START == ");
}
}
main 함수
AbstractClassEx ex = new ClassEx(10, "Java");
ex.fun1();
ex.fun2();
공통점
차이점