2023-java-study / book-study

북 스터디 기록 레포지토리
0 stars 0 forks source link

[Item 18] ForwardingSet이 Set 인터페이스를 implements 한 이유 #63

Closed gmelon closed 1 year ago

gmelon commented 1 year ago

p.118 에서 ForwardingSet이 Set을 컴포지션으로 사용함에도 Set 인터페이스를 구현하고 있는 이유는 그저 Set이 제공하는 메서드를 빠짐없이 구현하기 위함인가요??

NuhGnod commented 1 year ago

InstrumentedSet에서 ForwarindSet을 상속받고 있는데 이때 InstrumentedSet의 인스턴스의 메소드가 호출되면 결국 ForwarindSet의 메소드가 호출될 것 입니다. 컴포지션 방식에서 인스턴스를 InstrumentedSet<String> set = new InstrumentedSet(new HashSet(16)); 와 같이 생성하는데 이 클래스를 사용하려는 개발자는 당연히 HashSet의 메소드를 사용할 수 있겠거니 하고 set.clear()처럼 코드를 작성하게 될겁니다. 그런데 ForwardingSet에서 이 clear()메소드를 구현하지 않으면 사용 할 수 없게 되므로 이상한 상황이 생기게 됩니다.

그래서 Set의 모든 메소드를 제공해야하는 InstrumentedSet이 개발자의 실수로 구현하지 않은 메소드가 있을 수 있으므로 Set인터페이스의 구현하게 되면IDE에서 에러를 보여줄 뿐 아니라 Compile자체가 안되기 때문에 이런 실수를 방지하려는 목적으로 implement하고 있지 않나 싶습니다. 물론 @Override키워드로 모든 메소드를 재정의 하여도 문제없이 동작 하는 것 같습니다.