제거됨: private[this]와 protected[this]
제거됨: private[this]와 protected[this]
private[this]와 protected[this] 접근 한정자는 deprecated이며 점진적으로 사라질 예정이에요. 이 한정자들이 무엇이었고, 이제 어떻게 바뀌는지 살펴볼게요.
본문
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이 더 이상 반드시 필드를 생성한다고 보장되지 않기 때문이에요. 필드는 다음 조건일 때 생략돼요.
val이this로만 접근되고,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)