프리뷰 정의
프리뷰 정의 (Preview Definitions)
새로운 Scala 언어 기능이나 표준 라이브러리 API는 처음에는 experimental(실험)로 소개되다가, 완전히 구현되고 SIP의 승인을 받으면 preview(프리뷰) 기능이 돼요. 프리뷰는 다음 마이너 릴리스에서 표준화하기로 보장되어 있지만, 컴파일러 팀이 커뮤니티 피드백에 따라 작고, 어쩌면 바이너리 비호환인 변경을 도입할 수 있게 해 줍니다.
본문
새로운 Scala 언어 기능이나 표준 라이브러리 API는 처음에는 experimental로 도입되지만, 완전히 구현되고 SIP가 받아들이면 preview 기능이 될 수 있어요. Preview 언어 기능과 API는 다음 Scala 마이너 릴리스에서 표준화되도록 보장되지만, 컴파일러 팀이 커뮤니티 피드백에 기반해 작고 어쩌면 바이너리 비호환인 변경을 도입할 수 있게 해 줍니다. 이것들은 바이너리 호환성 파괴 가능성을 받아들일 수 있는 얼리 어답터들이 사용할 수 있어요. 예를 들어 프리뷰 기능은 어떤 내부 도구나 애플리케이션에서 쓰일 수 있죠. 반면 프리뷰 기능은 공개적으로 배포되는 라이브러리에서는 권장되지 않아요.
사용자는 -preview 플래그로 컴파일해서 프리뷰 기능과 정의에 접근을 허용할 수 있어요. 이 플래그는 모든 프리뷰 기능과 정의를 켜요. 프리뷰 기능의 일부 하위 집합만 켜는 체계는 없어요.
experimental 기능에 비해 프리뷰 기능의 가장 큰 차이는 비-바이러스적(non-viral) 동작이에요. 프리뷰 모드(-preview 플래그 사용)로 컴파일된 정의는 그 자체가 프리뷰 정의로 표시되지 않아요. 이 동작 덕분에, 프리뷰로 표시된 API나 기능을 직접 참조하지 않는 한, 명시적으로 프리뷰 모드를 켜지 않고도 다른 컴파일 유닛에서 프리뷰 기능을 전이적으로(transitively) 사용할 수 있어요.
@preview 어노테이션은 현재 프리뷰 모드에서 사용 가능한 Scala 3 표준 라이브러리 API를 표시하는 데 쓰여요. @preview의 규칙은 접근, 서브타이핑, 재정의, 오버로딩에 관해서는 @experimental과 유사해요. 이 모든 것은 프리뷰 모드를 켠 컴파일 유닛에서만 수행될 수 있죠.
//> using options -preview
package scala.stdlib
import scala.annotation.internal.preview
@preview def previewFeature: Unit = ()
// Can be used in non-preview scope
def usePreviewFeature = previewFeature
def usePreviewFeatureTransitively = scala.stdlib.usePreviewFeature
def usePreviewFeatureDirectly = scala.stdlib.previewFeature // error - referring to preview definition outside preview scope