Kotlin

[Kotlin] ์ฝ”ํ‹€๋ฆฐ ๋ฌธ๋ฒ• ๊ธฐ์ดˆ 2

soogoori 2024. 7. 8. 10:05
 

์˜ˆ์™ธ์ฒ˜๋ฆฌ

๋ชจ๋“  ์˜ˆ์™ธ ํด๋ž˜์Šค๋Š” ์ตœ์ƒ์œ„ ์˜ˆ์™ธ ํด๋ž˜์Šค์ธ Throwable์„ ์ƒ์†ํ•จ
  • ์ž๋ฐ”์—์„œ checked exception์€ ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์กฐ๊ฑด try-catch๋กœ ๊ฐ์‹ธ๊ฑฐ๋‚˜ throws ์˜ˆ์™ธ๋ฅผ ์ „ํŒŒํ•ด์•ผํ•˜๋‚˜, ์ฝ”ํ‹€๋ฆฐ์€ checked exception์„ ๊ฐ•์ œ X
  • ์ฝ”ํ‹€๋ฆฐ์—์„œ try-catch๋Š” ํ‘œํ˜„์‹
val a = try { 
    "1234".toInt() 
} catch (e: NumberFormatException) { 
    println("catch ๋™์ž‘") 
}
println(a) // 1234
  • ์ฝ”ํ‹€๋ฆฐ์—์„œ exception์„ ๋ฐœ์ƒ์‹œํ‚ค๋ ค๋ฉด throw ์‚ฌ์šฉ
fun failFast(message: String): {
	throw IllegalArgumentException(message)
}
  • Nothing ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ•ด๋‹น ์ฝ”๋“œ ์ดํ›„์—๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒฝ๊ณ  ๋ณด์—ฌ์คŒ
fun failFast(message: String): Nothing {
	throw IllegalArgumentException(message)
}

failFast("์—๋Ÿฌ๋ฐœ์ƒ!")
// Unreachable code
println("์ด ๋ฉ”์‹œ์ง€๋Š” ์ถœ๋ ฅ๋ ๊นŒ?")
  • ์—˜๋น„์Šค ์—ฐ์‚ฐ์ž์™€ Nothing ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด null ์•ˆ์ „ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋จ ๐Ÿ‘‰ null์ด ๋‚˜์˜ฌ ์ˆ˜ ์—†๋‹ค๊ณ  ์ธ์‹ํ•˜๊ธฐ ๋•Œ๋ฌธ
fun main() {
    val a: String? = null
    val b: String = a ?: failFast("a is null ")
    println(b.length) // b?.length๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋จ
}

 

 

 

ํด๋ž˜์Šค์™€ ํ”„๋กœํผํ‹ฐ

๐Ÿ”ท Class

  • class ํ‚ค์›Œ๋“œ ์‚ฌ์šฉํ•˜์—ฌ ์„ ์–ธ
  • ์ƒ์„ฑ์ž๋Š” ๊ธฐ๋ณธ์ƒ์„ฑ์ž์™€ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ณด์กฐ ์ƒ์„ฑ์ž ์กด์žฌ ๊ฐ€๋Šฅ 
class Coffee constructor(val name: String)
class Coffee(val name: String) // ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋Š” constructor ์ƒ๋žต ๊ฐ€๋Šฅ

 

  • ํด๋ž˜์Šค์— ํ”„๋กœํผํ‹ฐ ์„ ์–ธํ•  ๋•Œ trailing comma (ํ›„ํ–‰์‰ผํ‘œ) ์‚ฌ์šฉ ๐Ÿ‘‰ ์ด์ „์˜ ๋งˆ์ง€๋ง‰ ์ค„์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ํ”„๋กœํผํ‹ฐ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ git์—์„œ diff ๋“ฑ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋น„๊ตํ–ˆ์„ ๋•Œ ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋ช…ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ์Œ 
class Coffee(
    val name: String,
    val price: Int, // trailing comma
)

 

๐Ÿ”ท ํ”„๋กœํผํ‹ฐ

  • val, var ํ‚ค์›Œ๋“œ ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
