差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| study:java:design_pattern:template_method [2008/08/16 09:46] – banana | study:java:design_pattern:template_method [2008/09/03 14:27] (現在) – banana | ||
|---|---|---|---|
| 行 17: | 行 17: | ||
| {{: | {{: | ||
| + | {{keywords> | ||
| ===== snippet of AbstractClass ===== | ===== snippet of AbstractClass ===== | ||
| 行 46: | 行 46: | ||
| 서브클래스에서 오버라이드 할 수 있지만, 반드시 그래야 하는 건 아니죠. 이 메소드를 어떤 식으로 활용하는지는 밑에서 살표보도록 | 서브클래스에서 오버라이드 할 수 있지만, 반드시 그래야 하는 건 아니죠. 이 메소드를 어떤 식으로 활용하는지는 밑에서 살표보도록 | ||
| 하겠습니다. | 하겠습니다. | ||
| + | |||
| + | |||
| 行 120: | 行 122: | ||
| try{ | try{ | ||
| + | | ||
| | | ||
| | | ||
| 行 129: | 行 131: | ||
| } | } | ||
| | | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== sorting using template-method pattern ===== | ||
| + | 배열을 가지고 자주 하는 일 가운데 뭐가 있을까요? | ||
| + | |||
| + | 자바의 Arrays 클래스에는 정렬할 때 쓸 수 있는 편리한 템플릿 메소드가 있습니다. 그 메소드가 어떤 식으로 작동하는지 살펴봅시다. | ||
| + | |||
| + | <code java> | ||
| + | public static void sort(Object[] a){ | ||
| + | Object aux[] = (Object[])a.clone(); | ||
| + | mergeSort(aux, | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | 이 %%sort()%%메소드는 배열의 복사본을 만든 다음 %%mergeSort()%%를 호출할때 대상 배열로 전달해 주기 위한 보조 메소드입니다.\\ %%mergeSort()%%를 호출할 때는 배열의 길이와 첫번째 원소의 위치(0)도 알려줘야 합니다. | ||
| + | |||
| + | <code java> | ||
| + | private static void mergeSort(Object[] src, Object[] dest, int low, int high, int off){ | ||
| + | | ||
| + | for(int j=i; j>low && ((Comparable)dest[j-1]).compareTo((Comparable)dest[j])> | ||
| + | swap(dest, j, j-1); | ||
| + | } | ||
| + | } | ||
| + | | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | %%mergeSort()%%메소드에는 정렬 알고리즘이 들어있으며, | ||
| + | 정렬이 실제로 어떤 식으로 진행되는지 알고 싶다면 썬에서 만든 소스 코드를 확인해 보세요.\\ | ||
| + | %%swap%%메소드는 %%Arrays%% 클래스에 이미 정의되어 있는 구상 메소드입니다. | ||
| + | |||
| + | ===== implementation of Comparable interface ===== | ||
| + | 이제 정렬 알고리즘을 완성하기 위해 **compareTo()**메소드를 구현해보겠습니다. | ||
| + | |||
| + | <code java> | ||
| + | public class Duck implements Comparable{ | ||
| + | | ||
| + | int weight; | ||
| + | |||
| + | | ||
| + | | ||
| + | | ||
| + | } | ||
| + | |||
| + | | ||
| + | | ||
| + | } | ||
| + | |||
| + | | ||
| + | |||
| + | Duck otherDuck = (Duck) object; | ||
| + | |||
| + | | ||
| + | return -1; | ||
| + | }else if(this.weight == otherDuck.weight){ | ||
| + | return 0; | ||
| + | | ||
| + | return 1; | ||
| + | } | ||
| } | } | ||
| } | } | ||
| </ | </ | ||