인생을 코딩하다.

[Java] 디자인패턴(DesignPattern) -> 템플릿 메서드 패턴(template method pattern) 본문

Java

[Java] 디자인패턴(DesignPattern) -> 템플릿 메서드 패턴(template method pattern)

Hyung1 2020. 11. 10. 10:47
728x90
반응형

요즘 읽기 좋은 코드, 헙업할 때 좋은 코드란 뭘까에 관해 많이 고민중이고.. 공부하려고 하는중인데 그래서 디자인 패턴에 관해 정확히 알아둬야 겠다는 생각이 들어 공부하고 지식 공유합니다.

디자인 패턴이란 진짜 간단히 말하면 알아보기 쉽게, 즉 효율적인 의사소통을 위한 코드? 그러한 방법들을 몇 가지의 일종의 패턴으로 분류해 놓은 것 또 템플릿 메소드 패턴이란 디자인 패턴 중 하나

템플릿 메서드를 공부하기 전에, 추상 클래스,추상 메서드에 관해 모른다면 먼저 공부해보시길 바라며...

 

템플릿 메서드란? 프레임워크에서 설계를 할 때, 흔하게 사용되는 방법 중 하나

- 어떤 작업을 처리할 때 일부분을 서브 클래스로 캡술화(Aihyungil.java, ManualHyungil.java)하여 전체 일을 수행하는 구조는 바꾸지 않고(밑의 예제에서 run() 메서드) 특정 단계에서 수행되는 내용들을 바꾸는 패턴

 

템플릿 : 틀이나 견본을 의미

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

 

템플릿 메서드 패턴 : 디자인 패턴의 일종, 프레임 워크에서 많이 사용되는 설계 패턴

- 추상 클래스로 선언된 상의 클래스에서 추상 메서드를 이용하여 전체 구현의 흐름을 정의하고 구체 적인 각 메서드 구현은 하위 클래스에 위임함

- 하위 클래스가 다른 구현을 했다고 해서 템플릿 메서드의 정의된 시나리오 대로 수행함

 

형일로봇을 작동하는 프로그램을 만든다고 한다면

 

 

 

 

이렇게 틀이 되는, 시나리오가 되는 메서드들은 재정의 하면 안된다. 하위 클래스에서 재정의 해주면 안되는 메서드들은  final을 붙여준다. 템플릿 메서드 -> run()

   // 템플릿 메서드
   final public void run() {
        startHyungil();
        running();;
        stop();
        runOff();
        washHyungil();
    }

 

AIHyungil.java

 

 

ManualHyungil.java

 

 

HyungilTest.java

 

 

출력

 

 

 

프레임워크에서 흐름을 정의한 부분은 정해져 있다. 프레임워크가 보통 그렇다. 우리가 프레임워크를 도입해서 프로젝트를 한다고 하면 그 프레임워크의 흐름을 내가 제어할 수는 없다. 흐름은 이미 정해져 있고 그 중간 중간에 흐름이 돌아가기 위해 방향(클래스)들을 내가 구현하는거다. 로직의 흐름을 구현한다고 할까?

 

public void washHyungil() {}
// Hyungil.java
    @Override
    public void washHyungil() { // 기능 확장
        System.out.println("자동 샤워를 합니다.");
    }
    //AiHyungil/java

구현을 확장 할 수 있는 메서드. 이런 메서드들도 설게를 할 때 사용을 한다. 이렇게 하고나면 이거를 구현하는 쪽(AiHyungil.java)에서 오버라이드 했을때 기능이 확장되는...

 

위 예제가 템플릿 메서드 패턴의 예제이다.

 

여기서 또 알면 좋은 키워드는 final? 이라고 생각한다

 

final 변수는 값이 변경될 수 없는 상수다 .

public static final double PI = 3.14; 

오직 한 번만 값을 할당할 수 있다.

 

final 메서드는 하위 클래스에서 재정의 (overriding)할 수 없다. 또 final 클래스는 더 이상 상속되지 않는다 예를 들면 java의 String 클래스?

 

그럼 우리가 final에 관해 학습을 하고.. 플젝을 할 때, 우리가 배운 final을 어떻게 플젝에 녹여내서 시스템의 성능을 향상 시킬 수 있을까?

 

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

public class Define {
    public static final int Min = 1;
    public static final int MAX = 99999;
    public static final int ENG = 100;
    public static final int MATH = 2001;
    public static final int double PI = 3.14;
    public static final int String GOOD_MORNING = "Hgyung Good Morning";
}
public class UsingDefine {
    public static void main(String[] args) {
        System.out.println(Define.GOOD_MORNING);
        System.out.println("최솟값은" + Define + "입니다.");
        System.out.println("수학 과목 코드 값은" + Define.MATH + "입니다.");
    }
}

우리가 static final로 정의 해주었기 때문에 한 번만 메모리에 잡히고(static 때문에)

또 new를 해주지 않아도 바로 가져다 쓸 수 있다. 클래스를 new하게 되면 인스턴스가 생성되고 힙 메모리가 오버헤드가 있는데 그것을 줄일 수 있는 팁이다.

728x90
반응형
Comments