[Kotlin Docs] 가시성 제어자

코틀린 공식 사이트의 문서를 번역하고 공부한 내용입니다.
글 내용에 오,의역이 존재할 수 있고 공부하면서 잘못알고 있는 개념이 존재할 수 있습니다!

원문 링크: Classes and objects - Visibility modifiers

가시성 제어자

코틀린에서 클래스, Object, 인터페이스, 생성자, 함수, 프로퍼티 및 접근자는 모두 가시성 제어자를 가질 수 있다. 접근자 중 getter는 항상 프로퍼티와 동일한 가시성을 갖는다.

코틀린에는 private, protected, internal, public의 4가지 가시성 제어자가 존재한다. 기본 가시성은 public이다.

자바의 기본 가시성은 패키지 전용이다. 따라서 멤버를 공개 멤버로 정의하고 싶으면 명시적으로 public을 붙여줘야 했다.
코틀린의 클래스 멤버(지역 선언이 아닌)는 기본 가시성이 public이다. 또한 코틀린에는 자바의 기본 가시성처럼 패키지 내부에 해당하는 가시성이 없다.

최상위 선언

코틀린에서는 클래스, Object, 인터페이스와 더불어 함수와 변수도 최상위 수준에 선언할 수 있었다.

  • 최상위 선언의 기본 가시성은 public이다.
  • private: 해당 소스 파일내에서만 접근 가능하다.
  • internal: 동일 모듈 내에서만 접근 가능하다.
  • protected: 최상위 선언의 접근 제어자로 사용할 수 없다.
    왜? protected는 클래스 계층 구조에 대한 가시성을 설정하는데, 최상위 선언은 이 클래스 계층 구조에 들어갈 수 없다.

접근 가능한 다른 패키지에 선언된 최상위 선언을 사용하기 위해선 import 해야 한다.

클래스

클래스 멤버 가시성

  • private: 클래스 내부에서만 접근 가능하다. 클래스의 다른 멤버에서도 접근 가능하다.
  • protected: private와 동일한 가시성에 추가로 멤버가 속한 클래스의 모든 하위 클래스에서도 접근 가능하다.
  • internal: 해당 멤버가 속한 클래스가 포함된 컴파일 모듈 내부에서 접근 가능하다.
  • public: 공개 멤버이다.

코틀린에서는 inner 클래스의 private 멤버에 외부 클래스에서 접근할 수 없다.

open class Outer {
    private val a = 1
    protected open val b = 2
    internal open val c = 3
    val d = 4  // public

    protected class Nested {
        public val e: Int = 5
    }
}

class Subclass : Outer() {
		// b, c, d, Nested, e 접근 가능
		// a 접근 불가능

    override val b = 5   // protected
    override val c = 7   // internal
}

class Unrelated(o: Outer) {
		// o.c, o.d 접근 가능 -> 동일 모듈
		// o.a, o.b 접근 불가능, Outer.Nested, Nested::e 접근 불가능
}

protected 또는 internal 멤버를 재정의하고 가시성 제어자를 명시적으로 지정하지 않으면 상위 구현과 같은 가시성을 갖는다.

생성자

클래스의 기본 생성자에 가시성을 명시적으로 지정하려는 경우 constructor 키워드 앞에 가시성 제어자를 붙여야 한다. 모든 기본 생성자는 public 이다.

클래스에 접근 가능한 모든 곳에서 생성자를 호출할 수 있기 때문에 생성자는 클래스의 가시성을 따라가는 것이 기본적이다.

지역 선언

지역 변수, 지역 함수, 지역 클래스는 가시성 제어자를 가질 수 없다.

모듈

internal 가시성 제어자는 동일한 모듈 내에서 접근 가능함을 의미한다.

모듈: 함께 컴파일된 코틀린 소스 파일의 집합

좋은 웹페이지 즐겨찾기