class Coffee(
    var name: String = "", // ๊ธฐ๋ณธ ๊ฐ’ ์ถ”๊ฐ€
    var price: Int = 0,
)
  • ํ”„๋กœํผํ‹ฐ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ฐธ์กฐ ์‚ฌ์šฉ
fun main() {
    val coffee = Coffee()
    coffee.name = "์•„์ด์Šค ์•„๋ฉ”๋ฆฌ์นด๋…ธ"
    coffee.price = 2000
    println("${coffee.name} ๊ฐ€๊ฒฉ์€ ${coffee.price}")
}

 

 

๐Ÿ”ท getter, setter

  • var๋กœ ์„ ์–ธ๋œ ํ”„๋กœํผํ‹ฐ๋Š” getter, setter๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑ
  • val๋กœ ์„ ์–ธ๋œ ํ”„๋กœํผํ‹ฐ๋Š” getter๋งŒ ์กด์žฌ 
  • ์ปค์Šคํ…€ getter ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ 
class Coffee(
    var name: String = "",
    var price: Int = 0, // trailing comma
) {
    val brand: String
    	get() = "์Šคํƒ€๋ฒ…์Šค" // ์ปค์Šคํ…€ getter
}

fun main() {
    val coffee = Coffee()
    coffee.name = "์•„์ด์Šค ์•„๋ฉ”๋ฆฌ์นด๋…ธ"
    coffee.price = 2000
    
    // brand๋ฅผ ํฌํ•จํ•ด ์ถœ๋ ฅ
    println("${coffee.brand} ${coffee.name} ๊ฐ€๊ฒฉ์€ ${coffee.price}")
}
  • var๋กœ ์„ ์–ธ๋œ ํ”„๋กœํผํ‹ฐ์— ํ•œํ•˜์—ฌ ์ปค์Šคํ…€ setter ์ƒ์„ฑ ๊ฐ€๋Šฅ
class Coffee(
    var name: String = "",
    var price: Int = 0, // trailing comma
) {
    val brand: String
        get() {
        	return "์Šคํƒ€๋ฒ…์Šค"
    }
    
    var quantity: Int = 0
        set(value) { // ์ปค์Šคํ…€ setter
            if (value > 0) { // ์ˆ˜๋Ÿ‰์ด 0 ์ด์ƒ์ธ ๊ฒฝ์šฐ์—๋งŒ ๊ฐ’์„ ํ• ๋‹น
            	field = value
        }
    }
}

fun main() {
    val coffee = Coffee()
    coffee.name = "์•„์ด์Šค ์•„๋ฉ”๋ฆฌ์นด๋…ธ"
    coffee.price = 2000
    coffee.quantity = 1 // ์ฃผ๋ฌธ ์ˆ˜๋Ÿ‰ ์ถ”๊ฐ€
    
    // ์ˆ˜๋Ÿ‰์„ ํฌํ•จํ•ด ์ถœ๋ ฅ
    println("${coffee.brand} ${coffee.name} ๊ฐ€๊ฒฉ์€ ${coffee.price} ์ˆ˜๋Ÿ‰์€ ${coffee.quantity}")
}
field ์‹๋ณ„์ž ์‚ฌ์šฉํ•ด ํ•„๋“œ์˜ ์ฐธ์กฐ์— ์ ‘๊ทผ = Backing Field
๐Ÿ‘‰ field ๋Œ€์‹  quantity๋กœ ์ง์ ‘ ํ• ๋‹นํ•œ๋‹ค๋ฉด ๋ฌดํ•œ์žฌ๊ท€ ๋ฐœ์ƒ (StackOverflow)

 

  • ํ”„๋กœํผํ‹ฐ๋Š” ๊ฐ์ฒด์ง€ํ–ฅ์  ๐Ÿ‘‰ ํ–‰์œ„๋Š” ๋ฉ”์„œ๋“œ๋กœ ํ‘œํ˜„, ์ƒํƒœ๋Š” ํ”„๋กœํผํ‹ฐ๋กœ ํ‘œํ˜„
