๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ฑ/๐Ÿ“—Kotlin

[Kotlin] ๋‹ค์–‘ํ•œ ํด๋ž˜์Šค

๐Ÿ’กcompanion, data class, ์ค‘์ฒฉ ํด๋ž˜์Šค, enum, sealed๐Ÿ’ก

 


โ–ช๏ธcompanion

· ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

· ๊ณตํ†ต๋œ ๊ฐ’์ด ๋งŽ๋‹ค๋ฉด companion์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

fun main() {
    // ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ๊ทธ ์•ˆ์˜ ๋‚ด์šฉ๋“ค์„ ์“ธ ์ˆ˜ ์žˆ์Œ
    val obj = ComClass()

    println("obj.num1 : ${obj.num1}")
    obj.comFunction1()

    // companion์€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    println("obj.num2 : ${ComClass.num2}")
    ComClass.comFunction2()
}

class ComClass {
    var num1 = 100

    fun comFunction1() {
        println("comFunction1 ํ˜ธ์ถœ")
    }

    companion object {
        var num2 = 200

        fun comFunction2() {
            println("comFunction2 ํ˜ธ์ถœ")
        }
    }
}

 

 

โ–ช๏ธdata class

· ๋งค๊ฐœ์ฒด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค์ด๋‹ค.

· ๋ฐ˜๋“œ์‹œ ์ฃผ ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

fun main() {
    val obj1 = DatClass("์งฑ๊ตฌ", 10)
    val obj2 = DatClass("์ฒ ์ˆ˜", 20)
    val obj3 = DatClass("๋งน๊ตฌ", 30)

    println("obj1 : ${obj1.name}, ${obj1.age}")
    println("obj2 : ${obj2.name}, ${obj2.age}")
    println("obj3 : ${obj3.name}, ${obj3.age}")
}

data class DatClass(
    val name : String,
    val age : Int
)

 

 

โ–ช๏ธGeneric

· ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ์— ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

fun main() {
    val obj1 = GenClass1<Int>()
    obj1.genClass1function(100)

    val obj2 = GenClass2<Double>(100.0)
    obj2.genClass2function(200.0)

    val obj3 = GenClass3<Int, Double>()
    obj3.genClass3function(100, 100.0)

    val obj4 = GenClass4<Int, Double, String, Boolean>(100,100.0)
    obj4.genClass4function("๊ฐ€๋‚˜๋‹ค", false)
}

// ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ <>์•ˆ์— ํƒ€์ž…์„ ๋„ฃ์–ด์ค€๋‹ค๋ฉด ํ•ด๋‹น ํƒ€์ž…๋งŒ ๋„ฃ์„ ์ˆ˜ ์žˆ์Œ
class GenClass1<T> {
    fun genClass1function(what : T) {
        println("genClass1function what : $what")
    }
}

class GenClass2<T>(var what1 : T) {
    fun genClass2function(what2 : T) {
        println("GenClass2 what : $what1")
        println("genClass2function what : $what2")
    }
}

// ํ•œ ๊ฐœ ์ด์ƒ์˜ ํƒ€์ž…์„ ๋„ฃ์„ ์ˆ˜ ์žˆ์Œ
class GenClass3<A, B> {
    fun genClass3function(what1 : A, what2 : B) {
        println("genClass3function what1 : $what1")
        println("genClass3function what2 : $what2")
    }
}

class GenClass4<A, B, C, D>(var what1 : A, var what2 : B) {
    fun genClass4function(what3 : C, what4 : D) {
        println("GenClass4 what1 : $what1")
        println("GenClass4 what2 : $what2")
        println("genClass4function what3 : $what3")
        println("genClass4function what4 : $what4")
    }
}

 

 

โ–ช๏ธ์ค‘์ฒฉ ํด๋ž˜์Šค

· ํด๋ž˜์Šค ์•ˆ์— ๋งŒ๋“œ๋Š” ํด๋ž˜์Šค๋ฅผ ์ค‘์ฒฉ ํด๋ž˜์Šค๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

· class ์•ž์— inner ํ‚ค์›Œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

fun main() {
    // inner class์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ๋จผ์ € ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.
    val obj1 = InnClass1()
    val obj2 = obj1.InnClass2()

    obj2.innClass2Function()
}

class InnClass1 {
    inner class InnClass2 {
        fun innClass2Function() {
            println("innClass2Function ํ˜ธ์ถœ")
        }
    }
}

 

์ต๋ช… ์ค‘์ฒฉ ํด๋ž˜์Šค

· ์ด๋ฆ„์ด ์—†๋Š” ํด๋ž˜์Šค๋ฅผ ์ต๋ช… ์ค‘์ฒฉ ํด๋ž˜์Šค๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

· ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ์ถ”์ƒํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ด์šฉ๋œ๋‹ค.

· ์ด๋ฆ„์ด ์—†์œผ๋ฏ€๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋‹ค.

