[Java-OOP8] 추상클래스

이용준·2022년 11월 1일
0

Java

목록 보기
20/29

추상클래스(Abstract Class)는 인터페이스 역할과 클래스의 기능을 가지고 있는 자바의 돌연변이 같은 클래스이다. 혹자는 추상클래스는 인터페이스로 대체하는 것이 좋은 디자인이라고도 한다.

추상클래스에 대해 알아보기위해 Predator 인터페이스를 추상클래스로 변경해보자.

abstract class Predator extends Animal{
  abstract String getFood(); // abstract 표기
  
  void printFood(){  // default 제거
    System.out.println("My food is %s\n",getFood());
  }
  
  static int LEG_COUNT = 4; // 추상 클래스의 상수는 static 선언이 필요하다.
  static int speed(){
    return LEG_COUNT*30;
  }
}
(...)
  • 추상 클래스를 만들기 위해서는 class 앞에 abstract표기 필요

  • 인터페이스의 메소드에도 abstract표기

  • abstract 메소드는 인터페이스 메소드와 마찬기지로 내용이 없다

    • abstract 클래스를 상속하는 클래스에서 해당 abstract 메소드 구현
  • 상수는 명시적으로 static표기

    추상 클래스는 일반 클래스와 달리 단독으로 객체 생성 불가하며 반드시 추상 클래스를 상속한 실제 클래스를 통해서만 객체 생성 가능.

    Predator 인터페이스를 추상클래스로 변경하면 BarkablePredator 인터페이스는 사용이 불가하므로 삭제하고, Tiger/Lion 클래스도 Predator 추상클래스를 상속하도록 변경해야 한다.

    interface Barkable{
      (...)
    }
    [삭제]interface BarkablePredator extends Predators, Barkable{
    }
    
    class Tiger extends Predator implements Barkable{ //변경
      (...)
    }  
    class Lion extends Predator implements Barkable{//변경
      (...)
    }
    (...)

    Predaotr 추상클래스에 선언된 getFood 메소드는 Tiger,Lion클래스에 이미 구현되어 있으므로 추가할 필요 없다. 추상클래스에 abstract로 선언된 메소드는 인터페이스와 마찬가지로 반드시 구현해야 하는 메소드이다.

추상클래스에는 abstract 메소드 외 실제 메소드 사용 가능하다.

  • 실제 메소드 추가시
    • Tiger, Lion 등으로 만들어진 객체에서 해당 메소드 사용 가능
    • 기존 인터페이스에서 default 메소드로 사용한 printFood가 추상 클래스의 실제 메서드에 해당
profile
뚝딱뚝딱

0개의 댓글