공부 내용


1-5 정보 은닉 캡슐화

정보 은닉 캡슐화

캡슐화(Encapsulation)

[가시성 지시자] <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 역시 접근 불가
}

1-6 클래스와 관계: 연관, 의존, 집합, 구성

관계

관계(Relationship)