class Coffee(
	var name: String = "",
    var price: Int = 0, // trailing comma
    var iced: Boolean = false,
){
	val brand: String
    	get(){
        	return "์Šคํƒ€๋ฒ…์Šค"
        }
    
    var quantity: Int = 0
    	set(value) {
        	if(value > 0){
            	field = value
            }
        }
}

fun main(){
	val coffee = Coffee()
    coffee.name = "์•„์ด์Šค ์•„๋ฉ”๋ฆฌ์นด๋…ธ"
    coffee.price = 2000
    coffee.quantity = 1
    coffee.iced = true
    
    if(coffee.iced){ // ํ”„๋กœํผํ‹ฐ
    	println("์•„์ด์Šค ์ปคํ”ผ")
    }
    println("${coffee.brand} ${coffee.name} ๊ฐ€๊ฒฉ์€ ${coffee.price} ์ˆ˜๋Ÿ‰์€ ${coffee.quantity}")
}

 

 

 

์ƒ์†

๐Ÿ”ท ์ƒ์†

์ƒ์†์„ ๋ชฉ์ ์œผ๋กœ ๋งŒ๋“  ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋ชจ๋‘ final๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ 
  • ์ž๋ฐ”์˜ ๋ชจ๋“  ํด๋ž˜์Šค ์กฐ์ƒ = Object
  • ์ฝ”ํ‹€๋ฆฐ์—์„œ ๋ชจ๋“  ํด๋ž˜์Šค ์กฐ์ƒ = Any
    • Any์—๋Š” equals, hashCode, toString์ด ์กด์žฌํ•˜๊ณ  ๋ชจ๋“  ํด๋ž˜์Šค๋กœ ์ž๋™ ์ƒ์†๋จ
  • open ํ‚ค์›Œ๋“œ๋กœ ์ƒ์† ํ—ˆ์šฉ
open class Dog
  • ํ•˜์œ„ํด๋ž˜์Šค์—์„œ ์ƒ์œ„ ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•˜๋ ค๋ฉด ํด๋ž˜์Šค ๋’ค์— : ์ถ”๊ฐ€ํ•˜๊ณ  ์ƒ์œ„ ํด๋ž˜์Šค ์ž‘์„ฑ
class Bulldog : Dog()

 

  •  ํ•จ์ˆ˜๋‚˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์žฌ์ •์˜ํ•  ๋•Œ๋„ open ํ‚ค์›Œ๋“œ๋กœ ์˜ค๋ฒ„๋ผ์ด๋“œ์— ๋Œ€ํ•ด ํ—ˆ์šฉ
open class Dog{
	open var age: Int = 0
    
    open fun bark() {
    	println("๋ฉ๋ฉ")
    }
}

// ์žฌ์ •์˜ -> Dog ํด๋ž˜์Šค ์ƒ์†๋ฐ›์Œ
class Bulldog : Dog() {
	override var age: Int = 0
    
    override fun bark(){
    	println("์ปน์ปน")
    }
}

// ๊ธฐ๋ณธ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•ด ์˜ค๋ฒ„๋ผ์ด๋“œ
class Bulldog(override var age: Int = 0) : Dog() {
	override fun bark(){
    	println("์ปน์ปน")
    }
}

fun main(){
	val dog = Bulldog(age = 2)
    println(dog.age)
    dog.bark()
}

 

  • override๋œ ํ•จ์ˆ˜๋‚˜ ํ”„๋กœํผํ‹ฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ open๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ํ•˜์œ„ํด๋ž˜์Šค์—์„œ ์˜ค๋ฒ„๋ผ์ด๋“œ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด final์„ ์•ž์— ๋ถ™์ž„
open class Bulldog(final override var age: Int = 0) : Dog() {
	
    final override fun bark() {
    	println("์ปน์ปน")
    }
}

class childrenBulldog : Bulldog(){
	
