ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java - 추상 클래스(템플릿 메서드)3
    개발언어/JAVA 2023. 11. 3. 16:25

    추상 클래스와 템플릿 메서드

    '템플릿(template)'이란 용어를 사전에서 찾아보면, 틀이나 견본을 뜻한다. 틀이 있는 메서드라는 의미이다. 템플릿 메서드는 추상 클래스를 사용하여 구현할 수 있다.

     

    package template;
    
    public abstract class Car{
    	public abstract void drive();
        public abstract void stop();
        
        public void startCar(){
        	System.out.println("시동을 켭니다.");
        }
        
         public void turnOff(){
        	System.out.println("시동을 끕니다.");
        }
        
        //템플릿 메서드
        final public void run(){
        	startCar();
            drive();
            stop();
            turnOff();
        }
    }

     

    Car 클래스를 생성했다. 이 클래스는 drive()와 stop() 추상 메서드와 3개의 구현된 메서드 startCar(),turnOff(),run()을 가지고 있습니다. 자동차 시동을 켜고 끄는 방법은 어느 차나 동일하다.

     

    템플릿 메서드인 run()메서드를 살펴보자 이 메서드는 자동차가 달리는 방법을 순서대로 구현해 두었다. 1)시동을 켜고, 2)달리고, 3)브레이크로 멈춘 후 4)시동을 끈다. 만약 Car 클래스를 상속받으면 어떤 자동차든 모두 이 순서대로 동일한 방식으로 달리는 것이다.

     

    추상 클래스 Car를 상속받은 2개의 클래스

    AICar 자율 주행이 가능하다. 사람이 시동을 켠 후에는 자동차가 알아서 주행을 한다.
    ManualCar 보통의 자동차. 사람이 시동을 켜고 핸들도 조작한다.

     

    일단 추상 클래스 Car를 상속 받은 2개의 클래스는 구현되지 않은 추상 메서드를 마저 구현해야 한다. 각각 클래스의 세부적인 특징은 위 표와 같다. 공통으로 사용하는 메서드는 추상 클래스에 구현하여 상속받아 사용한다.

     

    AICar.java

    package template;
    
    public class AICar extends Car{
    	
        @Override
        public void drive(){
        	System.out.println("자율 주행한다.");
            System.out.println("자동차가 알아서 방향을 전환한다.");
        }
        
        @Override
        public void stop(){
        	System.out.println("스스로 멈춘다.")
        }
        
    }

     

    ManualCar.java

    package template;
    
    public class ManualCar extends Car{
    	
        @Override
        public void drive(){
        	System.out.println("사람이 운전한다.");
            System.out.println("사람이 핸들을 조작한다.");
        }
        
        @Override
        public void stop(){
        	System.out.println("브레이크로 정지한다.");
        }
        
    }

     

     

    템플릿 메서드의 역할

    package template;
    
    public class CarTest{
    	public static void main(String[] args){
        // 자율 주행하는 자동차
        Car myCar = new AICar();
        myCar.run();
        //시동을 켭니다.
        //자율 주행을 합니다.
        //자동차가 스스로 방향을 전환한다.
        //스스로 멈춥니다.
        //시동을 끕니다.
        
        
        //사람이 운전하는 자동차
        Car hisCar = new ManualCar();
        hisCar.run();
        //시동을 켭니다.
        //자율 주행을 합니다.
        //사람이 운전을 한다.
        //브레이크로 정지한다.
        //시동을 끈다.
        
        }
    }

     

    CarTest에서 두 개의 인스턴스(myCar,hisCar)를 생성했다. 그리고 run()을 호출했다. run()은 Car클래스에서 차가 어떤 수서로 달려야 하는지를 구현해 놓은 이미 구현된 메서드 이다. 즉 Car 클래스를 상속 받은 클래스라면 작동 순서는 어느 클래스의 차나 동일하다. 이렇듯 템플릿 메서드역할은 메서드 실행 순서와 시나리오를 정의하는 것이다. 템플릿 메서드에서 호출하는 메서드에 추상메서드가 포함 되어 있다면 차종에 따라 순서는 같지만 구체적인 구현 내용은 바뀔 수 있는 것이다.

     

    템플릿 메서드는 실행 순서, 즉 시나리오를 정의한 메서드이르로 바뀔 수 없다. 즉 상위 클래스를 상속받은 하위 클래스에서 템플릿 메서드를 재정의 할 수 없다. 그래서 템플릿 메서드는 final 예약어를 사용해 선언한다. 메서드 앞에 final을 사용하면 사용하면 상속받은 하위 클래스가 메서드를 재정의 할 수 없다. 템플릿 메서드는 로직 흐름이 이미 정해져 있는 프레임워크에서 많이 사용하는 기본 구현 방법이다.

     

    [출저 - Do it! 자바 프로그래밍 입문 , 박은종]

    http://www.easyspub.co.kr/20_Menu/BookView/A001/267/PUB

     

    http://www.easyspub.co.kr/20_Menu/BookView/A001/267/PUB

     

    www.easyspub.co.kr

     

    댓글

Designed by Tistory.