본문 바로가기
JAVA

추상 클래스

by 융디's 2024. 4. 25.
728x90
추상 클래스

추상 클래스

@2024.04.09

추상 클래스

💡
추상 클래스 하나 이상의 추상 메서드를 포함하는 클래스로 확장만을 위한 용도을 가진다.

추상 메서선언만 있고 본문이 없는 메서드로 즉, 구현이 없는 메서드.


@기본구조

접근제한자 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

'JAVA' 카테고리의 다른 글

Final  (0) 2024.04.25
인터페이스  (0) 2024.04.25
불변 클래스  (0) 2024.04.22
메서드 오버라이딩  (0) 2024.03.31
상속  (0) 2024.03.31