Menu
Coddy logo textTech

private 세터

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

코드 외부에서는 속성을 읽기만 하고 변경하지 않아야 하는 경우가 많습니다. private set은 getter를 public으로 유지하고 setter만 private으로 만듭니다:

class Counter {
    var count = 0
        private set

    fun increment() {
        count++
    }
}

main 내부:

val c = Counter()
c.increment()
println(c.count)
// c.count = 99   // 오류: setter가 private입니다

출력:

1

이는 유효한 수상을 통해서만 증가하는 점수와 같이 규칙을 통해서만 변경될 수 있는 값에 적합합니다:

class Player(val name: String) {
    var score = 0
        private set
    private val _history = mutableListOf<Int>()
    val history: List<Int> get() = _history

    fun award(points: Int) {
        if (points <= 0) return
        score += points
        _history.add(points)
    }
}

main 내부에서:

val p = Player("Ada")
p.award(10)
p.award(-5)
p.award(3)
println(p.score)
println(p.history)

출력:

13
[10, 3]

위의 history는 일반적인 패턴을 보여 줍니다. 클래스 내부에 비공개 MutableList를 두고, 읽기 전용 List로 노출하는 방식입니다. 호출자는 항목을 읽을 수 있지만, 항목을 변경할 수 있는 add나 remove는 사용할 수 없습니다:

private val _items = mutableListOf<String>()
val items: List<String> get() = _items      // 읽기 전용 뷰
// 외부: items.add("x")                  // 오류: List에는 add가 없음

val은 생성된 후에는 클래스 내부에서도 절대 변경되지 않습니다. private set이 지정된 var는 클래스 내부에서만 변경할 수 있습니다. 객체의 전체 수명 동안 고정되는 값에는 val을 선택하세요:

class Order(val id: Int) {            // 절대 변경되지 않음
    var status = "new"
        private set                       // 변경되지만 Order 내부에서만
    fun ship() { status = "shipped" }
}
challenge icon

챌린지

쉬움

Elevator(val topFloor: Int) 클래스를 완성하세요. floor와 trips는 외부에서 읽을 수 있지만 클래스 내부에서만 변경할 수 있습니다(private set). goTo(target)는 0층과 topFloor 사이에서 이동합니다. 다른 층으로의 유효한 이동은 floor를 업데이트하고 trips에 1을 더한 뒤 true를 반환합니다. 유효하지 않거나 같은 층으로의 이동은 false를 반환합니다.

제공된 코드는 최고 층을 읽은 다음 목표 층들을 읽습니다. 이동 후에는 floor 3을 출력하고, 이동이 거부되면 stay 3을 출력하며, 마지막으로 횟수와 함께 trips: 를 출력합니다.

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

REQUIRED OUTPUT FORMAT: [Your translated content here]

직접 해보기

fun main() {
    // 제공된 입력/출력 코드: 그대로 유지하세요
    val input = generateSequence(::readLine).toList()
    val lift = Elevator(input[0].toInt())
    for (line in input.drop(1)) {
        val moved = lift.goTo(line.toInt())
        println("${if (moved) "floor" else "stay"} ${lift.floor}")
    }
    println("trips: ${lift.trips}")
}
quiz icon실력 점검

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

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

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