[코틀린기초] 25. 가시성 지시자
캡슐화
클래스를 작성할 때 외부에서 숨겨야 하는 속성이나 기능
가시성 지시자를 통해 외부 접근 범위를 결정할 수 있음
- private: 외부에서 접근 불가
- public: 어디서든 접근 가능 (기본값)
- protected: 하위 상속요소에서만 접근 가능
- internal: 같은 정의의 모듈 내부에서는 접근 가능 (자바의 패키지를 대체)
클래스의 주생성자에 가시성 지시자를 쓰려면 constructor 키워드를 생략할 수 없음!
private class PrivateTest{
private var i = 1
private fun privateFunc(){ // Private
i+=1
println(i)
}
fun access(){ // Public
privateFunc()
}
}
class OtherClass{
// val pc = PrivateTest() // 접근 불가.
private val pc = PrivateTest() // 이건 가능하다
fun test(){
val pc = PrivateTest() // 생성 가능
pc.i // 접근 불가
pc.access() // 접근 가능
}
}
fun main(){
val pc = PrivateTest() // 탑레벨 함수에서는 private 없이도 접근 가능
//pc.i = 3 // 접근 불가
//pc.privateFunc() // 접근 불가
pc.access()
}
internal은 같은 모듈이면 접근이 가능하다. (파일이 다르더라도)
그러나 패키지 명이 달라지면 패키지를 import하여 사용 가능하다.
//한 파일 내에서는 internal은 public이랑 거의 같다
internal class InternalClass{
internal var i = 1
internal fun icFunc(){
i+=1 //접근 가능
}
fun access(){
icFunc() // 접근 가능
}
}
class Other{
internal val ic = InternalClass() //internal 키워드를 없애면 public이 되어 에러발생!
fun test(){
ic.i
ic.icFunc()
}
}
fun main(){
val mic = InternalClass()
mic.i
mic.icFunc()
}