2023-java-study / book-study

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

[Item 41] 마커 인터페이스의 적용 범위 제한 #123

Open gmelon opened 1 year ago

gmelon commented 1 year ago

p.249 - p.250 에서 마커 인터페이스는 ‘마킹하고 싶은 클래스에서만 그 인터페이스를 구현’ 하면 되기 때문에 적용 대상을 세밀하게 지정할 수 없는 마커 애노테이션보다 낫다. 라고 되어 있는데, 처음에는 이건 마커 인터페이스를 적용할수 있는 대상을 애초에 제한한게 아니고 마커 애노테이션도 그냥 필요한 클래스에만 달게 되면 동일한 것 아닌가 라고 생각이 들었습니다.

비슷한 이유로 p.250에 Set은 Collection의 하위 타입에만 적용할 수 있으며 이 부분도 Set 인터페이스가 Collection 인터페이스를 확장하고 있는건 맞지만 그렇다고 Set을 구현할 수 있는 클래스에 제약이 걸리는건 아니지 않나? 라고 생각했는데

조금 더 생각해보니 마커 인터페이스 Set을 구현하고자 하는 클래스는 자동으로 Collection 의 하위 클래스가 되니깐 결국 Collection 하위로 마커 인터페이스의 적용 범위를 제한하는 셈인가? 싶더라구요. 그래서 책에서 말한 '마커 인터페이스는 적용 범위를 더 세밀하게 지정할 수 있다'고 한 것도 이런 의미에서 한 이야기인 것 같은데 다른 분들은 어떻게 이해하셨는지 궁금합니다.

ssstopeun commented 1 year ago

저도 똑같이 이해한 것 같아요. 우선 마커 인터페이스를 사용하면 클래스라는 것이 보장되니까 적용대상이 클래스나 인터페이스다 라는 의미로 좁혀지게 됩니다. 그리고 Set을 마커 인터페이스로 두고 생각해보면 이 Set을 구현한 클래스나 인터페이스는 Collection의 하위 클래스이다. 는 범위 제한이 추가로 생기게 된다는 의미로 이해했습니다.

@StudentAnnotation
public class AClass implements Person {
}

이런식으로 StudentAnnotation 마커 애너테이션을 만들어서 사용한다고 했을 때 Person클래스의 하위 클래스라는 것을 명시해주고 싶으면 다음과 같이 추가로 범위를 지정해주어야하고 StudentAnnotation을 사용할 대상은 클래스 뿐 아니라 모든 타입에 달릴 수 있습니다.

// 마커 인터페이스 Student
public interface Student extends Person {
}

public class BClass implements Student{
}

하지만 마커 인터페이스를 사용하면 Student를 구현한 것은 클래스나 인터페이스라는 것이 특정되고 Person의 하위타입이라는 것 까지 함께 제한할 수 있습니다!