Java/기본

[Java] 추상 클래스

댕주 2024. 10. 27. 15:57

추상클래스

추상 클래스는 일반 클래스와 비슷하지만 인스턴스를 직접 생성할 수 없고, 추상 메서드를 포함할 수 있는 특별한 클래스이다.

주로 상속을 통해 공통기능을 제공하면서도, 일부 메서드는 구체적인 구현을 자식 클래스에 맡기기 위해 사용 된다.

특징

1. 직접 인스턴스화 할 수 없다.

- new Animal() 처럼 바로 객체를 생성할 수 없다.

2. 추상 메서드를 가질 수 있다.

- 추상 메서드는 메서드의 선언만 있고 구현이 없다. 자식 클래스에서 반드시 구현해야 함

3. 상속을 통해 공통 기능을 제공한다.

 

예를 들어 보자.

파스타의 종류는 굉장히 다양하다. Pasta 라는 추상 클래스가 있을 때, 각 파스타마다 다른 레시피를 안내하도록 자식 클래스에서 구현할 수 있다

// 추상 클래스
abstract class Pasta {
	// 추상 메서드 - 구현 없음
	abstract void makePasta();
    
    // 일반 메서드 - 모든 파스타에는 면을 끓이는 과정이 필요하다고 가정
    void boil() {
    	// 파스타면을 끓인다
    }
}

class Cream extends Pasta {
	@Override
    void makePasta() {
    	// 크림 파스타의 레시피
    }
}

class Tomato extends Pasta {
	@Override
    void makePasta() {
    	// 토마토 파스타의 레시피
    }
}

public class Main {
	public static void main(String[] args) {
    	// Pasta pasta = new Pasta(); 의 경우는 추상 클래스는 인스턴스화가 불가하므로 오류 발생
        Pasta pasta = new Cream();
        Pasta pasta = new Tomato();
        
        cream.makePasta();
        tomato.makePasta();
        tomato.boil();
    }
}

여기서 Pasta 클래스는 추상 클래스로, makePasta() 라는 추상 메서드를 가지고 있다. Cream 과 Tomato 클래스는 Pasta 를 상속받아 각자의 방식으로 makePasta()를 구현한다. boil() 메서드는 일반 메서드로 모든 파스타가 공유하는 기능을 제공한다.

 

언제 추상 클래스를 사용할까?

- 공통 기능은 미리 정의해두고, 특정 기능만 자식 클래스에서 다르게 구현하고 싶을 때

- 객체를 직접 만들 필요는 없지만, 상속받아 사용할 공통의 구조가 필요할 때

 

추상 클래스는 클래스의 템플릿 같은 역할을 한다고 생각하면 쉽다