가시성 제한자
- 가시성 제한자를 가질 수 있음 : 클래스, 오브젝트, 인터페이스, 생성자, 함수, 프로퍼티, Setter
- Getter는 항상 프로퍼티와 같은 가시성을 가짐
private
,protected
,internal
,public
(기본)
패키지
- 함수, 프로퍼티, 클래스, 오브젝트, 인터페이스는 "최상위 레벨", 즉 패키지 내부에 직접 선언 가능
// file name: example.kt
package foo
fun baz() {}
class Bar {}
public
: 모든 곳에서 접근 가능private
: 해당 선언이 포함된 파일에서만 접근 가능internal
: 같은 모듈 안에서 접근 가능protected
: 최상위 레벨 선언은 불가능
클래스와 인터페이스
클래스 내부에 선언된 멤버의 경우
private
: 클래스 내부에서만 접근 가능protected
: private 와 동일하며 하위 클래스에서만 접근 가능internal
: 선언한 클래스에 접근할 수 있는 모듈내의 클라이언트에서 internal 멤버 접근 가능public
: 선언한 클래스에 접근할 수 있는 클라이언트에서 public 멤버 접근 가능
Java 유저 주의사항 : 외부 클래스는 Kotlin 내부 클래스의 private 멤버를 볼 수 없다
protected
멤버를 오버라이딩할 경우 명시적으로 가시성 제한자를 지정하지 않는 경우,protected
가시성을 가진다
open class Outer {
private val a = 1
protected open val b = 2
internal val c = 3
val d = 4 // 기본으로 public
protected class Nested {
public val e: Int = 5
}
}
class Subclass : Outer() {
// a 접근 불가능
// b, c 와 d 접근 가능
// Nested 와 e 접근 가
override val b = 5 // 'b' 는 protected
}
class Unrelated(o: Outer) {
// o.a, o.b 접근 불가능
// o.c (같은 모듈일 경우)와 o.d 접근 가능
// Outer.Nested 접근 불가능, Nested::e 접근 불가능
}
생성자
- 생성자에 가시성을 지정할 경우, 명시적으로 constructor 키워드를 추가해야한다
class C private constructor(a: Int) { ... }
로컬 선언
로컬 변수, 함수, 클래스에는 가시성 제한자를 지정할 수 없다
모듈
멤버가 동일한 모듈에서 접근 가능하다는 의미. 즉, 모듈은 같이 컴파일된 Kotlin 파일의 세트이다
- Intellij IDEA 모듈
- Maven 혹은 Gradle 프로젝트
- 1번의 호출로 컴파일된 일련의 파일 Ant Task