스칼라 액세스 수정자


Scala 액세스 수정자는 비공개, 보호 및 공개를 포함하여 기본적으로 Java와 동일합니다.

액세스 한정자를 지정하지 않으면 Scala 객체의 액세스 수준은 기본적으로 공개입니다.

스칼라의 비공개 한정자는 Java보다 더 엄격합니다. 중첩 클래스의 경우 외부 클래스는 중첩 클래스의 비공개 멤버에도 액세스할 수 없습니다.


비공개 멤버

는 비공개 키워드로 수정됩니다. 이 태그가 있는 멤버는 멤버 정의가 포함된 클래스나 객체 내부에서만 표시됩니다. 내부 클래스에도 동일한 규칙이 적용됩니다.

class Outer{
    class Inner{
    private def f(){println("f")}
    class InnerMost{
        f() // 正确
        }
    }
    (new Inner).f() //错误
}

(new Inner).f() f가 Inner에서 private으로 선언되어 있고 액세스가 Inner 클래스 내에 있지 않기 때문에 액세스가 불법입니다.

그러나 InnerMost에서 f에 액세스하는 데는 문제가 없습니다. 이 액세스는 Inner 클래스에 포함되어 있기 때문입니다.

외부 클래스가 내부 클래스의 비공개 멤버에 액세스할 수 있도록 허용하므로 Java에서는 두 가지 유형의 액세스가 모두 허용됩니다.


보호된 멤버

스칼라에서는 보호된 멤버에 대한 액세스가 Java보다 더 엄격합니다. 왜냐하면 멤버가 정의된 클래스의 하위 클래스에서만 보호된 멤버에 액세스할 수 있기 때문입니다. Java에서 protected 키워드로 수정된 멤버는 해당 멤버를 정의하는 클래스의 하위 클래스뿐만 아니라 동일한 패키지의 다른 클래스에서도 액세스할 수 있습니다.

package p{
class Super{
    protected def f() {println("f")}
    }
	class Sub extends Super{
	    f()
	}
	class Other{
		(new Super).f() //错误
	}
}

위의 예에서 f는 Super에서 보호된다고 선언되고 Sub는 Super의 하위 클래스이기 때문에 Sub 클래스는 f에 액세스하는 데 문제가 없습니다. 대조적으로, other는 Super로부터 상속받지 않기 때문에 Other의 f에 대한 액세스는 허용되지 않습니다. Other와 Sub가 동일한 패키지에 있기 때문에 후자는 Java에서도 인식됩니다.


공개 멤버

스칼라에서는 수정자를 지정하지 않으면 기본적으로 공개로 설정됩니다. 이러한 회원은 어디에서나 액세스할 수 있습니다.

class Outer {
   class Inner {
      def f() { println("f") }
      class InnerMost {
         f() // 正确
      }
   }
   (new Inner).f() // 正确因为 f() 是 public
}

범위 보호

Scala에서는 한정자를 사용하여 액세스 수정자를 강조할 수 있습니다. 형식은 다음과 같습니다.

private[x] 

或 

protected[x]

여기서 x는 특정 패키지, 클래스 또는 싱글톤 개체를 나타냅니다. private[x]로 작성하면 "이 멤버는 [...]의 클래스나 [...]의 패키지 클래스 및 해당 컴패니언 객체를 제외한 다른 모든 클래스에 대해 비공개입니다.

이 기술은 여러 패키지에 걸쳐 있는 대규모 프로젝트에서 매우 유용합니다. 이를 통해 프로젝트의 여러 하위 패키지에 표시되지만 프로젝트 외부의 클라이언트에게는 항상 표시되지 않는 항목을 정의할 수 있습니다. >위의 예에서 Navigator 클래스는 비공개 [bobsrockets]로 표시됩니다. 이는 이 클래스가 bobsrockets 패키지에 포함된 모든 클래스와 객체에 표시된다는 의미입니다.

예를 들어 Navigator는 Vehicle에서 표시됩니다. 객체 Vehicle은 실행 패키지에 포함되어 있고 실행 패키지는 bobsrockets에 있으므로 액세스가 허용됩니다. 반면 bobsrockets 패키지 외부의 모든 코드는 Navigator 클래스에 액세스할 수 없습니다.