제거됨: private[this]와 protected[this]

제거됨: private[this]와 protected[this]

private[this]protected[this] 접근 한정자는 deprecated이며 점진적으로 사라질 예정이에요. 이 한정자들이 무엇이었고, 이제 어떻게 바뀌는지 살펴볼게요.

출처: Scala 3 Reference

본문

private[this]protected[this] 접근 한정자는 deprecated이며 단계적으로 제거될 예정이에요.

이전에는 이 한정자들이 다음 용도로 필요했어요.

  • getter와 setter가 생성되는 것을 피하기 위해
  • private[this] 아래의 코드를 변성 검사(variance check)에서 제외하기 위해. (Scala 2는 protected[this]도 제외했는데, 이는 unsound하다는 게 밝혀져서 제거됐어요.)
  • private[this] val이 클래스 메서드에서 접근되지 않는다면 필드 생성을 피하기 위해

이제 컴파일러는 private 멤버가 this로만 접근된다는 사실을 추론해요. 그런 멤버는 private[this]로 선언된 것처럼 취급됩니다. protected[this]는 대체 없이 제거돼요.

이 변경은 경우에 따라 Scala 프로그램의 의미를 바꿀 수 있어요. private val이 더 이상 반드시 필드를 생성한다고 보장되지 않기 때문이에요. 필드는 다음 조건일 때 생략돼요.

  • valthis로만 접근되고,
  • val이 현재 클래스의 메서드에서 접근되지 않을 때

프로그램이 리플렉션으로 없어진 private 필드에 접근하려 하면 문제가 생길 수 있어요. 권장되는 해결책은 필드를 포함하는 클래스를 한정자로 사용하는 한정된 private으로 선언하는 거예요. 예시:

  class C(x: Int):
    private[C] val field = x + 1
      // [C] needed if `field` is to be accessed through reflection
    val retained = field * field

클래스 파라미터는 보통 객체-private으로 추론되므로, 명시적으로 val이나 var로 선언해 도입한 멤버는 여기서 설명하는 규칙의 적용을 받지 않아요.

특히 다음 필드는 변성 검사에서 제외되지 않아요:

  class C[-T](private val t: T) // error

그리고 위에서 본 private 필드와 달리, 이 필드는 제거되지 않아요:

  class C(private val c: Int)

더 알아보기 (Learn more)