닭발개발

[헤드퍼스트 디자인패턴] 25일차. 335-345pg 본문

책책책 책을 읽읍시다‼ ver.개발/[ 헤드퍼스트 디자인패턴 ]

[헤드퍼스트 디자인패턴] 25일차. 335-345pg

D269 2023. 5. 31. 01:24
728x90

25일차

헤드퍼스트 디자인패턴 [5주차_월요일]

335-345pg

요약

CHAPTER 08. 알고리즘 캡슐화하기 (feat. 템플릿 메소드 패턴)

  • 서브클래스에서 언제든 필요할 때마다 알고리즘을 가져다가 쓸 수 있도록 캡슐화한다.

[ 자바 API 속 템플릿 메소드 패턴 ]

템플릿 메소드 패턴은 정말 많이 쓰이는 패턴이다. 왜냐하면 프레임워크를 만드는데에 아주 좋은 도구임. 프레임워크로 작업이 처리되는 방식을 제어하면서도 프레임워크에서 처리하는 알고리즘의 각 단계를 사용자가 맘대로 지정할 수 있다.

 

 

[ 템플릿 메소드로 정렬하는 법 (Arrays 클래스 속 템플릿 메소드) ]

  • mergeSort() 메소드 : 템플릿 메소드
private static void mergeSort(Object src[], Object dest[], int low, int high, int off) {
	// 많은 코드
	for(int i = low; i < high; i++ {
		// 템플릿 메소드를 완성하려면 compareTo() 메소드를 구현해야만 한다.
		for(int j = i; j > low && ((Comparable)dest[j-1]).compareTo((Comparable)dest[j] > 0; j--) {
			// Arrays 클래스에 이미 정의되어있는 구상 메소드
			swap(dest, j, j-1);
		}
	}

}
  • 오리를 정렬할 때 compareTo() 메소드를 써야한다.
    • sort()만 쓰면 sort() 자체가 특정 슈퍼클래스에 정의되어 있는 게 아니라서 sort() 메소드가 내가 compareTo() 메소드를 구현했는지를 알아낼 수 있는 방법이 필요함.
    • 이 문제를 해결하기 위해 Comparable 인터페이스 도입.

[ JFrame 속 템플릿 메소드 ]

  • JFrame : 가장 기본적인 스윙 컨테이너
  • JFrame의 update() 알고리즘은 paint() 메소드를 호출한다. 기본적으로 paint()는 아무일 도 안한다. 그냥 후크 메소드임

[ AbstractList ]

  • ArrayList, LinkedList 같은 자바의 리스트 컬렉션은 리스트에서 필요한 기능을 구현해 주는 AbstractList 클래스를 확장한다.
  • AbstractList에는 get()과 size() 추상 메소드에 의존하는 subList() 템플릿 메소드가 있다.
  • 따라서 AbstractList를 확장해서 나만의 리스트를 만들 때는 이 2가지 메소드를 구현해야한다.

[ 전략패턴 vs 템플릿 메소드 패턴 ]

  • 템플릿 메소드 패턴 : 알고리즘의 개요를 정의하는 일
  • 전략패턴 : 클라이언트에게 객체 구성으로 알고리즘을 구현할지 말지 선택할 기회를 준다. 객체 구성을 사용하니 더 유연함.
728x90
반응형