728x90
추상 클래스
@2024.04.09
추상 클래스
💡
추상 클래스는 하나 이상의 추상 메서드를 포함하는 클래스로 확장만을 위한 용도을 가진다.
추상 메서드는 선언만 있고 본문이 없는 메서드로 즉, 구현이 없는 메서드다.
@기본구조
접근제한자 abstarct class 클래스명 {
//멤버 변수
//생성자
//메소드
//추상 메소드
}
추상 메서드는 선언만 있고 본문이 없는 메서드로 즉, 구현이 없는 메서드다.
@기본구조
접근제한자 abstarct class 클래스명 {
//멤버 변수
//생성자
//메소드
//추상 메소드
}
- 직접 객체를 생성할 수 없기에 일반 클래스처럼 인스턴스화할 수 없다.
- 추상 클래스를 상속하여 구현해야 하는데, 이때 상속받은 클래스에서는 추상 메서드를 반드시 구현해야 한다.
- 추상 메서드는 추상 클래스에서만 존재 가능
- 추상 클래스에는 일반 메서드도 함께 선언 가능 → 상속 시 구현 필요 X
- 사용 목적
- 일반 클래스들 간의 공통적인 기능을 제공하기 위해 상위 수준의 일반화된 형태
- 하위 클래스에서 반드시 구현되어야 하는 메서드 제공
- 주로 여러 클래스들이 공통점을 가지고 있으나, 부분적으로 그 처리 방식이 다를 경우 사용
- 부모 클래스를 추상 클래스로 정의하여, 자식 클래스들이 각각 해당 메서드를 구현
추상 클래스 상속
- extends 키워드를 사용하여 상속받는다.
- 상속하는 클래스는 반드시 추상 클래스의 추상 메서드를 구현해야 한다.
- 추상 클래스 간의 상속에서는 추상 메서드를 구현하지 않아도 된다.
abstract class Aclass{ public abstract void A(); // 추상 메서드 } abstract class Bclass extends Aclass { // 추상 클래스 상속받은 추상 클래스 // 추상 클래스 간의 상속에서는 추상 메서드 구현 하지않아도 됨 // 메소드에서 {}중괄호는 구현의 의미 public abstract void B(); } public class Cclass extends Bclass{ // B클래스 상속 @override public void A(){}; // 반드시 구현 (A에 있는 추상클래스) @override public void B(){}; // 반드시 구현 (B에 있는 추상클래스) }
템플릿 메서드 패턴
💡
알고리즘의 구조를 메서드에 정의하고, 알고리즘의 일부 단계를 서브 클래스에서 구현하도록 하여, 알고리즘의 일부 변경을 허용하는 디자인 패턴
- 공통의 알고리즘 과정이 있으나, 그 과정 중 일부가 클래스마다 다를 때 유용하게 사용
- 추상 클래스 → 템플릿 메서드 정의 , 자식 클래스 → 메서드 오버라이드로 구체적인 작업
- 구조
- 추상 클래스
- 템플릿 메서드 (알고리즘 단계를 정의) + 하나 이상의 메서드
- 구체 클래스
- 추상 클래스를 상속받아 추상 메서드 구현 ⇒ 알고리즘 일부 단계 구현
- 추상 클래스
- 예시
- 여행 준비하는 과정
// 추상 클래스
abstract class Trip {
// 추상 메소드
protected abstract void buyTicket();
protected abstract void packBag();
protected abstract void goToAirport();
protected abstract void goSightseeing();
// 템플릿 메소드
public final void prepareTrip() {
buyTicket();
packBag();
goToAirport();
if (needHotel()) {
bookHotel();
}
goSightseeing();
}
protected boolean needHotel() {
return false;
}
protected void bookHotel() {
System.out.println("호텔 예약 완료");
}
}
// 추상 클래스를 상속 받은 구체 클래스
class EuropeTrip extends Trip {
// 추상 메서드 구현
@override
protected void buyTicket() {
System.out.println("항공권 구매");
}
@override
protected void packBag() {
System.out.println("짐 싸기");
}
@override
protected void goToAirport() {
System.out.println("공항으로 이동");
}
@override
protected void goSightseeing() {
System.out.println("유럽 관광");
}
//구현해도 되고, 안해도 되는 메서드
@override
protected boolean needHotel() {
return true;
}
}
728x90