-
Notifications
You must be signed in to change notification settings - Fork 36
27장 annotations
nephilim edited this page Aug 27, 2012
·
2 revisions
##27.1 Why have annotations?
-
프로그램을 컴파일해서 실행하는 것 외에도 많은 작업들이 있다.
- Scaladoc처럼 문서 자동생성
- 선호하는 스타일로 코드 이쁘게 출력
- 일반적인 오류 검증
- 타입 검증
-
이러한 작업을 메타프로그래밍 도구라고 부른다.
-
스칼라의 철학은 코어언어에서 최소한의 지원만 해서 다양한 메타프로그래밍 도구를 작성할 수 있게 하는 것이다.
##27.2 Syntax of annotations
@deprecated def bigMistake() =
(e: @unchecked) match {
}
- 내부적으로 스칼라는 어노테이션 클래스의 생성자를 호출하는 것처럼 표현한다.
@
를new
롤 대체한다. 대신 어노테이션을 어노테이션의 인자로 쓸 수는 없다.
-
@depreacated
,@deprecated("use NewShinyMethod() instead")
-
@volatile
: 동시성프로그램에서 뮤터블상태를 사용하는 경우 -
@serializable
: 직렬화할 클래스 -
@SerialVersionUID(1234)
: 클래스 현재버전의 시리얼번호 - 자동
getter
,setter
를 위해서@scala.reflect.BeanProperty
제공 -
@tailrec
: 꼬리재귀 최적화함 -
@unchecked
: 패턴매칭에서 예외경우를 검사하지 않음 -
@native
: 스칼라코드대신에 런타임에서 메서드의 구현체를 제공함.
-
@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