given 임포트하기

given 임포트하기

현재 스코프 안에 있는 given이 정확히 어디서 온 건지 헷갈릴 때가 있어요. 이걸 더 명확하게 하기 위해, given 인스턴스를 가져오는 특별한 형태의 import 문이 쓰여요. 기본 형태는 이 예제에서 바로 확인할 수 있어요.

출처: Scala 3 Book

본문

object A:
  class TC
  given tc: TC = ???
  def f(using TC) = ???

object B:
  import A.*       // import all non-given members
  import A.given   // import the given instance

위 코드에서 객체 Bimport A.* 절은 A의 모든 멤버를 가져오는데, given 인스턴스인 tc는 제외해요. 반대로 두 번째 import A.given은 그 given 인스턴스만 가져옵니다. 이 두 import 절은 하나로 합칠 수도 있어요.

object B:
  import A.{given, *}

와일드카드 선택자 *는 given이나 확장(extension)을 제외한 모든 정의를 스코프로 가져와요. 반면 given 선택자는 확장으로 만들어진 것을 포함한 모든 given을 스코프로 데려오죠.

이 규칙에는 두 가지 큰 장점이 있어요.

  • 현재 스코프에 있는 given이 어디에서 오는지 더 분명해져요. 특히, 다른 와일드카드 임포트의 긴 목록 속에 given 임포트를 숨겨 버릴 수 없어요.
  • 다른 것은 아무것도 임포트하지 않고 given만 전부 가져올 수 있어요. given은 익명(anonymous)일 수 있어서 이름을 붙여 임포트하는 일반적인 방식이 실용적이지 않기 때문에, 이 점이 중요해요.

더 알아보기

  • "Packaging and Imports" 챕터에서 "import given" 문법의 더 많은 예제를 볼 수 있어요 (Scala 3 Book).