Android/Kotlin

[Kotlin][Android] ์•ˆ๋“œ๋กœ์ด๋“œ ENUM์— ๋Œ€ํ•ด์„œ(IntDef , StringDef์˜ ์‚ฌ์šฉ๋ฒ•)

๋ށ์š” 2023. 7. 10. 12:46

์•ˆ๋…•ํ•˜์„ธ์š” ๐Ÿ‘‹

์˜ค๋Š˜์€ ํšŒ์‚ฌ์—์„œ ์—…๋ฌด๋ฅผ ํ•˜๋˜ ์ค‘ enum class ์‚ฌ์šฉ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์œผ๋ฉฐ

์ƒˆ๋กญ๊ฒŒ ๊ณต๋ถ€ํ•˜๊ฒŒ ๋œ @IntDef , @StringDef์— ๋Œ€ํ•ด์„œ

๊ฐ„๋‹จํ•˜๊ฒŒ ํฌ์ŠคํŒ… ํ•ด๋ณผ๊นŒ ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜Ž

Kotlin ๋ฐ Java์—์„œ ๊ณ ์ •๋œ ๊ฐ’์„ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ๋กœ ์ƒ์ˆ˜๋ฅผ ์ง€์ •ํ•˜์—ฌ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ์ƒ์ˆ˜๋“ค์„ ํƒ€์ž…์œผ๋กœ ๋ฌถ์–ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„๋•Œ๋Š” enum class๋ฅผ ์ง€์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์ด๋“ค ์žˆ์—ˆ์„ ๊ฒ๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ Android์—์„œ enum class๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์•ฑ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๊ณ  ํผํฌ๋จผ์Šค์ ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด

์‚ฌ์šฉ์„ ์ง€์–‘ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, TV๋‚˜ AVN๊ฐ™์€ ์ ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€์ง€๋Š” ๊ธฐ๊ธฐ์—์„œ๋Š” ์ทจ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

(์ฐธ๊ณ ์ž๋ฃŒ๋Š” ์•„๋ž˜ ๋งํฌ๋ฅผ ํ†ตํ•ด ํ™•์ธ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.)

 

Android Performance: Avoid using ENUM on Android

What and why we use ENUM?

medium.com

๊ทธ๋ ‡๋‹ค๋ฉด enum์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฌด์กฐ๊ฑด ์ƒ์ˆ˜๋กœ๋งŒ ๊ฐ’์„ ์ง€์ •ํ•ด์•ผ ํ• ๊นŒ์š”?? ๐Ÿค”

 

enum์„ ๋Œ€์ฒดํ•  ๋ฐฉ๋ฒ•์€ ๋ฐ”๋กœ @IntDef , @StringDef๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ์ •์˜ํ•ด์ฃผ๋Š” ๊ฒ๋‹ˆ๋‹ค.

์‚ฌ์šฉ๋ฐฉ๋ฒ•์„ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

/*enum class Type {
    INT, STRING, CHAR
}*/

/*enum class VALUES(value: Int) {
    VALUE1(1), VALUE2(2), VALUE(3)
}*/

private interface IType {
    companion object {
        const val INT = "INT"
        const val STRING = "STRING"
        const val CHAR = "CHAR"
    }
}

private interface IValue {
    companion object {
        const val VALUE1 = 1
        const val VALUE2 = 2
        const val VALUE3 = 3
    }
}

@Target(AnnotationTarget.TYPE, AnnotationTarget.PROPERTY)
@StringDef(value = [IType.INT, IType.STRING, IType.CHAR])
private annotation class TYPE

@Target(AnnotationTarget.TYPE, AnnotationTarget.PROPERTY)
@IntDef(value = [VALUE1, VALUE2, VALUE3])
private annotation class VALUE

class MainActivity : AppCompatActivity() {
    @TYPE
    var type: String = INT
    
    @VALUE
    var value: Int = VALUE1
    
    fun checkType() {
        when (type) {
            INT -> {}
            STRING -> {}
            CHAR -> {}
        }
    }
    
    fun checkValue() {
        when (value) {
            VALUE1 -> {}
            VALUE2 -> {}
            VALUE3 -> {}
        }
    }
}

 

IntDef(Value) , StringDef(Type) ๊ฐ๊ฐ ์œ„์—์„œ ์ฒ˜๋Ÿผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐannotation class์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์˜ต์…˜์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

ํ•„์š”์— ๋”ฐ๋ผ ์„ค์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค!

์ด๋ฆ„  ์„ค๋ช…
@Target  ์–ด๋…ธํ…Œ์ด์…˜์„ ๋‹ฌ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์„ฑ ์š”์†Œ ์„ ์ •(์–ด๋–ค๊ฒƒ์œผ๋กœ ์‚ฌ์šฉํ• ๊ฑด์ง€)

ex)
@Target(AnnotationTarget.TYPE)
var type: String
@Retention ์–ด๋…ธํ…Œ์ด์…˜์ด ๋‚จ์•„์žˆ๋Š” ๋‹จ๊ณ„๋ฅผ ์„ ์ •ํ•ฉ๋‹ˆ๋‹ค.
(์†Œ์Šค(SOURCE), ์ปดํŒŒ์ผ ํƒ€์ž„(BINARY), ๋Ÿฐํƒ€์ž„(RUNIME) ์ค‘)

ex)
@Retention(AnnotationRetention.RUNTIME)
var type: String

 

์˜ค๋Š˜์€ ๊ฐ„๋‹จํ•œ ํฌ์ŠคํŒ…์œผ๋กœ ์ฐพ์•„๋ต™์Šต๋‹ˆ๋‹ค. ๐Ÿ˜€

์ด ํฌ์ŠคํŒ…์ด ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ๋งŽ์€ ๋„์›€์ด ๋์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์˜ค๋Š˜๋„ ์ฆ์ฝ”ํ•˜์„ธ์š” :)

 

๋Œ“๊ธ€์ˆ˜0