Wednesday, March 14, 2012

knou 통계학 개론 1

제 4장 확률 및 확률 분포함수


-확률의 정의-


고전적인 정의,상대 도수 이론, 주관적 관점


확률의 고전적인 정의 : 표본 공간을 구성하는 원소들이 동일한 가능성으로 나타날때 적용가능. 예를 들어 제품을 만들때 불량품이 나오거나 정상품이 나오는데 이때 표본 공간은 S= {정상품, 불량품}으로 정상품과 불량품이 나올 가능성이 동일하는 가정이 있어야 확률의 고전적 정의가 가능하다. 하지만 현실적으로는 그렇지 않기 때문에 확률을 정의하는 개념이 확장되어야 하는데 이것이 상대 도수 이론에 의한 확률의 정의이다.


상대 도수 이론에 의한 확률의 정의 : 확률은 한 시행을 동일한 조건 하에서 독립적으로 반복할 때 그 사건이 일어날 것으로 예측되는 횟수의 전체 시행횟수에 대한 백분율


주관적 관점에 의한 확률의 정의 : 한번의 시행, 반복이 불가능한 상황에서 확신의 정도를 주관적으로 표현한 것.


순열 조합은 표본공간(sample space)를 구성하는 원소(element)를 쉽게 구할수 있기 때문에 많이 이용된다. 특히나 확률의 고전적인 정의가 적용되는 사례에서 유용하다.


확률적 실험 : 전체 가능한 모든 결과(표본 공간)은 알고 반복이 가능한 경우를 확률적 실험이라 한다.


확률변수(random variable) : 표본 공간(sample space)의 각 원소에 실수 값을 대응시켜주는 함수. 곧 표본공간의 원소를 그래프의 x 축에 대응시키는 함수를 의미.


확률밀도 함수 : 확률 변수에 확률값을 대응시키는 함수. 곧 확률변수 x 에 확률값 y를 대응시키는 함수.


연속 확률변수에서는 구간에서의 확률을 구하게 되고 이는 그 구간에서의 확률분포 그래프의 면적에 해당한다.


연속 확률변수의 특정 확률변수의 확률은 0이다. 구간, 즉 x축의 범위가 0이 되기 때문에 확률밀도 함수의 적분값이 0 이 되기 때문이다.


표준화된 확률변수(standardized random variable) : 평균과 표준편차가 주어졌을때 확률변수에 평균 값을 뺀후 표준편차를 뺀 값을 의미한다. 이렇게 표준화된 확률변수는 평균이 0 분산이 1을 갖게 된다.




제 5장 표본 분포와 추정


대표적인 이산형 학률 분포


-이항분포-


  • 베르누이 시행 : 실험의 결과가 두가지만 가능한 시행, 곧 sample space 의 원소가 2개인 시행.
  • 시행(trial) : 같은 실험을 반복할 때 각각의 실험
  • 이항분포 : 베르누이시행이 적용되었을 때 전체 n 번의 시행중에 성공 횟수에 관심이 있을 때 적용되는 분포. 곧 이항분포의 확률변수 X는 n 번의 베르누이 독립시행에서 얻은 총 성공 횟수가 된다.




-포아송 분포-
포아송 분포는 원래 이항분포에 대한 확률계상을 근사적으로 하는 방법으로써 발견됨.


  • 포아송 분포를 적용하기 위한 가정 
    1. 독립성 : 서로 다른 단위에서 출현하는 횟수는 서로 독립 (예 : 시간당 발생하는 교통 사고 발생 건수의 예에서 한시간 전에 일어난 교통사건 건수와 뒤에 한시간 동안 일어날 건수가 서로 독립이다)
    2. 비집략성 : 극히 작은 단위에서 둘 이상이 일어날 확률은 매우 작음, 곧 어떤 사건의 발생 가능성이 대단히 작다를 의미
    3. 비례성 : 단위시간이나 공간에서 성공의 평균 출현횟수는 일정함,곧 사건의 발생  평균 출현 횟수가 단위시간이나 공간에 비례함을 의미
