가시성 수정자
가시성 수정자 (Visibility modifiers)
클래스, 객체, 인터페이스, 생성자, 함수는 물론 속성과 그 세터(setter)까지 가시성 수정자(visibility modifier)를 가질 수 있어요. 게터(getter)는 항상 자기 속성과 같은 가시성을 갖습니다.
본문
코틀린에는 네 가지 가시성 수정자가 있어요. private, protected, internal, public이죠. 기본 가시성은 public입니다.
이 페이지에서는 각 수정자가 서로 다른 종류의 선언 스코프에 어떻게 적용되는지 배워볼게요.
패키지 (Packages)
함수, 속성, 클래스, 객체, 인터페이스는 패키지 안의 "최상위(top-level)" 수준에 바로 선언할 수 있어요.
// file name: example.kt
package foo
fun baz() { ... }
class Bar { ... }
- 가시성 수정자를 쓰지 않으면 기본적으로
public이 사용되어, 내 선언이 어디에서나 보이게 됩니다. - 선언을
private로 표시하면, 그 선언이 들어 있는 파일 안에서만 보여요. internal로 표시하면, 같은 모듈 안의 어디에서나 보입니다.protected수정자는 최상위 선언에는 사용할 수 없습니다.
다른 패키지에 있는 보이는 최상위 선언을 쓰려면 import 해야 합니다.
예시를 볼게요.
// file name: example.kt
package foo
private fun foo() { ... } // visible inside example.kt
public var bar: Int = 5 // property is visible everywhere
private set // setter is visible only in example.kt
internal val baz = 6 // visible inside the same module
클래스 멤버 (Class members)
클래스 안에 선언된 멤버에 대해서는:
private는 멤버가 이 클래스 안에서만(모든 멤버 포함) 보인다는 뜻입니다.protected는private로 표시된 것과 같은 가시성을 가지지만, 서브클래스에서도 보인다는 뜻이에요.internal는 이 모듈 안에서 선언한 클래스를 보는 어떤 클라이언트든 그internal멤버를 본다는 뜻입니다.public은 선언한 클래스를 보는 어떤 클라이언트든 그public멤버를 본다는 뜻이에요.
코틀린에서 바깥 클래스는 자기 내부(inner) 클래스의 private 멤버를 보지 못합니다.
protected 또는 internal 멤버를 오버라이드하면서 가시성을 명시하지 않으면, 오버라이드하는 멤버도 원본과 같은 가시성을 가져요.
예시를 보겠습니다.
open class Outer {
private val a = 1
protected open val b = 2
internal open val c = 3
val d = 4 // public by default
protected class Nested {
public val e: Int = 5
}
}
class Subclass : Outer() {
// a is not visible
// b, c and d are visible
// Nested and e are visible
override val b = 5 // 'b' is protected
override val c = 7 // 'c' is internal
}
class Unrelated(o: Outer) {
// o.a, o.b are not visible
// o.c and o.d are visible (same module)
// Outer.Nested is not visible, and Nested::e is not visible either
}
생성자 (Constructors)
클래스의 주 생성자 가시성을 지정하려면 아래 문법을 사용해요. 명시적인 constructor 키워드를 추가해야 합니다.
class C private constructor(a: Int) { ... }
여기서 생성자는 private예요. 기본적으로 모든 생성자는 public인데, 이는 실질적으로 클래스가 보이는 모든 곳에서 생성자가 보인다는 뜻입니다(즉, internal 클래스의 생성자는 같은 모듈 안에서만 보임). sealed 클래스의 생성자는 기본적으로 protected예요. 자세한 내용은 Sealed classes를 참고하세요.
지역 선언 (Local declarations)
지역 변수, 함수, 클래스는 가시성 수정자를 가질 수 없습니다.
모듈 (Modules)
internal 가시성 수정자는 멤버가 같은 모듈 안에서 보인다는 뜻입니다. 더 정확히 말하면, 모듈은 함께 컴파일되는 코틀린 파일들의 집합이에요. 예를 들어:
- IntelliJ IDEA 모듈.
- Maven 프로젝트.
- Gradle 소스 세트(
test소스 세트가main의 internal 선언에 접근할 수 있다는 예외는 있음).