음.. 엇그제 포스팅한 '필드'이지만 '메서드'처럼 사용됩니다. 의 내용이 여기서 나오네요 'ㅅ';

콜백함수 어쩌고 했는데 이걸 '함수 객체' 라고 부르는군요

이런 형태의 디자인 패턴을 전략 패턴 이라고 부릅니다. 상황에 따라서 메인이 되는 함수를 갈아끼우는 형태 라고 이해하면 될거같습니다만. 이것도 말이좀 어렵네요

책에서도 설명되어 있지만 가장 쉽게 접할 수 있는 함수 객체는 Comparator 이라는겁니다.
항목 12. Comparable 인터페이스의 구현을 고려하자. 에서 나왔던 Comparable 인터페이스의 친구같은놈입니다.
Comparable 인터페이스는 그 객체의 유일한 비교방법을 정의하는거지만 상황에따라서 정렬하는 방법이 바뀔수도 있습니다.

예를들어 x,y 좌표를 표현하는 포인터가 있는데 이걸 x축을 기준으로 y축은 관계없이 정렬하라.
또는 x축을 기준으로 정렬하는데 x좌표가 같다면 y를 기준으로 정렬하라.
라던지 원점으로부터 거리가 가까운 순서대로 정렬하라. 같은 여러가지 정렬방법이 있을수 있습니다. 이것을 Comparable 로 구현하는건 그냥 불가능합니다.

그렇다면 어떤방법이 있느냐?
Comparator 객체를 상황에 맞게 각각 만드는겁니다.

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Point {
	double x, y;
	
	/**
	 * y 좌표는 무시하고 x좌표로만 정렬
	 */
	static Comparator<Point> cmp1 = new Comparator<Point>() {
		@Override
		public int compare(Point o1, Point o2) {
			return Double.compare(o1.x, o2.x);
		}
	};

	/**
	 * 원점으로부터 거리가 가까운 순서대로 정렬
	 */
	static Comparator<Point> cmp2 = new Comparator<Point>() {
		@Override
		public int compare(Point o1, Point o2) {
			double dist1 = Math.sqrt(o1.x * o1.x + o1.y * o1.y);
			double dist2 = Math.sqrt(o2.x * o2.x + o2.y * o2.y);
			return Double.compare(dist1, dist2);
		}
	};
	public static void main(String[] args) {
		List<Point> list=new ArrayList<Point>();
		//cmp1을 이용해서 list를 정렬
		Collections.sort(list, Point.cmp1);
		//cmp2를 이용해서 list를 정렬
		Collections.sort(list, Point.cmp2);
	}
}
이런식으로 이용할수 있습니다. 종류별로 Comparator을 만들어둔다음 상황(전략)에 맞게 사용하는거죠
Arrays에도 Comparator을 이용한 sort가 있습니다.
sort이외에도 binarySearch 라는 메소드도 있고 코드를 작성하다가도 객체를 비교할때 사용하면됩니다.

그리고 '필드'이지만 '메서드'처럼 사용됩니다.  에서 예를 든것처럼 C++의 함수포인터나 Obj-C 의 셀렉터를 대신해서 사용이 되니까 C++코드를 자바로 바꿀때 유용하게 사용할수 있습니다.

Comparator의 compare메소드 작성은
http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html#compare(T, T) 를 참조하면 됩니다.
또는 항목 12. Comparable 인터페이스의 구현을 고려하자. 의 compareTo 작성할때 this가 첫번째 객체, other이 두번째 객체 이니까 참고하시면 되곘습니다.
Posted by 동적할당
: