Java Abstract Class
추상클래스
추상 클래스(abstract class)란 하나 이상의 추상 메소드(abstract method)를 포함하는 클래스이다.
- 추상 메소드는 선언만 있고 본체는 없는 함수이며 선언부에 “abstract” 라는 키워드를 붙인다.
- 추상 메소드가 포함되었다면 클래스도 추상 클래스이므로 클래스명 앞에도 “abstract“키워드를 붙여야 한다.
인터페이스 포스트에서 사용한 Predator 클래스를 추상클래스로 변경해보자.
public abstract class Predator extends Animal {
public abstract String getFood();
}
바뀐점은 이러하다.
- public interface Predator -> public abstract class Predator extends Animal
- public String getFood() -> public abstract String getFood()
인터페이스 메소드를 사용하던 파일들을 추상클래스 메소드를 사용하는 파일로 바꿔줘야 한다.
// Tiger.java
public class Tiger extends Predator implements Barkable {
public String getFood() {
return "apple";
}
public void bark() {
System.out.println("어흥");
}
}
// Lion.java
public class Lion extends Predator implements Barkable {
public String getFood() {
return "banana";
}
public void bark() {
System.out.println("으르렁");
}
}
바뀐점은 이러하다.
// 추상클래스 변경전(인터페이스 상태)
public class Tiger extends Animal implements Predator, Barkable{...}
public class Lion extends Animal implements Predator, Barkable{...}
// 추상클래스 변경후
public class Tiger extends Predator implements Barkable {...}
public class Lion extends Predator implements Barkable {...}
추상클래스는 인터페이스와 마찬가지로 추상클래스를 상속하는 클래스에서 반드시 메소드를 구현해야 한다.
추상클래스는 두 가지를 기억해야 한다.
- 추상클래스 파일(.java)에 추상메소드 선언만 한 경우 추상클래스를 상속하는 클래스에 반드시 메소드를 구현해야 한다.
- 추상클래스 파일(.java)에 추상메소드를 선언과 동시에 내부(몸통)도 만들 수 있다.
만약 2번으로 추상클래스를 만든 경우 상속받는 객체에서 메소드를 사용할 수 있다.
예시를 한번 만들어보자!
// isPredator.java
public abstract class isPredator extends Animal {
public abstract String getFood();
public boolean isPredator() {
System.out.println("isPredator On!");
return true;
}
}
// Tiger.java
public class Tiger extends isPredator implements Barkable {
public String getFood() {
return "apple";
}
public void bark() {
System.out.println("어흥");
}
}
// Bouncer.java
public class Bouncer {
public void barkAnimal(Barkable animal) {
animal.bark();
}
public static void main(String[] args) {
Tiger tiger = new Tiger();
Tiger.isPredator(); // isPredator On!
}
}
정상적으로 출력되는 것을 볼 수 있다.