객체 선언
Coddy Kotlin 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 12번째.
object Name { ... }은 클래스와 그 유일한 인스턴스를 한 번에 선언합니다. 이름으로 객체를 사용하며, 호출할 생성자는 없습니다:
object AppConfig {
var theme = "light"
val version = "1.4"
fun describe() = "v$version, $theme theme"
}main 내부에서:
println(AppConfig.describe())
AppConfig.theme = "dark"
println(AppConfig.describe())출력:
v1.4, light theme
v1.4, dark theme인스턴스는 정확히 하나이므로 객체를 사용하는 프로그램의 모든 부분이 동일한 상태를 읽고 변경합니다. 객체는 처음 사용될 때 생성되며, 아래의 init 블록에서 이를 확인할 수 있습니다:
object Visits {
var count = 0
private set
init { println("Visits created") }
fun record() { count++ }
}
fun home() = Visits.record()
fun about() { Visits.record(); Visits.record() }main 내부에서:
println("start")
home()
about()
println(Visits.count)출력:
start
Visits created
3객체는 아무도 생성하지 않으므로 생성자가 없습니다. 프로퍼티의 값은 선언할 때 또는 init에서 할당됩니다. 그 외에는 private 상태, private 도우미 함수, public 메서드가 있는 일반적인 클래스 본문입니다:
object IdGenerator {
private var next = 1
fun newId(prefix: String) = "$prefix-${pad(next++)}"
private fun pad(n: Int) = n.toString().padStart(3, '0')
}main 내부에서:
println(IdGenerator.newId("user"))
println(IdGenerator.newId("order"))출력:
user-001
order-002프로그램에 정확히 하나만 존재하는 것, 즉 레지스트리, 구성, 도우미 함수 모음에는 객체를 사용하세요. 객체는 모든 파일에서 변경할 수 있는 전역 상태이므로, 설정자(setter)는 비공개로 유지하고 메서드가 모든 변경 사항을 확인하도록 하세요.
object Units {
fun kmToMiles(km: Double) = km * 0.621371
}
Units.kmToMiles(10.0) // 이름을 통해 호출됨
// val u = Units() // 오류: object에는 생성자가 없음챌린지
쉬움Leaderboard 객체를 완성하세요. 이 객체는 각 플레이어의 점수를 비공개 맵에 저장합니다. add(player, points)는 점수를 추가하고, top()은 선두 플레이어를 ada 6 형식으로 반환합니다(점수가 같으면 이름의 알파벳 순서가 앞선 플레이어가 반환됩니다). 점수가 있는 플레이어가 없으면 empty를 반환합니다. reset()은 모든 플레이어를 제거하고, players 속성은 플레이어 수를 나타냅니다.
Functions.kt의 도우미 함수 recordWin과 recordDraw는 제공되어 있습니다. 이 함수들은 다른 파일에 있는 Leaderboard를 사용합니다. 제공된 코드는 win ada, draw ada bo, top 또는 reset 명령을 읽고, 각 top 명령마다 top()의 결과를 출력한 다음 마지막으로 개수를 포함해 players: 를 출력합니다.
코드는 Leaderboard.kt와 Functions.kt에 작성하세요. Main.kt에는 제공된 입출력 코드가 있으며 수정할 수 없습니다.
직접 해보기
fun main() {
// 제공된 입력/출력 코드: 그대로 유지하세요
val input = generateSequence(::readLine).toList()
for (cmd in input) {
val p = cmd.split(" ")
when (p[0]) {
"win" -> recordWin(p[1])
"draw" -> recordDraw(p[1], p[2])
"reset" -> Leaderboard.reset()
else -> println(Leaderboard.top())
}
}
println("players: ${Leaderboard.players}")
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: Kotlin 플레이그라운드