    override var age: Int = 0 // ์ปดํŒŒ์ผ ์˜ค๋ฅ˜
    override fun bark() {} // ์ปดํŒŒ์ผ ์˜ค๋ฅ˜
}
  • ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ํ•จ์ˆ˜๋‚˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ ‘๊ทผํ•  ๋• super ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ
open class Bulldog(final override var age: Int = 0) : Dog(){

	final override fun bark(){
    	super.bark()
    }
}

 

 

๐Ÿ”ท ์ถ”์ƒํด๋ž˜์Šค

  • abstract ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ ๐Ÿ‘‰ ํ•˜์œ„ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๋‚˜ ํ•จ์ˆ˜ ๋˜ํ•œ abstract ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ
abstract class Developer {
	abstract var age: Int
    abstract fun code(language: String) // abstract ํ‚ค์›Œ๋“œ ๋ถ™์€ ๊ฒƒ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„
}

class BackendDeveloper(override var age: Int) : Developer(){
	override fun code(language: String){
    	println("I code with $language")
    }
}

fun main(){
	val backendDeveloper = BackendDeveloper(age=20)
    println(backendDeveloper.age)
	backendDeveloper.code("Kotlin")
}
// I code with Kotlin

 

 

 

์ธํ„ฐํŽ˜์ด์Šค

  • interface ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ
  • ์ธํ„ฐํŽ˜์ด์Šค ๋‚ด๋ถ€์— ์ถ”์ƒํ•จ์ˆ˜์™€ ๊ตฌํ˜„์„ ๊ฐ€์ง„ ํ•จ์ˆ˜ (๋””ํดํŠธ ๋ฉ”์„œ๋“œ) ๋ชจ๋‘ ์ •์˜ ๊ฐ€๋Šฅ 
class Product(val name: String, val price: Int)

interface Wheel{ // ์ƒ์œ„ ์ธํ„ฐํŽ˜์ด์Šค 
	fun roll()
}

interface Cart : Wheel {

	var coin: Int // ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š” ์ถ”์ƒ ํ”„๋กœํผํ‹ฐ
    
    val weight: String
    	get() = "20KG" // backing field ์‚ฌ์šฉ X
    
	fun add(product: Product) // ์ถ”์ƒ ํ•จ์ˆ˜
    
    fun rent(){
    	if(coin > 0){
        	println("์นดํŠธ๋ฅผ ๋Œ€์—ฌํ•ฉ๋‹ˆ๋‹ค")
        }
    }
    
    override fun roll(){
    	println("์นดํŠธ๊ฐ€ ๊ตด๋Ÿฌ๊ฐ‘๋‹ˆ๋‹ค")
    }
}

interface Order{
	fun add(product: Product){
    	println("${product.name} ์ฃผ๋ฌธ์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค")
    }
}
class MyCart(override var coin: Int): Cart, Order{
	override fun add(product: Product) {
    	if(coin <= 0) println("์ฝ”์ธ์„ ๋„ฃ์–ด์ฃผ์„ธ์š”")
        else println("$(product.name)์ด(๊ฐ€) ์นดํŠธ์— ์ถ”๊ฐ€๋์Šต๋‹ˆ๋‹ค")
        
        // ์ฃผ๋ฌธํ•˜๊ธฐ
        super<Order>.add(product)
    }
}

