Menu
Coddy logo textTech

const를 사용한 상수

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

const val은 컴파일 시 상수를 선언합니다. 즉, 프로그램이 컴파일될 때 값이 고정됩니다. 파일의 최상위 수준과 object 또는 companion object 내부에서 사용할 수 있으며, Int, Double, Boolean과 같은 기본 타입 및 String에만 사용할 수 있습니다.

const val MAX_PLAYERS = 4

class Lobby {
    val players = mutableListOf<String>()

    fun canStart() = players.size in MIN_PLAYERS..MAX_PLAYERS

    companion object {
        const val MIN_PLAYERS = 2
    }
}

main 내부에서는 다음과 같습니다.

val lobby = Lobby()
lobby.players += listOf("ada", "bo")
println(lobby.canStart())
println("${Lobby.MIN_PLAYERS}-$MAX_PLAYERS players")

출력:

true
2-4 players

상수는 UPPER_SNAKE_CASE로 이름을 지정합니다. const는 val보다 더 엄격합니다. 코드 실행 없이 값을 알고 있어야 하므로 함수 호출이나 리스트는 허용되지 않습니다. 객체의 val도 공유되며 읽기 전용이고, 어떤 값이든 받을 수 있습니다:

const val GREETING = "Hello"                  // String 리터럴
const val TIMEOUT_MS = 30 * 1000              // 리터럴로부터 계산됨
// const val START = System.nanoTime()        // error: 상수가 아님
// const val DAYS = listOf("Mon", "Tue")      // error: 기본 타입과 String만 가능
object Defaults {
    val DAYS = listOf("Mon", "Tue")           // 공유되는 읽기 전용 val
}

companion object는 공유 가변 상태도 보유할 수 있습니다. 모든 인스턴스가 동일한 속성을 읽고 변경하므로 카운터와 캐시에 적합합니다. 이 클래스는 이름마다 하나의 인스턴스만 유지하므로, 두 번 요청하면 동일한 객체를 반환합니다(===는 두 참조가 하나의 객체를 가리키는지 확인합니다):

class Tile private constructor(val name: String) {
    companion object {
        private val cache = mutableMapOf<String, Tile>()
        val created: Int
            get() = cache.size

        fun of(name: String) = cache.getOrPut(name) { Tile(name) }
    }
}

main 내부:

val a = Tile.of("grass")
val b = Tile.of("grass")
Tile.of("water")
println(a === b)
println(Tile.created)

출력:

true
2

최상위인가, 컴패니언인가? 최상위 상수나 함수는 해당 파일에 속하며 패키지의 모든 파일에서 일반 이름으로 사용됩니다. 상수가 하나의 클래스에 속한다면 컴패니언에 넣으세요. 호출자는 값이 어디에서 오는지 보여 주는 Lobby.MIN_PLAYERS라고 작성하며, private const val은 해당 클래스 내부에만 남습니다.

// Limits.kt
const val MAX_UPLOAD_MB = 25                 // 모든 곳에서 MAX_UPLOAD_MB로 사용됨

// Lobby.kt
class Lobby {
    companion object {
        const val MIN_PLAYERS = 2            // Lobby.MIN_PLAYERS로 사용됨
        private const val ROOM_PREFIX = "L-" // Lobby 내부에서만
    }
}
challenge icon

챌린지

쉬움

Order(val item: String, val qty: Int) 클래스를 완성하세요. companion object에는 MAX_QTY = 10 및 PREFIX = "ORD" 상수, 다음 주문 번호를 위한 private 카운터, 읽기 전용 공유 합계 totalItems, 생성된 주문 수를 계산하는 count가 있습니다. init 블록은 MAX_QTY와 1 사이의 수량을 요구하며, 메시지는 quantity must be 1-10(상수로 구성됨)입니다. 그런 다음 주문에 ORD-001, ORD-002, ...와 같은 id를 부여하고 수량을 totalItems에 더합니다. label()은 ORD-001 tea x2를 반환합니다.

제공된 코드는 max per order: 10을 출력한 다음 tea 2 줄을 읽고 레이블 또는 오류 메시지를 출력하며, 마지막으로 orders: 2, items: 5를 출력합니다. 거부된 주문은 번호를 사용하지 않습니다.

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

직접 해보기

fun main() {
    // 제공된 입력/출력 코드: 그대로 유지하세요
    val input = generateSequence(::readLine).toList()
    println("max per order: ${Order.MAX_QTY}")
    for (line in input) {
        val (item, qty) = line.split(" ")
        try {
            println(Order(item, qty.toInt()).label())
        } catch (e: IllegalArgumentException) {
            println(e.message)
        }
    }
    println("orders: ${Order.count}, items: ${Order.totalItems}")
}
quiz icon실력 점검

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

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

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