27장 annotations - codeport/scala GitHub Wiki

##27.1 Why have annotations?

  • 프로그램을 컴파일해서 실행하는 것 외에도 많은 작업들이 있다.

    1. Scaladoc처럼 문서 자동생성
    2. 선호하는 스타일로 코드 이쁘게 출력
    3. 일반적인 오류 검증
    4. 타입 검증
  • 이러한 작업을 메타프로그래밍 도구라고 부른다.

  • 스칼라의 철학은 코어언어에서 최소한의 지원만 해서 다양한 메타프로그래밍 도구를 작성할 수 있게 하는 것이다.

##27.2 Syntax of annotations

@deprecated def bigMistake() =
(e: @unchecked) match {
}
  • 내부적으로 스칼라는 어노테이션 클래스의 생성자를 호출하는 것처럼 표현한다. @new롤 대체한다. 대신 어노테이션을 어노테이션의 인자로 쓸 수는 없다.

27.3 Standard annotations

  • @depreacated, @deprecated("use NewShinyMethod() instead")
  • @volatile : 동시성프로그램에서 뮤터블상태를 사용하는 경우
  • @serializable : 직렬화할 클래스
  • @SerialVersionUID(1234) : 클래스 현재버전의 시리얼번호
  • 자동 getter, setter를 위해서 @scala.reflect.BeanProperty 제공
  • @tailrec : 꼬리재귀 최적화함
  • @unchecked : 패턴매칭에서 예외경우를 검사하지 않음
  • @native : 스칼라코드대신에 런타임에서 메서드의 구현체를 제공함.

offline 모임 발표 요약

  • @volatile

    • 발표자: kingori
    • javap를 이용해 volatile은 키워드이며 bytecode에서도 volatile 말고는 차이가 없다
    • multithread 환경에서 동시에 변수에 접근할 때 느리지만 안전한 방법을 제공
    • volatile을 사용할 경우 메모리를 접근 영역(thread) 별로 복사하여 유지하는 효욜적인 메커니즘을 포기하고 유일한 위치에 값을 유지
  • @serializable

    • 발표자: zeide
    • @serializable은 deprecated 되었다
      • Trait Serializable
      • 의견: 코드 내에서 serializable 유무를 판단해야 하는 경우 등 annotation 형태는 문제의 소지가 있어 보임. 게다가 컴파일을 해야 @serializable을 알 수 있음.
      • Scala 사이트의 관련 글를 참고
  • @scala.reflect.BeanProperty

    • 발표자: hwany
    • Java 스타일을 getter/setter를 추가
      • 기존의 scala의 getter/setter는 유지됨
  • @tailrec :

    • 발표자: nephilim

    • "꼬리 재귀가 일어나야 함"을 컴파일러에게 알려줌

    • 주의: compiler 입장에서 분석해야 tailrec 여부를 판별할 수 있다.

    • scalac ReadAndSay.scala를 실행하면 다음과 같은 ERROR가 발생한다.(warning이 아님)

        "ReadAndSay.scala:22: error: could not optimize @tailrec annotated method lookAndSay: it contains a recursive call not in tail position
        case x~:xs => x::(list.size-xs.size)::lookAndSay(xs)     //co-ons
        ^
        one error found"
      
    • 참고: tailcall을 발생하지 않게 하는 옵션도 있다

      • -g:notailcall
  • @unchecked:

    • 발표자: daclouds

    • 패턴매칭에서 전체 case를 모두 다루는지 검사하지 않음

    • 다음과 같이 type의 위치에 @unchecked가 사용됨

        (e:@unchecked) match {
        	//...
        }
      
  • @throws

    • 발표자: anarcher
    • 무려 ikki 사용!
    • Scala의 기본 예외는 Runtime 예외
    • @throws를 사용하면 Java의 명시적 예외선언을 만들어 줌
    • quiz 형태로 진행됨 3:3