추상클래스란?
클래스를 설계도에 비유한다면, 추상클래스는 미완성 설계도에 비유할 수 있다.
미완성이라는 것은 멤버의 개수에 관계된 것이 아니라 미완성 메서드(추상 메서드)를 포함하고 있다는 의미다.
추상클래스는 상속을 통해 자손클래스에 의해서만 완성할 수 있다.
추상클래스는 추상메서드를 포함하고 있다는 것을 제외하고는 일반클래스와 다르지 않다.
추상클래스를 상속받은 자손클래스에서는 추상클래스에서 선언된 추상메서드를 모두 구현해야 한다.
만약 하나라도 구현하지 않았을 경우 자손클래스도 동일한 추상클래스로 선언되어야 한다.
abstract class Car { // 추상 클래스
boolean enginePower;
String engineMode;
abstract void engineOnOff();
abstract void engineMode(String engineMode);
}
// 상속받은 추상메서드를 모두 구현하지 않을 경우 추상클래스로 선언
abstract class OldCar extends Car {
void engineOnOff() {
this.enginePower = !this.enginePower;
}
}
// 상속받은 추상메서드를 모두 구현
class NewestCar extends Car {
void engineOnOff() {
this.enginePower = !this.enginePower;
}
void engineMode(String engineMode) {
this.engineMode = !engineMode;
}
}
추상클래스의 작성
여러 클래스에서 공통적으로 사용될 수 있는 클래스를 바로 작성하기도 하고, 기존의 클래스의 공통적인 부분을 뽑아서 추상클래스로 만들어 상속하도록 하는 경우도 있다.
상속이 자손 클래스를 만드는데 조상 클래스를 사용하는 것이라면, 이와 반대로 추상화는 기존의 클래스의 공통 부분을 뽑아내서 조상 클래스를 만드는 것이라고 할 수 있다.
상속계층도를 따라 내려갈수록 클래스는 점점 기능이 추가되어 구체화의 정도가 심해지며, 상속 계층도를 따라 올라갈수록 클래스는 추상화의 정도가 올라간다.
추상화
클래스간의 공통점을 찾아내서 공통의 조상을 만드는 작업
구체화
상속을 통해 클래스를 구형, 확장하는 작업
abstract class Car { // 추상 클래스
private boolean power; // 파워
private String engine; // 엔진
private String driveMode; // 드라이브 모드 - 스포츠 엔진만 스포츠 모드를 사용할 수 있다.
Car(String engine) { // 생성자
this.power = false;
this.engine = engine;
this.driveMode = "normal";
}
void powerOnOff() { // 파워 on, off - 일반 메서드
this.power = !this.power;
}
abstract void driveModeChange(String driveMode); // 드라이브 모드 변경 - 추상 메서드
}
class NormalCar extends Car { // 일반 자동차
NormalCar() {
super("normal");
}
void driveModeChange(String driveMode) {
if (driveMode != "normal") {
System.out.println("일반 자동차는 드라이브 모드를 변경 할 수 없습니다.");
}
}
}
class SportCar extends Car { // 스포츠카
SportCar() {
super("sport");
}
void driveModeChange(String driveMode) {
this.driveMode = driveMode;
System.out.println("success");
}
}
Car nCar = new NormalCar();
nCar.driveModeChange("sport"); // "일반 자동차는 드라이브 모드를 변경 할 수 없습니다."
Car sCar = new SportCar();
sCar.driveModeChange("sport"); // success
abstract로 선언하지 않고 내용없는 빈 메서드만 만들어도 추상클래스와 기능은 같지만,
상속받는 클래스에서는 추상 메서드가 아니기 때문에 완성된 메서드로 파악하고 오버라이딩을 하지 않는 경우가 생길 수 있다.
이를 방지하고 반드시 메서드를 오버라이딩해 구현하도록 강요하기 위해서 abstract를 붙혀 추상메서드로 선언해야 한다.
'Java' 카테고리의 다른 글
내부 클래스(Inner class) (0) | 2021.09.20 |
---|---|
인터페이스(Interface) (0) | 2021.09.20 |
다형성(polymorphism) (0) | 2021.09.16 |
그 외 제어자(otherwise modifier) (0) | 2021.09.16 |
접근 제어자(access modifier) (0) | 2021.09.16 |