fun main(){
	val cart = MyCart(coin = 100)
    cart.rent()
    cart.roll()
	cart.add(Product(name = "์žฅ๋‚œ๊ฐ", price = 1000))
    // ์นดํŠธ๋ฅผ ๋Œ€์—ฌํ•ฉ๋‹ˆ๋‹ค
    // ์นดํŠธ๊ฐ€ ๊ตด๋Ÿฌ๊ฐ‘๋‹ˆ๋‹ค
    // ์žฅ๋‚œ๊ฐ์ด(๊ฐ€) ์นดํŠธ์— ์ถ”๊ฐ€๋์Šต๋‹ˆ๋‹ค
    // ์žฅ๋‚œ๊ฐ ์ฃผ๋ฌธ์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
    
    val cart2 = MyCart(coin = 0)
    cart2.rent()
    cart2.add(Product(name = "์žฅ๋‚œ๊ฐ", price = 1000))
    // ์ฝ”์ธ์„ ๋„ฃ์–ด์ฃผ์„ธ์š”
}
  • ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ์‹œ :์„ ๋ถ™์ด๊ณ  ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ด๋ฆ„ ์ ์Œ
  • ์ธํ„ฐํŽ˜์ด์Šค ์ž์ฒด์—์„œ backing field ์ ‘๊ทผ ๋ถˆ๊ฐ€
  • ์ƒ์†๊ณผ ๋‹ค๋ฅธ ์  ๐Ÿ‘‰ () ์ƒ์„ฑ์ž ํ˜ธ์ถœ์ด ์—†์Œ 
  • ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ๊ฐ€๋Šฅ 
    • Order์—๋Š” add๊ฐ€ ๊ตฌํ˜„์ด ์žˆ๋Š” ๋””ํดํŠธ ํ•จ์ˆ˜์ด๊ณ , Cart๋Š” abstract ํ•จ์ˆ˜์ž„
    • ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ super<์ธํ„ฐํŽ˜์ด์Šค>๋ฅผ ์‚ฌ์šฉํ•ด ํ˜ธ์ถœ ๊ฐ€๋Šฅ  ๐Ÿ‘‰ ์žฌ์ •์˜ ์ถฉ๋Œ ํ•ด๊ฒฐ
    • ๋‘ ์ธํ„ฐํŽ˜์ด์Šค์— ๊ตฌํ˜„์„ ๊ฐ€์ง„ ๋™์ผํ•œ ๋””ํดํŠธ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜ ๋ฐœ์ƒ 
interface Cart : Wheel {
	fun printId() = println("1234")
}

interface Order {
	fun printId() = println("5678")
}

// ์ปดํŒŒ์ผ ์˜ค๋ฅ˜ ๋ฐœ์ƒ
class MyCart(override var coin: Int) : Cart, Order

 

class MyCart(override var coin: Int) : Cart, Order {
    override fun printId() {
        super<Cart>.printId()
        super<Order>.printId()
    }
}
  • ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์„œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋””ํดํŠธ ํ•จ์ˆ˜ ์‚ฌ์šฉํ•˜๋ฉด ๋จ

 

 

์—ด๊ฑฐํ˜•

๐Ÿ”ท enum class ์‚ฌ์šฉ

enum class PaymentStatus {
	UNPAID, PAID, FAILED, REFUNDED
}
  • ํด๋ž˜์Šค์ด๋ฏ€๋กœ ์ƒ์„ฑ์ž์™€ ํ”„๋กœํผํ‹ฐ ์ •์˜ ๊ฐ€๋Šฅ
enum class PaymentStatus(val label: String) {
    UNPAID("๋ฏธ์ง€๊ธ‰"),
    PAID("์ง€๊ธ‰์™„๋ฃŒ"),
    FAILED("์ง€๊ธ‰์‹คํŒจ"),
    REFUNDED("ํ™˜๋ถˆ")
}
println(PaymentStatus.PAID.label)
// ์ง€๊ธ‰์™„๋ฃŒ

 

  • ์ •์˜๋œ ์ƒ์ˆ˜ ๋ชฉ๋ก ๋’ค์— ํ•จ์ˆ˜ ์ •์˜ํ•  ๊ฒฝ์šฐ ; (์„ธ๋ฏธ์ฝœ๋ก ) ์‚ฌ์šฉ
enum class PaymentStatus(val label: String) {
    UNPAID("๋ฏธ์ง€๊ธ‰"),
    PAID("์ง€๊ธ‰์™„๋ฃŒ"),
    FAILED("์ง€๊ธ‰์‹คํŒจ"),
    REFUNDED("ํ™˜๋ถˆ");
    
