객체 선언
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에서 값을 얻습니다. 그 외에는 일반적인 클래스 본문과 같습니다. 비공개 상태, 비공개 헬퍼 및 공개 메서드가 있습니다:
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() // error: 객체에는 생성자가 없습니다챌린지
쉬움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 플레이그라운드