본문 바로가기

study/java

자바/JAVA 추상 클래스, 추상 메소드, 템플릿 메소드

추상 클래스는 반드시 상속되거나 구현돼야 하는 클래스다. 따라서 추상 클래스의 특성을 물려 받는 실체 클래스가 있다. 클래스를 설계할 때 사용한다.

 

반대로 생각하면 추상 클래스는 실체 클래스들의 규격과 같다. 따라서 실체 클래스들은 공통된 특성을 물려 받고, 자신만의 특정한 특성도 설정할 수 있다.(인터페이스의 특징)

 

그래서 추상 클래스는 하위 클래스의 공통된 특성(필드, 메소드)을 추출하여 선언한 클래스라고도 할 수 있다.

 

추상 클래스는 클래스가 갖는 모든 속성과 기능을 가진다. 추상 메소드의 구현 및 상속의 기능을 갖는다. 또한 추상 클래스도 클래스이므로 단일 상속만 지원한다.

 

클래스 생성 시 abstract를 붙여 선언한다. 이를 통해 상속(구현)을 강제할 수 있다.

public abstract class parent(){}

 

추상 클래스만으로는 객체를 생성할 수 없다. 그러나 실체 클래스가 상속을 받으므로 실체 클래스의 객체가 생성될 때, 추상 클래스의 객체도 생성된다.(상속관계니까)

Parent parent = new Parent();//컴파일 에러 발생

Parent parent = new Child();

 

추상 클래스도 멤버 변수, 일반 메소드, 일반 생성자를 가질 수 있다.

 

 

추상 클래스는 추상 메소드를 가질 수 있다. 추상 메소드는 메소드 선언부만 있는 메소드다.(실행문이 없다)

public abstract void method();

 

추상 메소드는 반드시 실체 클래스에 의해 재정의 되어야 한다. 재정의되지 않은 추상 메소드를 갖고 있다면 그 클래스는 추상 클래스여야 한다.

 

추상 메소드는 메소드가 존재해야 하지만, 실체 클래스마다 기능이 다를 때, 구현 방법이 다를 때 사용한다. 따라서 추상 메소드를 구현한 클래스에 따라 같은 메소드 코드에서 다양한 결과가 나올 수 있다.

 

 

추상 클래스는 클래스를 설계할 때 사용한다. 그래서 보통 템플릿 메소드 패턴과 같이 사용한다.

 

템플릿 메소드 : 추상 메소드나 구현된 메소드를 활용하여 전체의 흐름(시나리오)를 정의한 메소드. 전체의 흐름은 바뀌면 안되므로 final 메소드로 선언한다.

 

템플릿 메소드 패턴: 디자인 패턴의 일종이고, 프레임워크에서 많이 사용되는 설계 패턴이다. -> 사용자가 추상 클래스를 구현하면 프레임워크는 템플릿 메소드를 통해 작동시킨다.

 

템플릿 메소드는 추상 클래스로 선언된 상위 클래스에서 추상 메소드를 이용하여 전체 구현 흐름을 정의하고 구체적인 각 메소드 구현은 하위 클래스에 위임한다.

 

public abstract class Car{ // 추상 클래스
	
    public abstract void run(); // 추상 메소드
    public abstract void stop(); // 추상 메소드
    
    final public void drive(){ // 템플릿 메소드
    	System.out.println("자동차 드라이브 시작");
        run();
        stop();
        System.out.println("자동 드라이브 끝");
    }
}

추상 클래스 Car를 구현한 실체 클래스가 추상 메소드를 구현하면 그 메소드를 drive() 메소드(템플릿)에서 사용한다.