enum class 보충 설명입니다. 자세한 내용은 쉽게 다가가는 최신 프로그래밍: 코틀린 - 4.14 enum 클래스를 참고하기 바랍니다. enum 클래스는 열거형(enumeration) 클래스를 말합니다. enum 클래스도 일반 클래스처럼 속성과 메소드를 선언할 수 있습니다.
아래 enum 클래스 Selection은 3개의 상수(SCISSORS, ROCK, PAPER)를 선언합니다. Selection.values()는 enum 클래스에 정의된 상수 배열을 반환합니다. Selection.values() 대신 enumValues<Selection>()를 사용해도 됩니다. enum 클래스 Selection의 멤버 함수 trial()은 가위, 바위, 보 중 어느 것을 선택했는지 알려주는 함수입니다.
enum class Selection {
SCISSORS, ROCK, PAPER;
fun trial(id: Int) = this == choices[id]
}
private val choices = Selection.values()
// private val choices: Array<Selection> = enumValues<Selection>()
위 코드에서 속성 choice는 독립 변수로 선언했지만, enum 클래스 Selection의 동반 객체(companion object)로 선언할 수 있습니다. 이렇게 선언하는 게 보기 좋습니다!
enum class Selection {
SCISSORS, ROCK, PAPER;
fun trial(id: Int) = this == choices[id]
companion object {
private val choices = Selection.values()
}
}
아래 예제는 무작위로 정수(0, 1, 2)를 생성해 가위, 바위, 보 중 어느 것을 선택했는지 알려줍니다. Selection.valueOf()는 enum 클래스에 정의된 상수 이름을 반환합니다. Selection.valueOf() 대신 enumValuesOf<Selection>()를 사용해도 됩니다.
import kotlin.random.Random
enum class Selection { ... }
fun main() {
repeat (5) {
val rand = Random.nextInt(3)
val myTrial = when {
Selection.SCISSORS.trial(rand) -> "${enumValueOf<Selection>("SCISSORS")} 선택"
Selection.ROCK.trial(rand) -> "${Selection.valueOf("ROCK")} 선택"
Selection.PAPER.trial(rand) -> "${Selection.valueOf("PAPER")} 선택"
else -> "wrong choice"
}
print("[$it]$myTrial, ")
}
println()
}
아래 enum 클래스 Selection은 String 타입 속성 choice를 선언했기 때문에, SCISSORS("가위"), ROCK("바위"), PAPER("보") 처럼 enum 상수를 선언해야 합니다. Selection.values().size는 enum 상수의 갯수인 3입니다. Selection.values()[1]는 enum 상수 중 두 번째 상수인 ROCK입니다.
Selection.valueOf()는 아주 독특한 함수입니다. valueOf()의 인자는 enum 상수를 문자열로 전달해야 합니다. 대소문자를 철저히 구분하기 때문에 정확히 입력해야 하며, 잘못 입력하면 IllegalArgumentException 이 발생합니다. valueOf()는 실수를 많이하기 때문에, try - catch 블록으로 묶어 사용하는 것이 좋습니다. 이런 엄청난 노력에도 불구하고 valueOf()가 반환하는 값은 어처구니 없게도 enum 상수입니다.
enum class Selection(val choice: String) {
SCISSORS("가위"),
ROCK("바위"),
PAPER("보")
}
fun main() {
println(Selection.values().size) // 3
println(Selection.values()[1]) // ROCK
println(Selection.values()[1].choice) // 바위
val select = Selection.valueOf("ROCK")
println(select) // ROCK
}
가위바위보 게임을 위한 enum 클래스를 정의했으니 간단한 응용 예제를 만들어 보겠습니다.
import kotlin.random.Random
enum class Selection(val choice: String) {
SCISSORS("가위"),
ROCK("바위"),
PAPER("보")
}
fun getRandomChoice(): Selection {
return Selection.values()[Random.nextInt(Selection.values().size)]
}
fun main() {
for (i in 1..5) {
val computerChoice = getRandomChoice()
print("$computerChoice ")
}
println()
}
위 코드에서 함수 getRandomChoice()가 핵심이죠. 이 함수는 아래처럼 다양하게 구현할 수 있습니다. 주의할 점은 함수 nextInt(3)에서 무작위로 생성되는 값은 0, 1, 2이며, 3은 제외되는 점입니다.
fun getRandomChoice(): Selection {
return Selection.values()[Random.nextInt(3)]
// return Selection.values()[Random.nextInt(Selection.values().size)]
// return Selection.values()[(0..2).shuffled().first()]
// return Selection.values()[(0..2).shuffled().last()]
}
이제 마무리할 시간입니다. getRandomChoice() 는 top-level function으로 외롭게 떠돌아다니기 보다는 enum 클래스 Selection의 친한 친구(companion object)로 만드는 게 좋겠죠. 여기서 잊지말아야할 게 있습니다. 마지막 enum 상수를 선언하고 나서 반드시 ';'을 붙여 메소드와 구분해야 합니다!!
import kotlin.random.Random
enum class Selection(val choice: String) {
SCISSORS("가위"),
ROCK("바위"),
PAPER("보");
companion object {
fun getRandomChoice(): Selection {
return Selection.values()[Random.nextInt(3)]
}
}
}
fun main() {
for (i in 1..5) {
val computerChoice = Selection.getRandomChoice()
print("$computerChoice ")
}
println()
}
'코틀린' 카테고리의 다른 글
코틀린: 4장 테스트에 도전해 보세요(3,4,5번 정답 해설) (0) | 2025.01.06 |
---|---|
코틀린: 4장 테스트에 도전해 보세요 (0) | 2025.01.06 |
코틀린: 클래스 속성 - getter와 setter(updated) (0) | 2025.01.06 |
코틀린: 생성자와 속성 초기화 - 보조 생성자 (0) | 2025.01.06 |
코틀린: 생성자와 속성 초기화 - 주 생성자 (0) | 2025.01.06 |