brunch

You can make anything
by writing

C.S.Lewis

by 이승현 Apr 10. 2018

클래스와 인터페이스

#21 전략을 표현할 때 함수 객체를 이용하자

Effective Java - 클래스와 인터페이스


#21 전략을 표현할 때 함수 객체를 이용하자


우선 제목을 보면 "전략", "함수 객체"라는 단어들이 나옵니다.


여기서 말하는 전략과 함수 객체에 대해 알아보겠습니다.




함수 객체


함수 객체는 자바에서는 생소한 개념인데, 다른 언어의 함수 포인터와 같이 특정 함수의 호출을 저장하거나 전달하는 객체를 말합니다.


자바에서는 함수 포인터를 제공하지 않습니다.

객체 참조를 이용해서 유사하게 만들 수 있는데, 아래 코드를 보면 외부에 하나의 메서드를 제공하는 클래스입니다.


#01 StringLengthComparator class


StringLengthComparator 클래스는 두 개의 문자열(String 객체)을 인자로 받아 길이를 통해 비교하는 단일 메서드(compare)를 외부에 제공하고 있습니다.

이 메서드(compare)는 길이를 기준으로 문자열을 정렬하는 comparator이고, 여기서 StringLengthComparator 객체의 참조가 이 comparator에 대한 "함수 포인터" 역할을 합니다.

그리고 이 클래스의 인스턴스를 함수 객체(function object)라고 합니다.




StringLengthComparator 클래스는 필드가 없기 때문에 상태가 없습니다.

따라서 모든 인스턴스는 기능적으로 동일해서 불필요한 객체 생성 비용을 줄이기 위해 싱글톤이어야 합니다.


#02 Singleton class




전략 패턴


operation 메서드에서 두 문자열을 비교하기 위해 서는 StringLengthComparator 타입의 매개변수를 전달받아야 합니다.

만약 operation 메서드에서 글자 길이가 아닌 다른 방법(전략)으로 두 문자열을 비교하려면 코드 수정이 불가피하게 됩니다.


#03 StringLengthComparator 매개 변수


이때 전략 패턴을 이용하면 됩니다.

다양한 전략 중에 현재 상황에 적합한 전략을 선택하게 하는 패턴입니다.

 

#04 https://ko.wikipedia.org/wiki/%EC%A0%84%EB%9E%B5_%ED%8C%A8%ED%84%B4




아래 코드를 보면 제네릭(generic)을 이용한 전략 인터페이스입니다.


#05 전략 인터페이스


그리고 이 Comparator 인터페이스를 구현하면 다양한 전략(구체 전략)들을 만들 수 있습니다.


#06 전략들


operation 메서드에서는 Comparator라는 전략 인터페이스 타입의 매개변수를 받아, 상황에 따라 적합한 전략을 선택할 수 있습니다.


#07 전략 패턴




거꾸로 말하면 함수 객체는 전략 패턴을 구현할 때 쓰입니다.

만약 이 함수 객체(구체 전략)가 단 한 번만 이용될 때는 익명 클래스로 선언하고, 반복적으로 쓰일 때는 클래스 내부에 private static 멤버 클래스로 선언할 수도 있습니다.




매거진의 이전글 클래스와 인터페이스
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari