타입의 와일드카드 인자

타입의 와일드카드 인자 (Wildcard Arguments in Types)

타입에서 와일드카드 인자의 문법이 _에서 ?로 바뀌고 있어요. 예를 들면 이런 형태예요.

List[?]
Map[? <: AnyRef, ? >: Null]

출처: Scala 3 Reference

본문

동기 (Motivation)

우리가 바라는 것은 밑줄 문법 _를 익명 타입 파라미터(anonymous type parameter)를 나타내는 데 쓰는 거예요. 그러면 값 파라미터 목록에서의 뜻과 일치하게 되죠. 즉 f(_)가 람다 x => f(x)의 약칭인 것처럼, 앞으로 C[_]는 타입 람다 [X] =>> C[X]의 약칭이 될 거예요. 이러면 더 높은 종류의 타입(higher-kinded types)을 쓰기 훨씬 편해져요.

또한 F[_]가 타입 파라미터로 쓰일 때는 F가 타입 생성자임을 뜻하고, 타입으로 쓰일 때는 와일드카드(즉 실존적/existential 타입)임을 뜻하던 골칫거리도 없어져요. 앞으로는 F[_]가 어디에 쓰이든 같은 뜻을 나타낼 거예요.

와일드카드 타입의 대체 문법으로 ?를 선택했는데, Java의 문법과 맞아떨어지기 때문이에요.

마이그레이션 전략 (Migration Strategy)

새 방식으로의 마이그레이션은 복잡해요. 특히 kind projector 컴파일러 플러그인이 여전히 반대 규약을 쓰기 때문인데, 거기서 ?는 와일드카드가 아니라 파라미터 자리 표시자(placeholder)를 뜻해요. 다행히 kind projector는 ?의 대체 문법으로 *를 추가했어요.

다음 조치로 단계별 마이그레이션이 가능해져요.

  • 스칼라 3 초기 버전에서는 와일드카드 이름으로 _?가 모두 합법이에요.
  • 스칼라 3.4에서 _는 와일드카드 이름으로 쓰일 때 ?를 선호하도록 deprecated될 거예요. 하나를 다른 쪽으로 다시 쓰는 -rewrite 옵션을 쓸 수 있어요.
  • 나중의 어떤 시점에 _의 의미는 와일드카드에서 타입 파라미터의 자리 표시자로 바뀔 거예요.
  • 일부 deprecation 경고는 이미 -source future 설정 아래에서 사용할 수 있어요.

kind-projector를 쓰는 코드베이스의 전환을 부드럽게 하기 위해, 명령줄 옵션 -Ykind-projector 아래에서 다음 조치를 채택해요.

  • 스칼라 3.0에서 *는 타입 파라미터 자리 표시자로 쓸 수 있어요.
  • 스칼라 3.2에서 *_를 선호하도록 deprecated될 거예요. 하나를 다른 쪽으로 다시 쓰는 -rewrite 옵션을 쓸 수 있어요.
  • 스칼라 3.3에서 *는 다시 제거되고, 모든 타입 파라미터 자리 표시자는 _로 표현돼요.

이 규칙 덕분에 kind projector 플러그인을 쓰는 스칼라 2와, 컴파일러 옵션 -Ykind-projector를 쓰는 스칼라 3.0–3.2 사이의 크로스 빌드가 가능해져요.

_를 타입 파라미터 자리 표시자로 쓰는 문법으로 한 번에 전환하고 싶은 사용자를 위한 마이그레이션 경로도 있어요. -Ykind-projector:underscores 옵션을 쓰면 스칼라 3이 _를 타입 파라미터 자리 표시자로 간주하고, ?만 와일드카드 문법으로 남겨요.

_를 자리 표시자로 쓰면서 오래된 스칼라 2 소스와 크로스 컴파일하려면, 옵션 -Xsource:3 -P:kind-projector:underscore-placeholders를 최신 kind-projector(0.13 이상) 및 최신 스칼라 2 버전(2.13.5 이상, 2.12.14 이상)과 함께 써야 해요.