Effective-Tilinkle / effective-java

0 stars 3 forks source link

[Item14] 내부 인스턴스를 반환하는 뷰 메서드 #14

Closed pjhsk113 closed 1 year ago

pjhsk113 commented 1 year ago

뷰 메서드의 예제가 있을까요? 찾아봐도 잘 안나오네요..ㅠㅠ

그리고 또 이해안가는 부분이 있습니다.

내부 인스턴스를 반환하는 뷰 메서드를 제공하면 된다.  
이렇게 하면 바깥 클래스에 우리가 원하는 compareTo 메서드를 구현해넣을 수 있다.
클라이언트는 필요에 따라 바깥 클래스의 인스턴스를 필드 안에 담긴 원래 클래스의 인스턴스로 다룰 수도 있고 말이다.

뭔말일까요 ?.?.....🤔

makga87 commented 1 year ago

뷰 메서드의 예제가 있을까요? 찾아봐도 잘 안나오네요..ㅠㅠ

그리고 또 이해안가는 부분이 있습니다.

내부 인스턴스를 반환하는 뷰 메서드를 제공하면 된다.  
이렇게 하면 바깥 클래스에 우리가 원하는 compareTo 메서드를 구현해넣을 수 있다.
클라이언트는 필요에 따라 바깥 클래스의 인스턴스를 필드 안에 담긴 원래 클래스의 인스턴스로 다룰 수도 있고 말이다.

뭔말일까요 ?.?.....🤔

앞뒤 문맥으로 보았을 때, 인스턴스를 통으로 반환하는 getter를 말하는 것 같습니다.

KimJeongHoon3 commented 1 year ago
public class ColorPoint{
    private final Point point;
    private final Color color;

    public ColorPoint(int x, int y, Color color) {
        point = new Point(x,y);
        this.color = Objects.requireNonNull(color);
    }

    public Point asPoint() { // 이렇게 Point를 반환해주는 뷰를 만들어서 따로 비교하도록 해준다
        return point;
    }

    @Override
    public boolean equals(Object o) { // equals는 ColorPoint만 비교할수 있도록!
        if (!(o instanceof ColorPoint)) 
            return false;
        ColorPoint cp = (ColorPoint) o;
        return cp.point.equals(point) && cp.color.equals(color);
    }

}

item10에서도 설명이 나왔어서 예제를 같이 첨부드려보았습니다. 형근님께서 말씀하신대로 내부 가지고있는 인스턴스 필드를 반환해주는게 뷰라고 하더라구요. 또 다른 예제로 HashMap의 keySet 메서드도 뷰 메서드라고 이펙자바에서 한번 언급했었던것 같아요


이렇게 하면 바깥 클래스에 우리가 원하는 compareTo 메서드를 구현해넣을 수 있다.

이 맥락이 원래 헷갈렷다가 장호님이 질문주셔서 좀 더 생각을 많이 하게된 부분인데, 잘 살펴보니 ColorPoint에서 뷰 메서드를 활용함으로써 오롯이 ColorPoint 의 독자적인 equals만을 갖게되는 맥락을 item10에서 언급하였는데, 이와 동일한 것 같습니다. 즉, 바깥클래스(여기서는 PointColor)에서 compareTo 를 아래와 같이 사용하게됨을 이야기하는것 같습니다.

@Override
public int compareTo(ColorPoint o) {                    
    int result = this.point.compareTo(o.point);
    if (result ==0 ) {
      result = this.color.compareTo(o.color); 
    }
    return  result;
}

클라이언트는 필요에 따라 바깥 클래스의 인스턴스를 필드 안에 담긴 원래 클래스의 인스턴스로 다룰 수도 있고 말이다.

요 맥락은 ColorPoint라는 바깥클래스에서 asPoint 라는 뷰 메서드를 사용하여 Point 인스턴스를 가져올수 있음을 이야기하는 것 같습니당


결론

무튼 결국 item 10과 상당히 유사한 설명인 것 같긴한데, ColorPoint 인스턴스에서 equals 비교시 ColorPoint만을 대상으로 진행하고, 내부 인스턴스 필드로 있는 Point가 필요하다면 asPoint라는 뷰 메서드를 사용하여 우회로 Point를 따로 equals를 사용하는것처럼, compareTo 또한 ColorPoint의 순서를 비교해야한다면 compareTo 메서드에는 ColorPoint만을 대상으로 진행하고, 동일하게 Point의 비교가 필요하다면, asPoint를 사용해서 compareTo를 사용하라고 이야기하는것 같습니다.

pjhsk113 commented 1 year ago

@makga87 뷰 메서드라는 키워드가 익숙치 않아서 뭔가 내부 인스턴스를 반환하는 다른 방법이 있나..? 라고 생각했었는데 그냥 getter를 말하는거였군여..!!! 답변 감사드립니다. 🙇🏻‍♂️🙇🏻‍♂️🙇🏻‍♂️🙇🏻‍♂️

@KimJeongHoon3 킹정훈,,! 정말 좋은 설명이네여😄 바로 이해가 쏙쏙 되어버렸습니다! 답변 감사드립니다. 🙇🏻‍♂️🙇🏻‍♂️🙇🏻‍♂️🙇🏻‍♂️