추상 클래스의 상속 관계 - 추상 클래스 관련 동일한 용어 정리, 상속 받는 추상 클래스를 작성, 상속 받는 하위 클래스 작성

CODEDRAGON Development/Java

반응형

   

   

추상 클래스의 상속 관계

  • 추상 클래스들간에도 상속이 가능합니다.
  • 일반 클래스들간의 상속과 유사하지만 추상 클래스들간의 상속에서는 상속 받은 추상 메서드들을 꼭 재정의할 필요는 없습니다.
  • 왜냐하면 그냥 상속만 받아두고 있다가 언제가 일반 클래스와 상속관계가 이루어 질 때, 이때 재정의 하지 못했던 상속 받은 추상 메서드들을 모두 일반 클래스 내에서 재정의하면 되기 때문입니다.

   

   

   

추상 클래스 관련 동일한 용어 정리

Concreate class

extends

Abstract class

일반클래스

구현클래스

서브클래스

구상클래스

구체클래스

extends

추상클래스

모든 메소드를 구현한 클래스

extends

선언만 존재하고 구현되지 않은 메서드를 가진 클래스

   

   

AbsEx1을 상속 받는 추상 클래스를 작성

abstract class AbsEx1{

int a = 2020; //변수

final String str = "abstract test"; //상수

public String getStr(){ //일반 메서드

return str;

}

// 추상 메서드는 몸체(body) 없다.

abstract public int getA();

  

abstract class AbsEx2 extends AbsEx1{

// 부모클래스의 추상 메서드 정의

@Override

public int getA(){

return a;

}

public abstract String getStr();

}

   

   

AbsEx1을 상속 받는 하위 클래스 작성

abstract class AbsEx1 {

int a = 2020; // 변수

final String str = "abstract test"; // 상수

   

public String getStr() { // 일반 메서드

return str;

}

   

// 추상 메서드는 몸체(body) 없다.

abstract public int getA();

}

  

abstract class AbsEx2 extends AbsEx1{

   

public void getStrTwo(){

}

}

  

  • AbsEx2 클래스도 abstract 로 선언되어야 에러 발생 않습니다.
  • 위의 경우AbsEx2 클래스는 AbsEx1 클래스의 abstract 메소드를 상속하고 있습니다.
  • 그런데 getA() 메소드를 오버라이딩 하지 않았으므로, abstract 상태 그대로 포함하고 있는 것이 되기 때문에 결국 AbsEx2 클래스는 하나 이상의 abstract 메소드를 포함하게되는 것이 되어, abstract로 선언되어야 하며, 인스턴스의 생성도 불가능하게 됩니다.

   

public class AbstractEx02 extends AbsEx2 {

// AbsEx2 추상 메서드 정의

@Override

public String getStr() {

return str; // str AbsEx1 멤버

}

   

public static void main(String[] args) {

AbstractEx02 ae = new AbstractEx02();

System.out.println("ae.getA():" + ae.getA());

System.out.println("ae.getStr():" + ae.getStr());

}

}