캡슐화(Encapsulation)
private
: 외부에서 접근할 수 없음public
: 어디서든 접근이 가능(기본값)protected
: 외부에서 접근할 수 없으나 하위 상속 요소에서는 가능internal
: 같은 정의의 모듈 내부에서는 접근이 가능[가시성 지시자] <val | var> 전역 변수명
[가시성 지시자] fun 함수명() { ... }
[가시성 지시자] [특정 키워드] class 클래스명 [가시성 지시자] constructor(매개변수들) {
[가시성 지시자] constructor() { ... }
[가시성 지시자] 프로퍼티들
[가시성 지시자] 메서드들
}
private
가시성 테스트
private class PrivateClass {
private var i = 1
private fun privateFunc() {
i += 1 // 접근 허용
}
fun access() {
privateFunc() // 접근 허용
}
}
class OtherClass {
val opc = PrivateClass() // 불가 - 프로퍼티 opc는 private이 되어야 함
fun test() {
val pc = PrivateClass() // 생성 가능
}
}
fun main() {
val pc = PrivateClass() // 생성 가능
pc.i // 접근 불가
pc.privateFunc() // 접근 불가 -> pc.access()
}
fun TopFunction() {
val tpc = PrivateClass() // 생성 가능
}
protected 가시성 테스트
open class Base { // 최상위 선언 클래스에는 protected를 사용할 수 없음
protected var i = 1
protected fun protectedFunc() {
i += 1 // 접근 허용
}
fun access() {
protectedFunc() // 접근 허용
}
protected class Nested // 내부 클래스에는 지시자 허용
}
class Derived : Base() {
fun test(base: Base): Int {
protectedFunc() // Base 클래스의 메서드 접근 가능
return i // Base 클래스의 프로퍼티 접근 가능
}
}
fun main() {
val base = Base() // 생성 가능
base.i // 접근 불가
base.protectedFunc() // 접근 불가
base.access() // 접근 가능
}
internal 가시성 테스트
internal class InternalClass {
internal var i = 1
internal fun icFunc() [
i += 1 // 접근 허용
}
fun access() {
icFunc() // 접근 허용
}
}
class Other {
internal val ic = InternalClass() // 프로퍼티 지정시 internal로 맞춰야 한다.
fun test() {
ic.i // 접근 허용
ic.icFunc() // 접근 허용
}
}
fun main() {
val mic = InternalClass() // 생성 가능
mic.i // 접근 허용
mic.icFunc() // 접근 허용
}
가시성 지시자와 클래스의 관계
open class Base {
// 이 클래스에서는 a, b, c, d, e 접근 가능
private val a = 1
protected open val b = 2
internal val c = 3
val d = 4 // 가시성 지시자 기본값은 public
protected class Nested {
// 이 클래스에서는 a, b, c, d, e, f 접근 가능
public val e: Int = 5 // public 생략 가능
private val f: Int = 6
}
}
class Derived : Base() {
// 이 클래스에서는 b, c, d, e 접근 가능
override val b = 5 // Base의 'b'는 오버라이딩 됨 - 상위와 같은 protected 지시자
}
class Other(base: Base) {
// base.a와 base.b는 접근 불가
// base.c와 base.d는 접근 가능(같은 모듈 안에 있으므로)
// Base.Nested는 접근 불가, Nested::e 역시 접근 불가
}
관계
관계(Relationship)