[Kotlin] 3-4. 가시성 수식어
가시성 수식어
클래스, 오브젝트, 인터페이스, 생성자, 프로퍼티 및 프로퍼티의 setter는 가시성 수식어를 가질 수 있다
(getter는 항상 프로퍼티와 동일한 가시성을 갖는다)
코틀린에는 private, protected, internal, public의 가시성 수식어 존재 / 기본은 public
패키지
함수, 프로퍼티와 클래스, 오브젝트와 인터페이스는 “최상위”에 선언할 수 있다
예를 들어 패키지에 직접 선언 가능
package foo
fun baz() {}
Class Bar {}
- 가시성 수식어를 명시하지 않으면 기본으로 public사용(모든 곳에서 접근 가능)
- private로 선언하면, 그 선언을 포함한 파일 안에서만 접근 가능
- internal로 선언하면, 같은 모듈에서 접근 가능
- protected는 최상위 선언에 사용할 수 없다
// 파일 이름 : example.kt
package foo
private foo() {} // example.kt 안에서 접근 가능
public var bar: Int = 5 // 모든 곳에서 접근 가능
private set // setter는 example.kt에서만 접근 가능
internal val baz = 6 // 같은 모듈에서 접근 가능
클래스와 인터페이스
클래스에 선언한 멤버에 대해서는 다음과 같다
- private는 오직 클래스 안에서만(그리고 클래스의 모든 멤버에서) 접근 가능
- protected는 private + 하위클래스에서 접근 가능
- internal은 선언한 클래스를 볼 수 있는 모듈 안의 모든 클라이언트가 internal멤버를 볼 수 있다
- public은 선언한 클래스를 볼 수 있는 클라이언트가 public 멤버를 볼 수 있다
주의 : 자바와 달리 코틀린에서 외부 클래스는 내부 클래스의 private멤버를 볼 수 있다
protected멤버를 오버라이딩할 때 가시성을 명시적으로 지정하지 않으면, 오버라이딩한 멤버 또한 protected
open class Outer {
private val a = 1
protected open val b = 2
internal avl c = 3
val d = r // 기본으로 public
protected class Nested {
public val e: Int = 5
}
}
}
class Subclass : Outer() {
// a는 접근 불가
// b, c, d는 접근 가능
// Nested와 e는 접근 가능
override val b = 5
}
class Unrelated(o: Outer) {
// o.a, o.b는 접근 불가
// o.c와 o.d는 접근 가능(같은 모듈)
// Outer.Nested는 접근 불가며, Nested::e 역시 접근 불가
}
생성자
class C private constructor(a: Int) { ... }
위 코드의 생성자는 private이다 / 기본적으로 모든 생성자는 public이며 실질적으로
클래스를 접근할 수 있는 모든 곳에서 생성자에 접근할 수 있다
로컬 선언
로컬 변수, 로컬 함수, 로컬 클래스에는 가시성 수식어를 지정할 수 없다
모듈
internal 가시성 수식어는 같은 모듈에서 멤버에 접근할 수 있음을 의미
더 구체적으로 모듈은 함께 컴파일되는 코틀린 파일 집합
- IntelliJ IDEA 모듈
- 메이븐 프로젝트
- 그레이들 소스 집합
- kotlinc 앤트 태스크를 한 번 호출할 때 컴파일되는 파일 집합