포아송 분포를 결정하는 것은 단위당 평균 발생률. 이때 단위는 시간이 될수도 있고 공간이 될 수도 있다. 포아송 분포라는 것은 이러한 단위당 평균 발생률이 m 일때 단위당 특정 발생 횟수에 관심을 갖을 때 사용하는 것이 포아송 분포이다.



대표적 연속 확률 분포


-정규분포-
이항분포의 확률을 근사적으로 계산하는 과정에서 도입되기 시작.




표본 분포와 추정
  • 통계적 추론 (statistical inference) : 모집단에서 추출한 표본을 이용하여 모집단에 관한 추측이나 결론을 이끌어 내는 과정
  • 모수 (parameter) :  모집단의 특성값
  • 통계량 (statistics) : 표본에서 구한 특성값
  • 추정량, 추정치 : 모수를 추정하기 위한 수식을 추정량이라 하고 구체적으로 구한 값을 추정치라 한다.
  • 표본 추출변동 : 통계량 값이 표본에 따라 달라지는 것
  • 표본 분포 (sampling distribution) : 표본 통계량의 분포


통계량의 관한 성질

1. 표본 평균의 표본분포에 관한 성질 ; 샘플링을 했을때 그 표본의 통계량인 표본 평균을 구하게 되는데 표본 추출변동에 따라 이 통계량이 달라진다. 이 통계량(여기서는 표본평균) 의 표본 분포, 그러니까 표본 평균들의 분포에 대한 성질을 알아본다.
  1. 평균이 m이고 분산이 y2 인 무한모집단에서 표본의 크기가 n 인 랜덤표본의 표본평균 x- 의 평균 E(x-) = m, var(x-) = y2/n이다. 곧 표본평균들의 평균은 모집단의 평균과 동일하고 분산은 모집단의 분산을  표본의 크기로 나눈값과 같다.
  2. 모집단의 분포가 정규분포 N(m,y2) 일때 표본 크기 n인 랜덤 표본의 표본평균 x-는 정규 분포 N(m,y2/n)을 따른다.

2. 표본분산의 분포
모분산이 y2인 정규분포에서 뽑은 랜덤 표본에 대하여 ((n-1)S2)/y2 는 자유도가 n-1 인 카이제곱을 따르게 된다. 여기서 S2는 표본의 분산(이때 n으로 나누는 것이 아니라 n-1로 나누는 것)

중심극한정리(central limit theorem) : 확률변수에서 합의 분포를 구할때, 그 수가 늘어남에 따라 합의 분포가 정규분포로 근접함을 의미. 정규분포를 따르지 않는 관측값의 평균이나 합을 이용한 수치에 기초하여 통계분석이 진행되는 경우 중심극한정리를 적용한다. 또한 어떤 모집단의 랜덤표본으로부터 얻은 확률변수의 합이나 평균에 대한 분포를 알고자 할 때 이용된다. 

중심극한정리를 다르게 표현하자면..
중심극한정리 는 평균이 m이고 분산이 y2 인 임의의 모집단 ("임의의"기 때문에 모집단이 꼭  정규분포를 따르지 않아도 된다)에서 표본의 크기(n)이 충분히 크면 표본평균(x-)는  평균이 m이고 분산이 y2/2인 정규분포를 따른다 (주의 : 이는 표본평균의 표본 분포에 관한 성질과 다른 것. 표본평균의 표본분포의 첫번째 성질은 표본평균들의 평균에 관한 것이고, 두번째 성질은 모집단이 정규분포를 따를 때를 의미한다. 반면 중심극한 정리는 모집단이 임의의 분포일때 적용되는 것).

이항분포의 정규근사
이항 분포 B(n,p) 를 따르는 확률 변수 X는 n이 클 때 근사적으로 정규분포 N(np,npq)를 따른다. (주의하게 중심극한정리와 헷갈리면 안됨. 모집단이 이항분포인 것에서 샘플링한 것, 표본의 분포에 관한 내용이 아니라 이항분포의 정규근사는 모집단이 이항분포 일때 이 모집단 자체가 크면 이 모집단이 정규분포로 근사하게 된다는 의미)

