본문 바로가기

Java Programming

후크 메소드 (Hook Method)

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
디자인 패턴 공부하는데.. 하나 빼먹은게 있었다. 템플릿 메소드 패턴을 배울때 나온 내용이었는데 제대로 안 짚고 넘어가서 과제할때 많은 애로사항을 주는 넘이 되었다... 그래서 -_- 공부도 잘 안하는데 후크 메소드가 뭔지 한번 알아 봤다. Head first, Design Patterns (오라일리) 책에는 후크에 대해서 이렇게 말하고 있다.

후크(Hook) 는 추상 클래스에 들어있는, 아무 일도 하지 않거나 기본 행동을 정의하는 메소드로, 서브 클래스에서 오버라이드 할 수 있습니다.

몬 개소리야 -_-;; 전혀 알아 먹을 수가 없다. 저중에 모르는 단어가 있는것도 아닌데 이 구절만 보면 무슨소린지 전혀 모르겠다. 오버라이드하는 메소드가 다 후크야?? 그럼 추상 메소드는 다 후크 메소드 인가?? 하는 생각이 들었다. 그렇다면 추상 메소드라고 하기도 하고 후크 메소드라고 하기도 해야하는데 후크 메소드라는 말은 전혀 생소하다. 그럼 후크의 사전적 의미는 무엇인고?

네이년 사전에 보면 이렇게 나와있다.


대충 느낌으로는 낚아 채다 이런 느낌과 연관이 많이 되는것 같다. 책에서는 JFrame 클래스를 사용하는 방법과 더불어 후크 메소드가 뭔지에 대해서 알려주고 있다. 또한 무슨 소린지 모르겠다.

요새 한껏 놀고 있다. 코딩도 안하고 그냥 멀뚱멀뚱.. 그래서 한번 만들어 봤다.

public abstract class IntroduceTemplate {

      String name;

      int age;

      public IntroduceTemplate(String name, int age) {

            this.name = name;

            this.age = age;

      }

      public final void introduceOneself() {

            sayName();

            sayAge();

            saySpecialty();

            sayMessages();

      }

      public void sayName() {

            System.out.println("안녕하십니까? 저는 " + name + "입니다.");

      }

      public void sayAge() {

            System.out.println("저의 나이는 " + age + " 입니다.");

      }

      /**

      * 얘가 hook method

      */

      public void saySpecialty() {

      }

      public abstract void sayMessages();

}

일단 템플릿 메소드 패턴을 사용해서 만들어본 면접 시뮬레이션 예제이다 -_-;; 약간 논리에 안맞는 부분이 있으나 이것 만큼 여실히 후크를 설명해 주는게 없을거 같아서 한번 만들어 봤다. 이 면접에서는 이름과 나이를 말하고 자기의 장기를 이야기 하고 마지막으로 하고 싶은말을 하는 과정을 가진 면접을 해야한다고 가정을 했다. 그런데 여기서 이름과 나이를 말하는 방법은 정해져 있고 장기는 있는 경우는 말하고 없는 경우는 말할 필요 없으며, 자기 소개는 일정 양식없이 하도록 했다.

따라서 final 선언을 해준 introduceOneself() 메소드는 템플릿을 제공하고 있고 final 선언을 한 이유는 하위 클래스에서 오버라이드 할 수 없도록 해줬다. 말그대로 이름과 나이를 말하는 메소드는 이미 구현이 되어 있고 후크 메소드로 사용이 될 saySpecialty() 메소드는 구현이 안되있고 아무 일도 안한다. sayMessages() 메소드는 추상 메소드로 되어있다. 상속받는 클래스는 무조건 이 메소드를 구현해야한다.

그럼 서브 클래스를 한번 살펴보자.

public class Hansan extends IntroduceTemplate {

      public Hansan(String name, int age) {

            super(name, age);

      }

      @Override

      public void saySpecialty() {

            System.out.println("저는 못하는게 없스빈다. 우하하...");

      }

      @Override

      public void sayMessages() {

            System.out.println("열심히 하겠습니다. 화잇힝");

      }

      public static void main(String[] args) {

            IntroduceTemplate hansan = new Hansan("남한산", 24);

            hansan.introduceOneself();

      }

}

요것이 서브클래스 Hansan 의 모습이다. saySpecialty() 메소드가 기존 슈퍼클래스에서는 아무것도 안해주는 메소드였는데 이걸 다시 오버라이드 해서 재구현했다. '오버라이드 해서 전혀 다른 메소드로 만든다' 라는 면에서는 추상 메소드랑 크게 다를바 없어보이지만 이제 다들 눈치 챘을것이라고 생각한다. 추상메소드는 '강제적' 이다. 반드시 오버라이드 해야만 한다. 하지만 후크메소드는 '선택적' 이다. 더군다나 abstract 라는 키워드도 필요 없다. 필요에 따라서 오버라이드 해도 되고 안해도 되고... 이 시나리오에서 처럼 장기를 말해도 되고 안해도 되고 이런 상황인거다.

훗.. 이렇게 쉬운걸.. 위에있는 후크의 정의가 추상클래스에 있는 메소드니 뭐니 이러니까 이해가 안가지 -_-;;