Function hook 테크닉 (템플릿 메소드 패턴)

Posted by epicdev Archive : 2012. 10. 8. 21:57

오늘은 Function hook 테크닉을 소개하고자 합니다.

테크닉의 명칭은 제가 그냥 이 테크닉을 알게된 코드의 주석에서 따온 거구요, 이 테크닉에 대한 정식 명칭이 있는지는 잘 모르겠습니다.

이 테크닉은 제가 JDK의 HashMap 코드를 보다가 접하게 되었습니다만 사실 예전부터 그냥 인지하지 못하고 가끔씩 사용하던 패턴이었고,

실제로 다른 분들도 많이 사용하시리라 생각합니다.


업데이트 (2013.03.20)

역시나 이 테크닉 또한 디자인 패턴이었군요. 템플릿 메소드 패턴이라고 불리는 디자인 패턴입니다.

자세한 내용은 아래의 링크를 참고하시길...

http://en.wikipedia.org/wiki/Template_method_pattern


우선 제가 접한 코드를 보도록 하겠습니다.



위의 코드에는 HashMap의 생성자들과 init이라는 함수가 있습니다.

init()은 HashMap의 생성자들의 맨 마지막에 호출이 되는 함수입니다.

그런데 이상하게도 init()의 body는 텅 비어있습니다.

텅 비어있는 함수를 왜 생성자 마지막에 호출하는 것일까요?


init()의 javadoc에는

Initialization hook for subclasses. This method is called in all constructors and pseudo-constructors

라고 적혀있습니다.


즉, 이 init()은 하위 클래스에서 추가적인 초기화 코드가 필요할 경우 init()을 오버라이드해서 사용할 수 있도록 미리 상위 클래스에서 만들어 놓은 함수입니다.

이렇게 하게되면 굳이 하위 클래스에서 모든 생성자를 override해서 초기화 코드를 넣지 않아도 됩니다.

그냥 간단하게 init()이라는 함수만 override해서 초기화코드를 넣으면 되는 것입니다.

이러한 function hook 테크닉은 초기화 코드 뿐만 아니라, 상속 후 기능 확장이 예상되는 부모클래스의 다양한 곳에서 사용 될 수 있습니다.


정리하자면, function hook 테크닉은 어떤 부모 클래스를 만들 때 하위 클래스에서 확장이 필요할 것 같은 부분을 부모 클래스를 설계 할 때 미리 파악해서

하위 클래스가 좀 더 수월하게 부모 클래스를 확장시킬 수 있도록 도와주는 테크닉이라고 할 수 있겠습니다.

'Archive' 카테고리의 다른 글

오픈소스 라이센스의 종류  (0) 2013.02.12
우분투 창 버튼 오른쪽으로 옮기기  (0) 2012.12.22
KAIST 셔틀 for Android  (0) 2012.09.15
Word Cloud 생성기  (0) 2012.09.08
SVN Branch & Merge 헷갈릴 때 참고할만한 글  (0) 2012.09.06
  

Javascript 형변환 테크닉

Posted by epicdev Archive : 2012. 2. 23. 22:34
Javascript에서 형변환을 할 때 primitive type의 생성자를 사용하지 않고, 간단하게 연산자를 통해서 아래처럼 형변환이 가능하다.

  

Java에서 중첩 루프 한번에 탈출 하는법

Posted by epicdev Archive : 2012. 1. 26. 22:22
중첩 루프를 돌면서 어떠한 조건이 만족하면 탈출하는식의 코드를 자주 코딩을 하게 된다.
이런 유형은 대개 아래와 같다.

일반적으로 이런 경우에는 아래와 같은 방법으로 코딩을 하게 된다.
혹은 중첩 루프를 함수로 만들어서 if 절 안의 break를 return으로 바꿔서 한번에 루프를 탈출하는 방법을 쓰기도 한다.
C++의 경우 goto를 사용하면 더 간단하게 이 문제를 해결할 수 있다.
물론 goto는 무조건 사용하지말라고 배웠다면 이러한 방법이 꺼려지겠지만,
거의 유일하게 goto를 써도 욕을 먹지 않는 경우가 바로 아래의 경우이다.
flag에 대한 설명을 주저리 주저리 할 필요도 없고, 코드의 가독성 또한 훨씬 높아진다.
하지만 Java에서는 goto문이 없다. 즉, C++에서처럼 goto를 사용해서 중첩 루프를 탈출 할 수 없다는 것이다.
하지만 Java에서는 이와 비슷한 다른 문법적 장치가 있다.
Java에서는 위와 같이 코딩을 하면 중첩 루프를 한번에 탈출할 수 있다.
왜 이런지 이해가 되지 않는다면 아래처럼 named block을 사용했다고 생각하면 된다.
혹은
  
 «이전 1  다음»