모수의 추정


  • 점추정(point estimator) : 미지의 모수를 하나의 값으로 추정
    • 모집단의 점추정 : 표본의 평균을 모집단의 추정량으로 여김. 이때 표준 오차(S.E.)는 y2/n의 제곱근값. y2/n 에서 y2는 모집단의 분산을 의미. 그런데 일반적으로 모집단의 분산도 알수가 없기 때문에 표본 분산 S2를 이용하여  표준 오차의 추정량을 구한다. 곧y 대신 S를 이용. 곧, 표준 오차는 추정의 정확도를 나타내는 수치.
  • 구간추정(interval estimator) : 미지의 모수가 포함될 것으로 기대되는 구간 추측
  • 95% 신뢰구간의 의미: 신뢰구간을 100번 구했을때 그중에 95 개 정도의 신뢰구간은 실제 모수를 포함하고 있다는 의미
t-분포 : 모집단의 표본에서 구한 표본표준편차를 대입해서 계산하는데 따르는 분포, 표본 평균은 N(m,y2/n) 을 따르기 때문에(위의 표본평균의 표본분포의 성질1 확인) 표본 평균에다가 m을 빼고 y2/n 의 제곱근을 나누어 주면 이는 표준 정규분포를 따른다. 하지만 일반적으로 모집단의 분산인 y2  를 알수 없기 때문에 표본 분산인 S2를 사용하게 되는데, 이때  표본 평균에 모집단의 평균  m을 빼고 S2/n의 제곱근을 나누어 주게 되면 이 값이 자유도가 n-1인 t-분포를 다르게 된다.


구간 추정을 정리하면.. 표본 크기가 작을 때
표본의 크기가 크면 중심극한 정리에 의하여 표본 자체가 정규분포를 따르게 되어 아래와 같다.




제 6장 통계적 가설 검정


통계적 추론(statistical inference) : 모집단에서 추출한 표본을 이용하여 모집단에 관한 추측이나 결론을 이끌어내는 과정


한모집단 모수의 가설 검정
가설 검정(hypothesis testing) : 표본을 이용하여 미지의 모집단 모수에 대한 두가지 가설을 놓고 오느 가설을 선택할 것인지 통계적으로 의사결정 하는 것.


1. 모평균의 가설 검정
가설 검정의 기본적인 생각 : 확실한 근거가 있기 전에는 대립가설(변화되 사실)을 선택하지 않고, 귀무가설(현재의 사실)을 받아들이게 됨


통계적 가설 검정


  • X-(표본 평균)가 C 보다 작으면 귀무가설 H0(귀무가설)을 채택하고 아니면 H0을 기각한다.
  • {X- < C} : H0 채택역(acceptance region), {X- >= C} : H0 기각역(rejection region)
  • 여기서 C는 기준값(critical value)라 한다. 이 C는 확률 분포 그래프에서 x 축의 값을 의미
통계적 가설 검정에서는 제1종 오류 (실제상황에서 H0가 참인데 반해 검정결과에서는 H1을 채택한 상황)가 발생할 확률의 허용한계를 결정하여, 이 한계를 만족시키는 선택기준을 이용해서, 제 1 종 오류를 가능하면 줄이도록 노력해야 한다. 곧 이 말인 즉슨 왠만하면 귀무가설을 기각 하지 않는 쪽에 초점을 맞춘다는 말.
여기서 제 1종 오류가 발생할 확률의 허용한계를 유의 수준(significance level) 이라한다. 이 유의 수준은 확률 값으로서 확률밀도 함수의 넓이를 의미.

예를 보자면 아래와 같다








