가시성 한정자
클래스, 객체, 인터페이스, 생성자, 함수뿐만 아니라 프로퍼티와 해당 세터도 가시성 한정자를 가질 수 있습니다. 게터는 항상 프로퍼티와 동일한 가시성을 가집니다.
Kotlin에는 private, protected, internal, public의 네 가지 가시성 한정자가 있습니다. 기본 가시성은 public입니다.
이 페이지에서는 한정자가 다양한 선언 범위 유형에 어떻게 적용되는지 알아봅니다.
패키지
함수, 프로퍼티, 클래스, 객체, 인터페이스는 패키지 내에 직접 "최상위 수준"으로 선언될 수 있습니다.
// file name: example.kt
package foo
fun baz() { ... }
class Bar { ... }- 가시성 한정자를 사용하지 않으면
public이 기본적으로 사용되며, 이는 선언이 어디서든 가시적임을 의미합니다. - 선언을
private으로 표시하면 해당 선언을 포함하는 파일 내부에서만 가시적입니다. internal로 표시하면 동일한 모듈 내 어디서든 가시적입니다.protected한정자는 최상위 수준 선언에는 사용할 수 없습니다.
다른 패키지에서 가시적인 최상위 수준 선언을 사용하려면 이를 임포트해야 합니다.
예시:
// 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클래스 멤버
클래스 내부에 선언된 멤버의 경우:
private은 멤버가 해당 클래스 내부에서만(모든 멤버 포함) 가시적임을 의미합니다.protected는 멤버가private으로 표시된 것과 동일한 가시성을 가지지만, 서브클래스에서도 가시적임을 의미합니다.internal은 선언 클래스를 보는 이 모듈 내의 모든 클라이언트가 해당internal멤버를 볼 수 있음을 의미합니다.public은 선언 클래스를 보는 모든 클라이언트가 해당public멤버를 볼 수 있음을 의미합니다.
Kotlin에서 외부 클래스는 내부 클래스의
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
}생성자
클래스의 주 생성자 가시성을 지정하려면 다음 구문을 사용합니다.
명시적인
constructor키워드를 추가해야 합니다.
class C private constructor(a: Int) { ... }여기서는 생성자가 private입니다. 기본적으로 모든 생성자는 public이며, 이는 클래스가 가시적인 모든 곳에서 생성자가 가시적임을 의미합니다(이는 internal 클래스의 생성자가 동일한 모듈 내에서만 가시적임을 의미합니다).
봉인된 클래스의 경우 생성자는 기본적으로 protected입니다. 더 자세한 내용은 봉인된 클래스를 참조하세요.
지역 선언
지역 변수, 함수, 클래스는 가시성 한정자를 가질 수 없습니다.
모듈
internal 가시성 한정자는 멤버가 동일한 모듈 내에서 가시적임을 의미합니다. 더 구체적으로, 모듈은 함께 컴파일된 Kotlin 파일 집합을 의미합니다. 예를 들어:
- IntelliJ IDEA 모듈.
- Maven 프로젝트.
- Gradle 소스 세트(
test소스 세트가main의 내부 선언에 접근할 수 있다는 예외 포함). <kotlinc>Ant 태스크의 한 번의 호출로 컴파일된 파일 집합.