fun main() {
    val obj1 = InnClass1()
    obj1.innAbsFunction()

    val obj2 = InnClass2()
    obj2.innIntFunction()

    // ์ต๋ช… ์ค‘์ฒฉ ํด๋ž˜์Šค
    val obj3 = object : InnClass1() {
        override fun innAbsFunction() {
            println("์ต๋ช… ์ค‘์ฒฉ ํด๋ž˜์Šค์˜ innAbsFunction ํ˜ธ์ถœ")
        }
    }
    obj3.innAbsFunction()

    val obj4 = object : InnClass2() {
        override fun innIntFunction() {
            println("์ต๋ช… ์ค‘์ฒฉ ํด๋ž˜์Šค์˜ innIntFunction ํ˜ธ์ถœ")
        }
    }
    obj4.innIntFunction()
}

abstract class InnAbsClass {
    abstract fun innAbsFunction()
}

interface InnIntClass {
    fun innIntFunction()
}

// ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ํด๋ž˜์Šค
open class InnClass1 : InnAbsClass() {
    override fun innAbsFunction() {
        println("innAbsFunction ํ˜ธ์ถœ")
    }
}

// ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค
open class InnClass2 : InnIntClass {
    override fun innIntFunction() {
        println("innIntFunction ํ˜ธ์ถœ")
    }
}

 

 

โ–ช๏ธenum

· ์—ด๊ฑฐํ˜•์€ ์ •์˜ํ•œ ๋‹จ์–ด ์ž์ฒด๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’์ด ๋œ๋‹ค.

fun main() {
    enuFunction1(EnuClass1.SOUTH)
    enuFunction2(EnuClass2.TWO)
}

enum class EnuClass1 {
    NORTH, SOUTH, WEST, EAST
}

enum class EnuClass2(val num : Int, val str : String) {
    ONE(1,"ํ•˜๋‚˜"), TWO(2,"๋‘˜"), THREE(3,"์…‹")
}

fun enuFunction1(what : EnuClass1) {
    when(what) {
        EnuClass1.NORTH -> println("๋ถ์ชฝ์ž…๋‹ˆ๋‹ค.")
        EnuClass1.SOUTH -> println("๋‚จ์ชฝ์ž…๋‹ˆ๋‹ค.")
        EnuClass1.WEST -> println("์„œ์ชฝ์ž…๋‹ˆ๋‹ค.")
        EnuClass1.EAST -> println("๋™์ชฝ์ž…๋‹ˆ๋‹ค.")
    }
}

fun enuFunction2(what : EnuClass2) {
    when(what) {
        EnuClass2.ONE -> println("ONE์ž…๋‹ˆ๋‹ค.")
        EnuClass2.TWO -> println("TWO์ž…๋‹ˆ๋‹ค.")
        EnuClass2.THREE -> println("THREE์ž…๋‹ˆ๋‹ค.")
    }

    // ๋ถ„๊ธฐ๊ฐ€ ๊ฐ€๋Šฅ
    when(what.num) {
        1 -> println("1์ž…๋‹ˆ๋‹ค.")
        2 -> println("2์ž…๋‹ˆ๋‹ค.")
        3 -> println("3์ž…๋‹ˆ๋‹ค.")
    }

    when(what.str) {
        "ํ•˜๋‚˜" -> println("ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.")
        "๋‘˜" -> println("๋‘˜์ž…๋‹ˆ๋‹ค.")
        "์…‹" -> println("์…‹์ž…๋‹ˆ๋‹ค.")
    }
}

 

 

โ–ช๏ธsealed

· sealed class๋Š” ๊ฐ์ฒด๋ฅผ ๋ชจ์•„ ๊ด€๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค์ด๋‹ค.

fun main() {
    val n1 = SeaClass.SealedTwo(1)
    checkNumber(n1)

    val n2= SeaClass.SealedTwo(2)
    checkNumber(n2)

    val n3= SeaClass.SealedThree(3, 3.0)
    checkNumber(n3)
}

sealed class SeaClass {
    class SealedOne(val num : Int) : SeaClass()
    // ๋ฉ”์„œ๋“œ๋„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Œ
    class SealedTwo(val num : Int) : SeaClass() {
        fun seaFunction() {
            println("seaFunction ํ˜ธ์ถœ")
        }
    }
    class SealedThree(val num : Int, val num2 : Double) : SeaClass()
}

fun checkNumber(number : SeaClass) {
    when(number) {
        // ํด๋ž˜์Šคํƒ€์ž… ๊ฒ€์‚ฌ๋Š” is๋ฅผ ์“ฐ๋ฉด ๋จ
        is SeaClass.SealedOne -> {
            println("SealedOne")
            println(number.num)
        }

        is SeaClass.SealedTwo -> {
            println("SealedTwo")
            println(number.num)

            when(number.num) {
                1 -> println("1์ž…๋‹ˆ๋‹ค.")
                2 -> println("2์ž…๋‹ˆ๋‹ค.")
                3 -> println("3์ž…๋‹ˆ๋‹ค.")
            }

            number.seaFunction()
        }

        is SeaClass.SealedThree -> {
            println("SealedThree")
            println(number.num)

            when(number.num) {
                3 -> println("3์ž…๋‹ˆ๋‹ค.")
            }

            when(number.num2) {
                3.0 -> println("3.0์ž…๋‹ˆ๋‹ค.")
            }
        }
    }
}