JavaBookStudy / JavaBook

책읽기 스터디
https://javabookstudy.github.io/
Apache License 2.0
19 stars 2 forks source link

Item3. 23p "함수와 같은 무상태(stateless) 객체" #3

Closed taxol1203 closed 3 years ago

taxol1203 commented 3 years ago

싱글턴의 전형적인 예로 함수와 같은 무상태 객체 가 있다고 합니다.
무상태 객체 에 대해 검색을 해보니, 인스턴스 변수가 없는 객체라고 합니다.

public class Car {
    void Car() {
    System.out.println("I'm car!");
    }
}

와 같이 인스턴스 변수가 없거나,

public class Car {
  static final String CAR_MESSAGE = "I'm car!";

  void Car() {
    System.out.println(CAR_MESSAGE);
  }
}

와 같이 컴파일 타임에 정의되어있고 변경되지 않는 상수를 가지는 경우도 Stateless Object라고 지칭할 수 있습니다.

다시 질문으로 돌아가서, 함수 객체는 (객체가 함수처럼 동작)하는 것이라고 알고 있는데, 다음 예와 같이 인스턴스 변수를 가지는 함수 객체도 있는 것을 알 수 있습니다.

class MoneyBox
{
    int total;
public:
    MoneyBox(int _init = 0) : total(_init) { }
    int operator()(int money)
    {
        total += money;
        return total;
    }
};

책에서 설명하는 함수라는 것은 제가 예시로 제시한 함수 객체와 다른 뜻일까요?

kjsu0209 commented 3 years ago

같은 뜻입니다. Item 24에서 함수가 익명클래스와 함께 언급되는데, 작은 함수 객체를 만드는데 익명 클래스가 사용된다고 하니 책에서도 함수 객체를 의미하는 것 같습니다.

대표적으로 쓰이는 함수 객체는 Comparator입니다. Comparator가 compare를 메서드로 갖고 있는 함수 객체이며, 람다로 익명클래스를 만들 수도 있습니다. 클래스 내부에 메서드가 하나뿐이라 (또는 클래스 목적이 메서드 수행이라서) 람다로 구현했을 때 누락되는 메서드가 없기 때문입니다.

int comparator = new Comparator<T>(){
    public int compare(<T> o1, <T> o2){
       ....
   }
}