위를 보게되면 H0을 기준으로 H0을 기각하는 영역을 적게 하는데 기준을 두어서 계산을 하는 것을 볼 수 있다. 유의 수준을 정하고(유의 수준을 정했다는 것은 H0이 맞는데 H1을 채택하는 경우의 확률을 정했다는 것. 무슨 말인고 하면 H0의 확률 분포(H1의 확률분포를 기준으로 한것이 아니라)를 기준으로 C 이상이 되는 영역의 넓이(이 넓이가 H0이 사실인데 H1을 채택한 확률을 의미)가 유의 수준이 되는 것을 기준으로 했다는 것.)

유의 확률 p 값을 이용한 가설 검정 : p 값은 관찰된 표본평균값을 기준으로 했을 때 1종 오류의 확률(표본평균값을 x 축의 기준으로 이보다 큰 H0의확률 밀도 함수의 넓이를 의미)로서 p 값이 클수록 귀무 가설이 기각되지 못한다. 곧 특정 표본 평균을 기준으로 했을때의 1종 오류의 확률인 p 값이 유의수준보다 작다는 이야기는 특정 표본 평균이 이미 기준값 C를 넘어 섰다는 이야기가 되고 곧 H0를 기각하게 된다.

만약 모집단의 표준 편차를 알면 모집단의 표준 편차와 Z 정규분포를 사용하고, 만약 모집단의 표준편차는 모르지만 표본의 크기가 클때(일반적으로 >30) 일때 표본의 표준 편차를 모집단의 표준편차처럼 사용 가능하다. 만약에 샘플의 크기가 작다면(<30)이면 표본의 표준 편차를 이용하되 t 분포를 이용한다.

2.모분산의 가설 검정



두모집단 모수의 가설 검정 


1.두 모평균에 대한 가설 검정(두 집단이 독립일때) : 두 모분산이 같은지 다른지에 따라 검정 통계량이 달라진다. 그래서 두 모집단의 분산이 같은지 다른지 부터 판단을 해야 한다.



1.1.두 모분산이 같은 경우의 검정 통계량 : 검정통계량은 두 모집단이 정규분포를 따르고 모분산들이 같다는 가정 하에서 자유도가 (n1+n2-2)인 t- 분포를 따르게 되는데, 이를 이용해서 검정이 가능, 만약 n1과 n2가 크면 (>30) t분포 자체가 표준 정규 분포에 근사하므로, 이 경우 표준정규분포를 사용해되 된다.
1.2. 두 모분산이 다른 경우의 검정 통계량 :  


2.두 모평균에 대한 가설 검정(두 집단이 독립이 아닐때) :

대응표본(=쌍체 표본) : 서로 독립적이지 않은, 비슷한 성질을 지님, 이것을 이용해서 두 모집단의 평균을 비교하는 가설검정을 대응비교(paired comparison)라 한다.


3. 두 모분산에 대한 가설 검정
F 분포 자체가 0보다 크기 때문에 검정 통계량을 구할때는 큰 표본분산을 분자로 두어야 한다. 그래서 특정  F분포의 값보다 작은지를 비교한다.
위의 식에서 두 모집단의 분산이 같은지 다른지를 검정할때 기본 가정이 두 모집단의 분산이 같다는 가정이기 때문에 분모 분자의 모분산이 같다고 가정되어 서로 제거가 된다.

python PIL setting

IOError: decoder zip not available

http://stackoverflow.com/questions/3544155/need-help-with-a-pil-error-ioerror-decoder-zip-not-available

Monday, February 20, 2012

active python path

http://docs.activestate.com/activepython/2.7/pypm.html#installing-packages


Installing packages is simple:

C:\> pypm install pyramid

This command will download pyramid and its depdendencies automatically. Unless the -g option is specified, packages are not installed into the ActivePython installation directory. Instead, PyPM follows the PEP 370 specification and installs packages by default in ~/.local on Unix and Mac and %APPDATA%\Python on Windows; and the Python interpreter automatically picks up the local packages. To find where the package was installed, use the show or files command.




ex :: python -g install pybedtools

Monday, January 9, 2012

Introduction to graph theory

Theorem 1.1 G가 n개의 vertices를 갖는 multigraph 라고 하면 각 vertex의 degree(vertex에 연결된 edge의 갯수)의 합은 G의 edge 갯수의 2배와 같다.


Corollary 1.2 odd vertices(degree가 홀수인 vertices) 의 갯수는 짝수이다.

  • complete graph : graph의 모든 vertices 가 서로 연결되어 있는 graph. Kn 으로 표시. 여기서 n은 order로서 vertices의 수를 의미
  • null graph : 그래프 G가 있을때 E(G) =0 인 그래프. 즉 edge가 하나도 없는 그래프. Nn으로 표시. 여기서 n은 vertex 수
  • walk : vertex와 edge의 번갈아가면서 나오는 sequence. v0 e0 v1 e1 v2... vn. 이때 길이는 edge의 갯수
  • trail : walk 중에 edge가 두개 이상 반복이 안된 walk.
  • path : walk 중에 vertex가 두개 이상 반복이 안된 walk. path는 반드시 trail이다. 그러나 역은 반드시 성립하는 것은 아니다.
  • distance from x to w : vertex x 에서 vertex w 까지의 최단 path 길이. d(x,w) 로 표현한다.
  • closed : vertex u에서 시작해서 vertex v로 끝나는 walk가 있을때 u = v 이면 이는 closed 되어 있다고 한다.
  • circuit : closed walk 중에 edge가 반복이 안된 walk.
  • cycle : circuit 중에 vertex가 반복이 안된 circuit. Cn 은 n 개의 vertex를 갖는 cycle을 의미
  • connected : multigraph G의 모든 vertex가 path로 연결되어 있다면 G는 connected 되었다고 한다.
  • isomorphic : 두 그래프 G와 H가 같을때 isomorphic이라 한다. 정확히 이야기 하자면 isomorphism 이라고 불리는 함수 f (그래프 G에서 H로의 mapping(vertex to vertex) 함수로서 그래프 G의 adjacency(두 vertices의 연결)를 유지하게 하는 함수)  가 존재할 때, 두 그래프는 isomorphic 하다라고 한다. isomorphism은 하나 이상이 될 수 있다.
  • induced subgraph : H가 G의 induced subgraph 라고 한다면 v(H) 가 v(G)의 subset이고 이 G 안에서 subset 사이에 존재하는 edge가 모두 H에 있음을 의미한다. 
Isomorphism Testing Problem : 두 그래프 G와 H가 isomorphic한가를 판단하는 문제.



--chapter 3--
  • bipartite : order(vertex의 갯수)가 최소 2 이상인 그래프 중 vertex가 두 그룹으로 나뉘고 모든 edge가 각 두 그룹의 vertex를 join 하게 할때 이를 bipartite 라고 한다.
  • partite sets : bipartite graph에서 두 subgroup(두 vertex set)을 partite set이라 한다.
Theorem 3.1 : 그래프 G는 odd cycle을 포함하지 않을 때(필요충분조건) bipartite 가 된다. 이는 아래 Lemma 3.2를 이용하여 증명할 수 있다.

Lemma 3.2 : odd 길이의 closed walk(시작 vertex와 끝 vertex가 같은 walk)는 항상 odd cycle을 포함한다.

  • tree : cycle이 없고 connected 된 graph
Theorem 3.3 : G가 connected graph 라고 할 때, G의 임의의 두 vertex가 unique path에 의해 join 된다면(필요 충분 조건) , G는 tree이다.
Theorem 3.4 : G가 order가 n이고(v(G) = n) size가 m일때(e(G) = m) m = n-1 이면 G는 tree이다.




--chapter 4--

  • k-colouring of G : 그래프 G가 있을때 그래프의 각 vertex를 k 개의 색깔로 칠하는 방법. 단 adjacent(연결된 vertex) 한 vertex끼리는 다른색이여야 한다.
  • chromatic number of G : k-colouring of G에서 가장 작은 k 값. X(G) 로 표현.

--chapter 6--
  • Euler circuit : connected multigraph 인 G가 있을때 G의 모든 edge를 포함하는 circuit.
  • Eulerian multigraph : Euler circuit을 갖는 multigraph, 쉽게 이야기 하면 그래프의 모든 edge를 한번씩 통과해서 시작 vertex로 오게 되는 walk를 갖고 있는 graph
Theorem 6.1 G가 connected multigraph 라고 할 때 G의 모든 vertex의 degree가 even 일때(모든 vertex에 연결된 edge의 갯수가 짝수 일때)만 Euler graph이다.
  • spanning cycle : order 가 3이상(vertex의 갯수가 3이상)인 그래프 G가 있을 때 모든 vertex를 통과하는 cycle을 spanning cycle 이라 한다. euler circuit과의 차이는 euler circuit는 모든 edge를 포함해야 한다는 것이며 spanning cycle은 모든 vertex를 포함해야 한다는 것이다.
  • hamiltonian graph : spanning cycle을 가지고 있는 graph
Rules for constructing Hamiltonian cycles in G
1. degree가 2인 vertex의 모든 edge는 spanning cycle에 포함되어야 한다.
2. spanning cycle을 만드는 도중에 spanning cycle이 아닌 cycle이 형성될 시에는 그 그래프는 Hamiltonian graph가 될 수 없다.
3. spanning cycle을 만드는 도중에 vertex의 2개의 edge가 정해졌다면 그 vertex에 연결된 그 외의 edge는 제거한다.

Theorem 6.3 G가 만약 Hamiltonian graph 라면 V(G)의 non-empty subset S에 의한 c(G-S)는 |S| 보다 작거나 같다. c(G-S) 는 graph G 에서 subset인 S에 포함되는 vertex와 그 vertex에 연결된 edge를 지운 graph 의 component 갯수를 의미. theorem 6.3은 Hamiltonian graph의 필요 조건.

Theorem 6.4 order가 3 이상인 그래프 G가 있을 때, 모든 vertex에 대해 d(v)가 n/2 이상이 되면 이는 Hamiltonian graph 이다.

Theorem 6.5 order가 3 이상인 그래프 G가 있을때 adjacent vertices를 제외한 모든 vertex 페어에 대해서 d(u) + d(v)가 n 보다 크거나 같으면 이는 Hamiltonian graph 이다.

Monday, January 2, 2012

head first design pattern 4

  • state pattern : 스테이트 패턴을 이용하면 객체의 내부 상태가 바뀜에 따라서 객체의 행도응ㄹ 바꿀 수 있다. 마치 객체의 클래스가 바뀌는 것과 같은 결과를 얻을 수 있다.
    • 예제 : 뽑기 기계가 있다. 뽑기 기계는 4가지 상태(동전 있음, 동전 없음, 알맹이 판매, 알맹이 매진) 가 있고 각 상태를 전환하기 위한 행동(손잡이 돌림, 동전 반환, 동전 투입, 알맹이 내보냄)이 있다. 이를 코딩하라
    • 단순 답변 : 각 상태를 나타내는 상수를 정적 변수에 저장한다. 그리고 행동을 메소드로 표현해서 if문을 사용해서 상태에 맞는 각 행동을 취한다. 만약에 10번중에 한번은 특별 당첨으로 2개의 뽑기가 나온다는 기능을 확장하려 한다. 이러면 단순 답변의 코드를 전부 뜯어 고쳐야 한다.
    • state pattern : 상태를 나타내는 state 인터페이스를 정의 하고 이를 구현하는 구상 클래스들에서 각 상태에 따른 행동을 정의한다. context는 state를 구성으로 갖고(맴버 변수) 이 상태를 나타내는 맴버 함수에서 state 객체의 메소드를 호출한다.
  • proxy pattern : 어떤 객체에 대한 접근을 제어하기 위한 용도로 대리인이나 대변인에 해당하는 객체를 제공하는 패턴
    • 예제 : 클라이언트에서 서버에 특정 작업(메소드)를 호출하여 결과값을 받을때

Wednesday, December 21, 2011

