ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java & Kotlin] Java와 Kotlin의 접근 제한자 (가시 제한자)
    Mhwan's Study/JAVA & Kotlin 2021. 8. 13. 22:39

    흔히들 접근제한자라고 부르는 것은 kotlin에서는 맞지 않습니다. Java와 kotlin은 그 차이가 있기 때문에 Kotlin에서도 Visibility Modifiers(가시 제한자)로 명명하고 있습니다.

    # Java's Access Modifiers

    • public : 어떤 클래스에서든 접근 가능
    • protected : 동일 패키지의 클래스 + 외부 패키지에 있는 해당 클래스를 상속 받은 클래스에서 접근 가능
    • default : 동일 패키지의 클래스에서만 접근 가능
    • private : 해당 클래스 내에서만 접근 가능

    public > protected > default > private으로 범위가 제한됩니다. 따라서 protected의 경우 private와 default에서 접근 하는 범위가 가능하면서 외부 패키지에 있는 해당 클래스를 상속 받은 클래스가 추가 되는 것입니다. (같은 패키지에 있는 상속받은 클래스를 따로 적지 않았는데, 이는 이미 default에서 동일 패키지의 모든 클래스에서 접근 가능한 것을 포함되어 가능하므로 protected에는 추가적으로 적지 않았습니다.)

    Java는 클래스 단위이다보니 변수나 함수를 클래스 외부에는 정의할 수 없습니다. 그래서 네이밍도 class 내에 접근을 한다는 의미에서 접근 제한자로 명명한 것 같습니다. Kotlin은 Java와 다릅니다. Kotlin은 파일 단위로 변수나 함수를 클래스 외부에도 따로 정의(top-level에 정의) 할 수 있습니다. 그래서 코틀린 공식 문서를 보면 두 종류로 제한자를 설명하고 있습니다.

     

    # Kotlin Package Visibility Modifiers

    이는 패키지내 즉, 하나의 코틀린 파일의 top-level에 정의하는 변수, 함수, 클래스에 대한 속성입니다.

    • public : 어떤 파일에서든 접근 가능 (아무것도 없을때 기본)
    • internal : 같은 모듈 내 어떤 파일에서든 접근 가능
    • protected : 사용 불가능 (파일 범위에 대한 속성이므로 상속이 불가능합니다.)
    • private : 오직 파일 안에서만 접근 가능

    그리고 우리가 Java처럼 클래스에 대한 가시 제한자도 있습니다.

     

    # Kotlin Class Visibility Modifiers

    이는 클래스 내의 변수, 함수 등에 해당하는 가시 제한자입니다. (Java와 비슷한 개념)

    • public : 어디서든 해당 class를 접근한다면 가져올 수 있습니다.
    • internal : 같은 모듈 내에서 해당 class를 접근하면 가져올 수 있습니다. (다른 모듈에서라면 보이지 않음)
    • protected : 해당 클래스 내에서 접근 가능 + 해당 클래스의 자식 클래스에서 접근 가능
    • private : 해당 클래스 내에서만 접근 가능

    보시다시피 public > internal > protected > private 순입니다. 그리고 왜 코틀린에서 가시제한자라고 네이밍을 붙였을까 생각해보면 Java처럼 클래스에 소속되어 있는 것을 접근한다기 보다는 어떤 파일, 어떤 클래스에서 해당 변수가 보이는지 여부를 말하기 때문이라 생각할 수 있습니다.

    internal에서 얘기하는 '모듈'은 함께 컴파일되는 코틀린 파일의 집합을 말합니다. 즉, 우리가 intellij나 android studio에서 프로젝트를 만들때 생기는 것이 하나의 모듈이라 생각하면 됩니다. 

    그리고 Kotlin과 Java는 외부 클래스에서 내부 클래스의 멤버를 접근 여부가 다릅니다.

    • Kotlin에서는 외부 클래스에서 내부 클래스의 private 멤버에 접근할 수 없습니다.
    • Java에서는 외부 클래스에서 내부 클래스의 private 멤버에 접근 가능합니다.

     

    참고 : 코틀린 공식문서 (https://kotlinlang.org/docs/visibility-modifiers.html#constructors)

    댓글

Designed by Mhwan.