    fun isPayable(): Boolean = false
}
  • ๊ฒฐ์ œ ์ƒํƒœ์— ๋”ฐ๋ผ isPayable ์ƒํƒœ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ ๐Ÿ‘‰ abstract ํ•จ์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ  ๊ฐ๊ฐ์˜ ์ƒ์ˆ˜๋Š” ์ต๋ช… ํด๋ž˜์Šค ํ˜•ํƒœ๋กœ abstract ํ•จ์ˆ˜ ๊ตฌํ˜„ ๊ฐ€๋Šฅ 
enum class PaymentStatus(val label: String) {
    UNPAID("๋ฏธ์ง€๊ธ‰") {
    	override fun isPayable() = true
    },
    PAID("์ง€๊ธ‰์™„๋ฃŒ") {
    	override fun isPayable() = false
    },
    FAILED("์ง€๊ธ‰์‹คํŒจ") {
    	override fun isPayable() = false
    },
    REFUNDED("ํ™˜๋ถˆ") {
    	override fun isPayable() = false
    };
    
    abstract fun isPayable(): Boolean
}

fun main() {
	if(PaymentStatus.UNPAID.isPayable()){
    	println("๊ฒฐ์ œ ๊ฐ€๋Šฅ ์ƒํƒœ")
    }
    // ๊ฒฐ์ œ ๊ฐ€๋Šฅ ์ƒํƒœ 
}

 

  • enum ํด๋ž˜์Šค์—์„œ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ๊ฐ€๋Šฅ 
enum class PaymentStatus(val label: String) : Payable {
    UNPAID("๋ฏธ์ง€๊ธ‰") {
    	override fun isPayable() = true
    },
    PAID("์ง€๊ธ‰์™„๋ฃŒ") {
    	override fun isPayable() = false
    },
    FAILED("์ง€๊ธ‰์‹คํŒจ") {
   	 override fun isPayable() = false
    },
    REFUNDED("ํ™˜๋ถˆ") {
    	override fun isPayable() = false
    };
}

interface Payable {
	fun isPayable(): Boolean
}

 

  • valueOf(value:String) : String ์„ ์‚ฌ์šฉํ•ด์„œ enum ํด๋ž˜์Šค ์ƒ์„ฑ ๊ฐ€๋Šฅ 
val paymentStatus = PaymentStatus.valueOf("PAID")
println(paymentStatus.label)
// ์ง€๊ธ‰์™„๋ฃŒ
  • ๋™๋“ฑ์„ฑ ๋น„๊ต ๐Ÿ‘‰ == ์‚ฌ์šฉ
if (paymentStatus == PaymentStatus.PAID) {
	println("๊ฒฐ์ œ ์™„๋ฃŒ ์ƒํƒœ")
}
// ๊ฒฐ์ œ ์™„๋ฃŒ ์ƒํƒœ

 

  • enum ํด๋ž˜์Šค์˜ ์ƒ์ˆ˜ ๋‚˜์—ด ๐Ÿ‘‰ values() : Array<EnumClass> ์‚ฌ์šฉ
for (status in PaymentStatus.values()) {
	println("[$status](${status.label})")
}
// [UNPAID](๋ฏธ์ง€๊ธ‰)
// [PAID](์ง€๊ธ‰์™„๋ฃŒ)
// [FAILED](์ง€๊ธ‰์‹คํŒจ)
// [REFUNDED](ํ™˜๋ถˆ)
  • ์ƒ์ˆ˜๋Š” ์ œ๊ณตํ•˜๋Š” 2๊ฐœ์˜ ํ”„๋กœํผํ‹ฐ ์‚ฌ์šฉํ•ด ์ด๋ฆ„์„ ์–ป๊ฑฐ๋‚˜ ์ˆœ์„œ ์–ป์„ ์ˆ˜ ์žˆ์Œ
val name: String
val ordinal: Int
for (status in PaymentStatus.values()) {
	println("[${status.name}](${status.label}) : ${status.ordinal}")
}
// [UNPAID](๋ฏธ์ง€๊ธ‰) : 0
// [PAID](์ง€๊ธ‰์™„๋ฃŒ) : 1
// [FAILED](์ง€๊ธ‰์‹คํŒจ) : 2
// [REFUNDED](ํ™˜๋ถˆ) : 3