ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [스칼라] 애노테이션(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() = {}

    컴파일러에게 스칼라 코드가 아닌 런타임에 주어지는 메서드라는것을 알려준다. 이 때 본문은 사용되지 않지만 빈 괄호를 명시해야한다.

    댓글

Designed by Tistory.