head first design pattern 3

  • adapter pattern & facade pattern
    • adapter pattern : 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환한다. 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있다.
      • 객체 어댑터 : client 클래스에서는 target 인터페이스를 구성 맴버 변수로 가지고 있고 target 인터페이스를 구현한 구상 클래스인 adapter 클래스가 adaptee를 맴버 변수로 가지고 있어서(구성:composition) client에서 target 변수로 adaptee 객체를 쓸수 있도록 target의 기능에 맞게 adaptee 기능들 wrapping 한다.
      • 클래스 어댑터 :  객체 어댑터가 adapter가 adaptee를 구성 맴버로 갖으면서 target 인터페이스를 구현한 것에 반해 클래스 어댑터는 adapter가 target과 adaptee를 다중 상속한다.
    • facade pattern : 어떤 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공한다. 퍼사드에서 고수준 인터페이스를 정의하기 때문에 서브시스템을 더 쉽게 사용할 수 있다.
      • 최소지식원칙을 지키는데 퍼사드 패턴을 사용할 수 있다.
  • template method pattern : 템플릿 메소드 페턴에서는 메소드에서 알고리즘의 골격을 정의한다. 알고리즘의 여러 단계 중 일부는 서브클래스에서 구현할 수 있다. 템플릿 메소드를 이용하면 알고리즘의 구조는 그대로 유지하면서 서브클래스에서 특정 단계를 재정의할 수 있다.
    • hook : 추상클래스에서 선언되는 매소드이지만 일반적으로 아무 것도 들어 있지 않다. 서브클래스들은 이 후크를 사용해서 특정 순서에 특정 메소드를 시행할 수 있다. 다르게 말하면 추상클래스에서 hook라는 매소드를 만들고 탬플릿 메소드에서 실행시키면 필요 없는 서브 클래스들은 hook에서 null을 return 하면 되고 특정 메소드를 해야 하는 서브클래스에서는 hook 메소드를 오버라이드해서 사용.
  • iterator pattern & composite pattern
    • iterator pattern : 이터레이터 패턴은 컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체 안에 들어 있는 모든 항목에 접근할 수 있게 해주는 방법을 제공한다.
      • 예제 : 두 음식점이 합병됐다. 메뉴판을 합쳐야 하는데 메뉴 클래스는 두 음식점이 통일했다. 하지만 두 음식점이 매뉴들를 담고 있던 컬랙션이 다르기 때문에 웨이트리스라는 객체를 만들었을때 메뉴를 출력하려면 각 컬랙션을 가각 for문을 돌려야 하는 현상이 나타난다.
      • 이터레이터 패턴 : iterator 라는 인터페이스를 만들고 각 음식점의 컬랙션에 맞는 구상 iterator 클래스를 만든다. 각 음식점 클래스에서는 이 자신의 메뉴 컬랙션에 맞는 구상 iterator 클래스를 return 한다. 그러면 웨이트리스 객체는 동일한 메소드를 가지고 두 음식의 메뉴 리스트를 출력 가능하다.
    • composite pattern : 컴포지트 패턴을 이용하면 객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층구조로 만들 수 있다. 이 패턴을 이용하면 클라이언트에서 개별 객체와 다른 객체들로 구성된 복합 객체를 똑같은 방법으로 다룰 수 있다.



디자인 원칙 : 
  1. 최소 지식 원칙 : 정말 친한 친구하고만 얘기해라. 아무 객체의 매소드를 호출하는 것이 아니라, 특정 객체(1.객체 자신, 2.메소드에 매개변수로 전달된 객체, 3.그 메소드에서 생성하거나 인스턴스를 만든 객체, 4.그 객체에 속하는 구성요소) 의 메소드만 호출한다.
  2. 헐리우드 원칙 : 먼저 연락하지 마라. 우리가 연락하겠다. 이는 고수준 구성요소에서 저수준 구성요소에 하는 소리. 
  3. 클래스를 바꾸는 이유는 한 가지 뿐이어야 한다.