Menu
Coddy logo textTech

가시성 변경자

Coddy Kotlin 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 8번째.

캡슐화는 클래스가 데이터의 사용 방식을 제어하는 것을 의미합니다. 가시성 변경자는 누가 멤버를 볼 수 있는지 결정합니다. private는 클래스 외부의 모든 곳에서 멤버를 숨기므로, 클래스 자체의 메서드만 접근할 수 있습니다.

class Account {
    private var balance = 0

    fun deposit(amount: Int) {
        if (amount > 0) balance += amount
    }

    fun report() = "balance: $balance"
}

main 내부:

val a = Account()
a.deposit(50)
a.deposit(-999)
println(a.report())
// a.balance = 1_000_000    // 오류: 'balance'에 접근할 수 없음: private입니다

출력:

balance: 50

Kotlin에는 네 가지 한정자가 있습니다. 한정자를 지정하지 않으면 선언은 public이며 어디에서나 볼 수 있습니다:

public      // 기본: 모든 곳에서 보임
internal    // 같은 모듈(앱 또는 라이브러리)에서 보임
protected   // 클래스와 그 하위 클래스에서 보임
private     // 클래스 내부에서 보임(또는 최상위 선언의 경우 파일)

비공개 헬퍼 함수는 공개 인터페이스를 작게 유지합니다. 호출자는 클래스가 무엇을 하는지는 보지만, 어떻게 하는지는 보지 못합니다:

class Password(private val text: String) {
    val isStrong: Boolean
        get() = hasDigit() && text.length >= 8

    private fun hasDigit() = text.any { it.isDigit() }
}

main 내부:

println(Password("secret123").isStrong)
println(Password("short1").isStrong)

출력:

true
false

생성자 속성에도 한정자를 사용할 수 있습니다. private val은 외부 코드에서 읽을 수 없는 값을 저장합니다. 데이터를 숨기면 클래스가 모든 변경 사항을 확인하고 자체 규칙을 유지할 수 있습니다.

class Locker(private val code: String) {
    private val items = mutableListOf<String>()
    fun store(item: String, code: String): Boolean {
        if (code != this.code) return false
        items.add(item)
        return true
    }
}
challenge icon

챌린지

쉬움

Locker(private val code: String) 클래스를 완성하세요. items 목록은 private입니다. store(item, code)은 코드가 일치할 때만 항목을 추가하고 추가되었는지를 반환합니다. open(code)은 코드가 일치하면 항목을 , 로 결합한 결과(또는 empty)를 반환하고, 그렇지 않으면 wrong code를 반환합니다.

제공된 코드는 보관함의 코드를 읽은 다음 put <code> <item> 또는 open <code> 명령을 읽습니다. 각 put에 대해 stored 또는 denied를 출력하고, 각 open의 결과를 출력합니다.

코드는 Locker.kt에 작성하세요. Main.kt에는 제공된 입력/출력 코드가 들어 있으며 수정할 수 없습니다.

직접 해보기

fun main() {
    // 제공된 입/출력 코드: 그대로 유지하세요
    val input = generateSequence(::readLine).toList()
    val locker = Locker(input[0])
    for (cmd in input.drop(1)) {
        val p = cmd.split(" ")
        if (p[0] == "put") println(if (locker.store(p[2], p[1])) "stored" else "denied")
        else println(locker.open(p[1]))
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: Kotlin 플레이그라운드