Search

Visibility Modifiers

클래스, 객체, 인터페이스, 생성자, 함수, 프로퍼티, setter는 가시성 수정자를 가질 수 있다.
getter는 항상 프로퍼티와 동일한 가시성을 갖는다.
public, private, protected, internal 네 가지 가시성 수정자가 있다.
기본 가시성은 public 이다.

패키지

함수, 프로퍼티, 클래스, 객체, 인터페이스는 패키지 내부의 최상위에서 직접 선언될 수 있다.
// file name: example.kt package foo fun baz() { ... } class Bar { ... }
Kotlin
복사
가시성 수정자를 사용하지 않으면 기본적으로 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
Kotlin
복사

클래스 멤버

private 은 멤버가 이 클래스 내부에서만 표시된다는 것을 의미한다.
protected 는 멤버가 private 인 것과 동일한 가시성을 갖지만 하위 클래스에서도 볼 수 있음을 의미한다.
internal 은 같은 모듈 안에 있는 모든 클라이언트가 선언된 클래스의 내부 멤버를 볼 수 있음을 의미한다.
public 은 선언된 클래스를 보는 모든 클라이언트가 해당 클래스의 멤버를 볼 수 있음을 의미한다.
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 }
Kotlin
복사
protected 또는 internal 멤버를 오버라이딩할 때 가시성을 명시적으로 지정하지 않으면 오버라이딩하는 멤버도 원본 멤버와 동일한 가시성을 갖는다.
외부 클래스는 내부 클래스의 private 멤버를 볼 수 없다.

생성자

생성자의 가시성을 지정하려면 명확한 constructor 키워드를 추가해야한다.
기본적으로 모든 생성자는 public 이며 클래스가 보이는 모든 곳에서 볼 수 있다.
internal 생성자는 같은 모듈 내에서만 볼 수 있다.
sealed 클래스에서 생성자는 기본적으로 protected 이다.
class C private constructor(a: Int) { ... }
Kotlin
복사

지역 선언

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

모듈

internal 가시성 수정자는 멤버가 동일한 모듈 내에서 표시됨을 의미한다.
모듈은 함께 컴파일된 kotlin 파일 세트이다.
intellij idea 모듈
maven 프로젝트
gradle 소스 세트 (test 소스 세트가 main 내부 선언에 엑세스할 수 있다)
<kotlinc> ant 작업을 한 번 호출하여 컴파일된 파일 세트