접근 제한자: 클래스의 맴버에 지정된 접근 제한자에 따라 외부에서 사용 여부가 결정
: Kotlin에서 정의되는 클래스, 인터페이스, 메서드, 프로퍼티는 모두 접근 제한자(Visibility Modifiers)를 가질 수 있다.
함수형 언어라는 특성 때문에 코틀린은 기존 객체지향에서 접근 제한자의 기준으로 삼았던 패키지(디렉토리) 대신에 모듈 개념이 도입되었다.
internal 접근 제한자로 모듈 간에 접근을 제한할 수 있다.
Q. 그럼 Kotlin은 패키지,디렉토리 단위로는 접근 제한을 못하고, 모듈 단위로만 가능한 건가?
Q. 기본적으로 아무런 접근 제한자도 지정하지 않으면 어떻게 동작하나?
※ 모듈
Kotlin에서 모듈이란 한 번에 같이 컴파일되는 모든 파일을 말한다.
안드로이드를 예로 든다면 하나의 앱이 하나의 모듈이 될 수 있다.
또한 라이브러리도 하나의 모듈이다.
a. 접근 제한자의 종류
ⅰ. private: 다른 파일에서 접근할 수 없다.
ⅱ. protected: private와 같으나 상속 관계에서 자식 클래스가 접근할 수 있다.
ⅲ. internal: 같은 모듈에 있는 파일만 접근할 수 있다.
ⅳ. public: 제한 없이 모든 파일에서 접근할 수 있다.
b. 접근 제한자의 적용
open class Parent { // 디폴트 생성자
private val privateVal = 1
protected open val protectedVal = 2
internal val internalVal = 3
val defaultVal = 4
}
자식 클래스에서 부모 클래스를 상속받고 테스트한다.
class Child: Parent() {
fun callVariables() {
// privateVal은 호출이 안 됩니다. (1)
Log.d("Modifier", "protected 변수의 값은 ${protectedVal}"). // (2)
Log.d("Modifier", "internal 변수의 값은 ${internalVal}"). // (3)
Log.d("Modifier", "기본 제한자 변수 defaultVal의 값은 ${defaultVal}"). // (4)
}
}
(1) privateVal은 private 멤버이기 때문에 접근할 수 없습니다.
(2) protected 멤버 protectedVal은 상속 관계이므로 접근할 수 있습니다.
(3) internal 멤버 internalVal은 동일한 모듈이므로 접근할 수 있습니다.
(4) 접근 제한자가 없는 멤버 defaultVal에는 public이 적용되어 접근할 수 있습니다.
class Stranger {
fun callVariables() {
val parent = Parent() // 생성자 호출
Log.d("Modifier", "internal 변수의 값은 ${parent.internalVal}입니다.") // 클래스 사용
Log.d("Modifier", "public 변수의 값은 ${parent.defaultVal}입니다.")
}
}