•
클래스, 객체, 인터페이스, 생성자, 함수, 프로퍼티, 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 작업을 한 번 호출하여 컴파일된 파일 세트