티스토리 뷰

오랜만에 읽고 시작하자

https://www.baeldung.com/java-marker-interfaces

 

마커 인터페이스는 메서드나 상수 없이 런타임에 정보를 제공하기 위해 사용한다

컴파일러나 JVM이 그 정보를 바탕으로 특정 작업을 수행한다

 

이렇게만 들으면 이걸 어따 써? 싶은 생각이 드는데

실제적인 예로 마커 애노테이션의 대표로는 JUnit에서 사용하는 @Test,

마커 인터페이스는 Serializable, Closeable, Cloneable 등이 있다

 

마커 인터페이스의 유용성은 특정 작업을 수행하는 메서드 시그니처를 제대로 선언했을 때만 의미가 있다

ObjectOutputStream의 writeObject 메서드는 Object 타입의 인자를 받을 수 있게 작성되었다

런타임에 터질 에러를 컴파일 타임 에러로 옮겨오기 위한 Type-Safety가 지켜지지 않은 형태다

Serializable 타입으로 받았다면 컴파일 타임에 직렬화할 수 없는 타입은 넘기지도 못 했을 것이다

 

 

 

https://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html

 

writeObject 메서드는 당연히 Serialiazble을 구현한 Object가 넘어올 것이라 가정한다

ObjectOuputStream의 문서를 살펴보면 설계 의도를 설명해놨다

Only objects that support the java.io.Serializable interface can be written to streams.

이 가정 때문에 사용자는 메서드 인자로 아무 Object나 넘기고 직렬화 실패에 당황하게 된다

해결법은 자바 문서를 찾아가서 위의 전제 조건을 파악하는 것이다

잘못된 설계의 예로써 매개변수에 타입을 명확하게 주되, 유연성을 고려하여 가능한 구체적인 인터페이스로 받자

 

애노테이션은 java5부터 등장해 메타 정보로 코드를 건드리지 않고 다양한 정보를 넘겨줄 수 있다

다만 적용 범위를 지정하는데 한계가 있는데 개별적으로 붙일 수가 없고 뭉탱이에 붙여야 한다

즉 A 클래스에만 적용시키고 싶은데 선언이 CLASS로 되어 있어 아무 클래스에나 붙일 수 있게 된다

Java9부터 MODULE이 들어왔고, Java16부터 RECORD_COMPONENT가 들어와 새로 사용할 수 있다

 

 

애노테이션을 적극 활용하는 스프링 같은 프레임워크에서는 아무래도 마커 애노테이션을 쓸 일이 많을테고

지정해놓은 타입의 인자를 받아 특정 작업을 수행하는 메서드를 사용할 때 마커 인터페이스를 사용하자

'Java > Effective Java' 카테고리의 다른 글

[Item43] 메서드 참조를 써야하는가  (0) 2022.03.30
[Item42] 람다 쓰자!  (0) 2022.03.28
[Item40] 긴가 민가 할 땐 붙여라  (0) 2022.03.24
[Item39] Lombok 알아보기  (0) 2022.03.22
[Item38] Enum 확장 시켜버리기  (0) 2022.03.21
댓글
링크
글 보관함
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Total
Today
Yesterday