본문 바로가기
공부/자바 (Java)

[Java] 추상 클래스, 템플릿 메서드 패턴 -final 예약어

by Lagooni 2021. 12. 21.

추상 클래스는 추상 메서드를 포함한 클래스이다.

추상메서드란?

  • 구현 코드가 없이 선언부만 있는 메서드
  • abstract 예약어를 사용한다.
  • 추상클래스는 new(인스턴스화)할 수 없다.
public class Computer {

    public void display(){}	//추상메서드가 아님
    public void typing();	//추상메서드임 하지만 이대로는 에러가 발생.
}

사용 방법

public abstract class Computer {

    public abstract void display();
    public abstract void typing();
}

추상클래스는 주로 상속의 상위클래스를 위해 사용된다. 하위클래스에서 반드시 구현해야하는 메서드이지만 상위클래스는 그 선언이 모호할때 사용.

하나의 추상 메서드라도 하위클래스에서 오버라이딩 해주지 않는다면 하위클래스도 추상클래스가 되어야 한다. (모든 메서드가 구현되었다고 해도 추상클래스로 선언할 수는 있다.)


템플릿 메서드

  • 추상 메서드나 구현된 메서드를 활용하여 전체의 흐름(시나리오)를 정의 해놓은 메서드
  • final로 선언하여 재정의 할 수 없게 함.

템플릿 메서드 패턴: 디자인 패턴의 일종으로 프레임 워크에서 많이 사용되는 설계 패턴이다. 추상 클래스로 선언된 상위 클래스에서 추상 메서드를 이용하여 전체 구현의 흐름을 정의하고 구체적인 각 메서드 구현은 하위 클래스에 위임한다. 하위 클래스가 다른 구현을 했다고 해도 템플릿 메서드에 정의된 시나리오 대로 수행된다.

템플릿 메서드 구현

public abstract class Car {
    public abstract void dirve();
    public abstract void stop();

    public void startCar(){
        System.out.println("시동을 켭니다.");
    }
    public void turnOff(){
        System.out.println("시동을 끕니다.");
    }
    //템플릿 메서드 (함수가 재정의 되어선 안되기 때문에 final 키워드를 넣는다.)
    final public void run(){
        startCar();
        dirve();
        stop();
        turnOff();
    }
}

italic체로 표기된 것은 추상 메서드, 추상 클래스 이다.


final 예약어

final 변수는 값이 변경될 수 없는 상수이다. (ex: public static final double PI = 3.14;)

final 메서드는 하위 클래스에서 오버라이딩 할 수 없다.

final 클래스는 더이상 상속되지 않는다.


프로젝트 구현시에 여러 파일에서 공유해야 하는 상수 값은 하나의 파일에 선언하여 사용하면 편리하다.

인스턴스를 생성하지 않고 클래스 이름으로 사용이 가능하기 때문에 메모리가 절약된다.


템플릿 메서드 (연습하기)

더보기
더보기

Player가 있고 이 Player가 게임을 합니다. 게임에서 Player가 가지는 레벨에 따라 run(), jump(), turn() 세 가지 기능을 할 수 있습니다 .각 레벨에 따라 기능 가능 여부가 다음과 같습니다.

 

초보자 레벨: 천천히 달립니다. (run() 가능)

중급자 레벨: 빨리 달리고 (run() 가능), 높이 점프(jump() 가능) 할 수 있습니다.

상급자 레벨: 아주 빨리 달리고 (run() 가능), 아주 높이 점프(jump() 가능)하고 한바귀 돌 수 있습니다. (turn() 가능)

 

플레이어는 go()명령어를 받으면 이 세가지 기능을 수행합니다. 이 중 할 수 없는것은 할 수 없다는 메시지를 보냅니다.

실행 결과

if문 전혀 쓰지않고 객체지향으로 짜기

 

댓글