-
[스칼라] 애노테이션(Annotation)스칼라 2022. 3. 2. 18:45
Programming in scala 4th edition 27장
1. 애노테이션 문법
애노테이션은 모든 선언이나 정의, 표현식, 타입에 적용 가능하다.
@deprecated def deprecatedMethod(): Unit = { }
애노테이션은 메서드, val, var, class, object, trait 등 모든 선언이나 정의에 사용 가능하다. 위의 예에서는 메서드에 사용했다.
sealed class Super() case class A() extends Super case class B() extends Super def seeUnchecked(instance: Super): Unit = (instance: @unchecked) match { case A() => println("A") } seeUnchecked(new A())
위의 예는 표현식에 애노테이션을 적용한 것을 보여준다.
일반적인 애노테이션은 아래와 같이 사용된다.
@annotation(arg1, arg2, ...)
애노테이션은 반드시 클래스가 있어야한다. 보다시피 이 클래스에 인자를 넘겨줄 수도 있다. 내부적으로 애노테이션은 애노테이션 클래스에 대해서 생성자를 호출하는것 처럼 다룬다. @를 new로 바꿔서 사용할 수도 있다는 뜻이다. 하지만 애노테이션을 다른 애노테이션의 인자로 넘길때 @annotation1(@annotation2) def ... 처럼 사용하지는 못한다. @annotation1(new annotation2) def.. 같은 형태로 활용해야 한다.
2. 표준 애노테이션
사용 금지
@deprecated def bigMistake() @deprecated( "This method will be removed. use OtherMethod()." ) def bigMistake()
더이상 사용하지 않을 예정이거나 잘못 만들어진 메소드에 표기해두면 이 메서드를 호출할때 워닝이 뜬다.
volatile 필드
@volatile val someVariable: Int = 10
여러 스레드에서 접근 가능한 변수를 선언한다.
이진 직렬화
@SerialVersionUID(1234) class A { val userId: String @transient val password: String }
객체를 저장하거나 전송할때 직렬화를 하게 되는데 SerialVersionUID 애노테이션은 이 클래스들의 변경을 구분하도록 하는데 사용한다. transient애노테이션은 직렬화 시 가려져야할 필드를 표기하는데 사용된다.
자동 get, set 메서드
스칼라자체는 get, set메서드가 필요 없지만 다른 플랫폼이나 라이브러리는 필드에 get, set 메서드가 제공되어야 하는 경우가 있다.
@scala.reflect.BeanProperty
필드에 BeanProperty 애너테이션을 붙이면 변수 이름이 variable일 경우 getVariable, setVariable메서드가 자동으로 생성된다.
Tailrec
@Tailrec
꼬리 재귀 함수 최적화를 적용하기 위한 애노테이션이다.
Unchecked
패턴 매치 시 컴파일러가 모든 경우를 다루지 않는다는 경고를 띄우지 않게 한다.
native
@native def bigCountdown() = {}
컴파일러에게 스칼라 코드가 아닌 런타임에 주어지는 메서드라는것을 알려준다. 이 때 본문은 사용되지 않지만 빈 괄호를 명시해야한다.
'스칼라' 카테고리의 다른 글
[스칼라] 익스트랙터(extractor) (0) 2022.03.02 [스칼라] 컬렉션 자세히 보기 (0) 2022.02.28 [스칼라] 리스트 구현 (0) 2022.02.27 [스칼라] 암시적 변환과 암시적 파라미터 (implicit) (0) 2022.02.26 [스칼라] 추상 멤버 (0) 2022.02.25