[Java] 추상클래스
자바 프로그래밍에서 추상클래스를 배웠을 때, 왜 추상클래스를 사용하는가에 대해서 개인적으로 정리해보았다. 추상클래스는 배울 때 상속과 맞물려서 설명을 하는데, 부모클래스에서 추상메서드를 사용하여 추상클래스로 만든 이후, 자식클래스에서 부모클래스에서 선언한 추상메서드를 구현하는 식이다.
어떤 경우에 이처럼 사용하는가에 대해서 쉽게 정리하고자 한다.
만약 우리가 급여출력프로그램을 만든다고 가정해보자. 회사에는 다양한 직종의 사람들이 일하고 있다.
* 다음과 같이 구현한다고 생각해보자
부모클래스 | 자식클래스 |
Employees | Accountant, Programmer, Salesman |
자식클래스는 부모클래스와 is a 관계가 성립하므로 상속관계임을 알 수 있다.
- Accountant is a Employee
- Programmer is a Employee
- Salesman is a Employee
모든 Employee 들은 나이, 이름, 급여정보를 가지고 있으며, 해당 Employee 에게 급여상세정보를 출력하는 메서드를 가지고 있다고 생각해보자
# 올바르지 않은 사용법
class Employees {
private int age;
private String name;
public void calcSalary(){
System.out.println("Employee 급여는 급여평균의 1.2 배가 최대이다.");
}
public void calcBonus(){
System.out.println("Employee 보너스는 급여평균의 1.5 배가 최대이다.")
}
}
이런식으로 부모클래스를 만들경우 모든 자식클래스들은 같은 메서드를 사용하게 된다. 물론 자식클래스에서 calcSalary(), calcBonus() 등을 오버라이딩 한다면 되겠지만, 부모클래스에서의 메서드는 무시되어버리기 때문에 부모클래스에서의 메서드는 쓰지 않는 비효율이 발생한다.
한 부모클래스의 자식클래스에서 모두 사용하지만, 같은내용을 가지고 있는 메서드가 아니라 각 자식클래스에 맞게 메서드를 구현하기 위해 추상메서드, 추상클래스를 사용한다고 보면 될 거 같다.
단, 추상메서드를 사용하는 클래스는 무조건 추상클래스가 된다.
자식클래스는 부모클래스의 추상메서드를 받으면 무조건 추상메서드를 구현해야한다
# 객체지향적인 사용법
abstract class Employees { // 추상메서드가 하나라도 있으면 추상클래스가 됨
private int age;
private String name;
public abstract void calcSalary(); // 각 자식클래스에서 그에 맞게 구현
public abstract void calcBonus(); // 각 자식클래스에서 그에 맞게 구현
}
class Accountant extends Employees {
public void calcSalary() {
System.out.println("회계사무원의 급여는 회사급여평균의 1.0 ~ 1.2 배 사이");
};
public void calcBonus() {
System.out.println("회계사무원의 보너스는 회사급여평균의 0.2 ~ 0.5 배 사이");
};
}
class Programmer extends Employees {
public void calcSalary() {
System.out.println("프로그래머의 급여는 회사급여평균의 1.2 ~ 1.5 배 사이");
};
public void calcBonus() {
System.out.println("회계사무원의 보너스는 회사급여평균의 0.5 ~ 1 배 사이");
};
}
class Salesman extends Employees {
public void calcSalary() {
System.out.println("영업사원의 급여는 회사급여평균의 0.8 ~ 1.9 배 사이");
};
public void calcBonus() {
System.out.println("회계사무원의 보너스는 회사급여평균의 0.1 ~ 0.3 배 사이");
};
}
추상메서드는 객체지향프로그래밍에 맞는 기능으로써 재사용성이 뛰어나 잘 활용하는 것이 좋다.