클래스를 작성할 때 외부에서 숨겨야 하는 속성이나 기능
private
외부에서 접근할 수 없다, 클래스 내에서만 접근 가능하다. public
어디서든 접근이 가능하다. (기본값)protected
외부에서 접근할 수 없으나 하위 상속 요소에서는 가능 internal
같은 정의의 모듈 내부에서는 접근이 가능. 지시자는 변수명, 메서드, 클래스 앞에서 선언한다.
주 생성자에 가시성 지시자가 사용되면 constructor키워드는 생략할 수 없다.
private
fun main()
{
PrivateClass().access() //공개 메서드 사용 가능
}
private class PrivateClass
{
private var i = 1
private fun privateFunc()
{
i += 1
}
fun access() //public 메서드 안에 private 함수 호출
{
privateFunc()
}
}
class OtherClass
{
//val pc = PrivateClass() //불가
//pc.i //불가
//pc.privateFunc() //불가
fun test()
{
val pc = PrivateClass() //동일 파일내에 있는 메서드 안에서는 접근 가능.
pc.access() //공개 메서드 사용 가능
}
}
protected
fun main()
{
val base = Base()
// base.i //호출 불가
// base.protectedFunc() //호출 불가
//공개 메서드는 호출 가능,
//공개 메서드 안에 있는 protected메서드도 함께 호출, 안 보이는 것 뿐
base.access()
val derived = Derived()
derived.j = 3 // 상속 받은 클래스 호출 및 수정 가능
derived.derivedFunc()
}
open class Base
{
protected var i = 1
protected fun protectedFunc()
{
i += 1
println(i)
}
fun access()
{
protectedFunc()
}
}
class Derived : Base()
{
var j = 1 + i //protected여서 가능 private는 불가
fun derivedFunc() : Int
{
protectedFunc() //protected여서 가능 private는 불가
return i
}
}
class Other
{
fun other()
{
val base = Base()
// base.i = 3 //protected var i = 1 호출 불가능, Base에 상속되어 있는 클래스가 아니기 때문이다.
}
}