์ „์ฒด ๊ธ€ (165)

๋ฐ˜์‘ํ˜•
10
10

ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ์ •์˜

fun <T> joinToString(
        collection: Collection<T>,
        separator: String,
        prefix: String,
        postfix: String
): String {

    val result = StringBuilder(prefix)

    for ((index, element) in collection.withIndex()) {
        if (index > 0) result.append(separator)
        result.append(element)
    }

    result.append(postfix)
    return result.toString()
}
 

ํ•จ์ˆ˜์— ๊ด€ํ•ด ์–˜๊ธฐํ•˜๋Š” ์ด๋ฒˆ 3์žฅ์—์„œ ๊ณ„์† ์‚ฌ์šฉ๋  ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋‹ค. ๊ตฌ๋ถ„์ž๋ฅผ ๋ฐ›์•„์„œ ์•ž๋’ค๋กœ “(“, “)”๋ฅผ ๋ถ™์—ฌ์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋‹ค.

ํ•˜๋‚˜ ํ•˜๋‚˜ ์‚ดํŽด๋ณด์ž.

์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ์ธ์ž์— ์ด๋ฆ„์„ ๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค. ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ separator = "." ์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์ธ์ž๋ฅผ ๋„ฃ์–ด ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ค‘๊ฐ„์—๋งŒ ๋„ฃ์„ ์ˆ˜๋Š” ์—†๊ณ , ๋ช…๋ช…ํ•œ ์ธ์ž ์ดํ›„๋กœ๋Š” ๋ชจ๋‘ ์ด๋ฆ„์„ ๋ถ™์—ฌ ํ˜ธ์ถœํ•ด์•ผ๋œ๋‹ค๋Š” ๊ทœ์น™์ด ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ธ์ž๋ฅผ ํ™•์‹คํžˆ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์–ด ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ธ์ž๋ฅผ ๊ฐ–๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํ˜ผ๋™์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

์ธ์ž์— ์ด๋ฆ„์„ ๋ถ™์ด๋Š” ํ–‰๋™์€ ๋””ํดํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ์—ฐ๊ฒฐ๋˜๋Š”๋ฐ, ํ•จ์ˆ˜ ์„ ์–ธ์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๊ฐ’์„ ์ง€์ •ํ•ด๋‘๋ฉด ํ•ด๋‹น ์ธ์ž์— ๊ฐ’์ด ๋“ค์–ด์˜ค์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋ฏธ๋ฆฌ ์ง€์ •ํ•ด๋‘” ๊ฐ’์œผ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ ์ž…๋ ฅ๊ฐ’์„ ๋Œ€์‹ ํ•œ๋‹ค. ์ด๊ฒƒ์„ ๋””ํดํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ผ๊ณ  ํ•˜๋ฉฐ, ๋””ํดํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์ด๋ฆ„๋ถ™์—ฌ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆœ์„œ์™€ ๊ด€๊ณ„์—†์ด ์ธ์ž๋ฅผ ์ „๋‹ฌ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์ตœ์ƒ์œ„ ํ•จ์ˆ˜์™€ ์ตœ์ƒ์œ„ ํ”„๋กœํผํ‹ฐ

์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ํ•จ์ˆ˜๋ฅผ ๊ผญ ํด๋ž˜์Šค์•ˆ์˜ ๋ฉ”์„œ๋“œ๋กœ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๊ทธ๋ƒฅ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์„œ ํ•จ์ˆ˜๋ฅผ ์ ์œผ๋ฉด ๋˜๊ณ , ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด์žˆ๋Š” ํŒŒ์ผ์˜ ํŒจํ‚ค์ง€๋งŒ importํ•ด์ฃผ๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ด๊ฒŒ ๊ฐ€๋Šฅํ• ๊นŒ? ๊ทธ ์ด์œ ๋Š” ์ฝ”ํ‹€๋ฆฐ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ตœ์ƒ์œ„ํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด์žˆ๋Š” ํŒŒ์ผ์„ ์ปดํŒŒ์ผ ํ•  ๋•Œ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ JVM์— ๋„˜๊ฒจ์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

package ch03.JoinToString

fun <T> joinToString(
       ...
){ ... }
 

์ด๋Ÿฐ์‹์œผ๋กœ ์ •์˜ํ•˜๊ณ , ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฝ”ํ‹€๋ฆฐ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ƒ์„ฑํ•œ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค์˜ ์ด๋ฆ„์€ ํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด์žˆ๋˜ ํŒŒ์ผ๊ณผ ๋Œ€์‘ํ•˜๊ณ , ์ตœ์ƒ์œ„ ํ•จ์ˆ˜๋Š” ์ •์  ํ•จ์ˆ˜๋กœ ์กด์žฌํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฐ ๋ชจ์–‘์€ ํ•จ์ˆ˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ”„๋กœํผํ‹ฐ๋„ ๊ฐ€๋Šฅํ•œ๋ฐ, ํด๋ž˜์Šค ๋ฒ”์œ„ ๋ฐ–์—์„œ const val๋กœ ์ƒ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š”๊ฒŒ ๊ทธ ์˜ˆ์‹œ๋‹ค. const val์€ ์ž๋ฐ”์˜ public static final๋กœ ์ปดํŒŒ์ผ๋œ๋‹ค. ๋‹จ const ๋Š” primitiveํƒ€์ž…๋“ค๊ณผ, String ํƒ€์ž…๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ™•์žฅํ•จ์ˆ˜์™€ ํ™•์žฅ ํ”„๋กœํผํ‹ฐ

ํ™•์žฅํ•จ์ˆ˜

ํ™•์žฅํ•จ์ˆ˜๋Š” ๊ธฐ์กด API๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ํด๋ž˜์Šค ๋ฐ–์—์„œ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ฉ”์„œ๋“œ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋‹ค. ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

fun String.lastChar(): Char = this.get(this.length - 1)
 

Stringํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•ด์„œ ๋งŒ๋“  lastChar()ํ•จ์ˆ˜๋‹ค. Stringํด๋ž˜์Šค ๊ฐ์ฒด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค. ์ด๋•Œ ํ™•์žฅํ•  ํด๋ž˜์Šค ์ด๋ฆ„(์—ฌ๊ธฐ์„œ๋Š” String)์„ ์ˆ˜์‹  ๊ฐ์ฒด ํƒ€์ž…(receiver type)์ด๋ผ๊ณ  ํ•˜๊ณ  this.get()์—์„œ ์‚ฌ์šฉ๋˜๋Š” this๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๋Œ€์ƒ ๊ฐ’์œผ๋กœ ์ˆ˜์‹  ๊ฐ์ฒด(receiver object)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์ฆ‰ ์ˆ˜์‹ ๊ฐ์ฒด๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๊ฐ์ฒด๋ผ๊ณ ๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ™•์žฅํ•จ์ˆ˜๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์ˆ˜์‹ ๊ฐ์ฒด๋ฅผ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰์‹œ์ ์˜ ๋ถ€๊ฐ€๋น„์šฉ์ด ๋“ค์ง€ ์•Š๋Š”๋‹ค.

์œ„ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ๋œ this๋Š” ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋œ ๊ฒƒ์ด์ง€ ํ•จ์ˆ˜ ๋ณธ๋ฌธ์—์„œ ์ƒ๋žต๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋ ‡๊ฒŒ ํด๋ž˜์Šค ๋ฐ–์—์„œ ์ •์˜๋œ ํ™•์žฅํ•จ์ˆ˜๋Š” ์บก์Аํ™”๋ฅผ ๊นฐ๊นŒ? ์ •๋‹ต์€ “๊นจ์ง€์•Š๋Š”๋‹ค”์ด๋‹ค. ํ™•์žฅํ•จ์ˆ˜๋Š” ํด๋ž˜์Šค์˜ private, protected ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ธฐ๋•Œ๋ฌธ์— ์บก์Аํ™”๋ฅผ ์ง€ํ‚ค๊ณ  ์žˆ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋งŒ๋“  ํ™•์žฅํ•จ์ˆ˜๋Š” importํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

import string.lastChar
import string.*
 

์•„๋ž˜ ์œ„ ๋ชจ๋‘ ํ™•์žฅํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” import๊ตฌ๋ฌธ์ด๋‹ค. ํ™•์žฅํ•จ์ˆ˜์™€ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์˜ ํ•จ์ˆ˜๊ฐ€ ์ด๋ฆ„์ด ๊ฒน์น˜๋ฉด as๋ฅผ ์ด์šฉํ•ด ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ํ™•์žฅํ•จ์ˆ˜๋ฅผ ๋ณ„๋ช…์ง€์–ด ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๋งˆ๋ƒฅ ์ข‹์„ ๊ฒƒ ๊ฐ™์€ ํ™•์žฅํ•จ์ˆ˜๋„ ๋ชปํ•˜๋Š”๊ฒŒ ์žˆ๋Š”๋ฐ, ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด๋‹ค. ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ setOnClickListener์˜ object๋กœ View์˜ onClick์ด ์˜ค๋ฒ„๋ผ์ด๋”ฉ๋˜๋Š”๋ฐ, ์ด๋Ÿฌ๋ฉด ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•œ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฑด ํด๋ž˜์Šค ์•ˆ์— ๋“ค์–ด์žˆ๋Š” ๊ฒƒ์ด๋ผ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๊ณ , ํ™•์žฅํ•จ์ˆ˜๋Š” ํด๋ž˜์Šค ๋ฐ–์— ์žˆ์–ด์„œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•  ์ˆ˜ ์—†๋‹ค. ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ๋™์ ์œผ๋กœ ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ์ด ๋ฐ˜ํ•ด ํ™•์žฅํ•จ์ˆ˜๋Š” ์ˆ˜์‹ ๊ฐ์ฒด, ์ˆ˜์‹ ๊ฐ์ฒด ํƒ€์ž…์— ์˜ํ•ด ์ •์ ์œผ๋กœ ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

val view: View = Button()
    view.showOff()
 

view๋ณ€์ˆ˜๋Š” Viewํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— View์˜ ํ™•์žฅํ•จ์ˆ˜ showOff๋ฅผ ์‹คํ–‰ํ•˜์ง€ Button์˜ showOff๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค. view: Button ์ด์—ˆ๋‹ค๋ฉด Button์˜ showOff๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๊ฒƒ์ด๋‹ค.

ํ™•์žฅ ํ”„๋กœํผํ‹ฐ

ํ™•์žฅ ํ”„๋กœํผํ‹ฐ๋Š” ํ•จ์ˆ˜ํ˜•ํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ ํ”„๋กœํผํ‹ฐ ํ˜•ํƒœ๋กœ ์ •์˜ํ•˜๋Š” ํ•จ์ˆ˜๋ผ๊ณ  ๋ณด๋Š” ๊ฒŒ ํŽธํ•˜๋‹ค. ์ธ์Šคํ„ด์Šค์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•  ์ˆ˜์—†๊ณ  ๋‹จ์ง€ ํ”„๋กœํผํ‹ฐ ๋ฌธ๋ฒ•๋งŒ ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ™•์žฅํ•จ์ˆ˜๋ฅผ ํ”„๋กœํผํ‹ฐ ๋ฌธ๋ฒ•์œผ๋กœ ๋ฐ”๊พธ๋ ค๋ฉด get()์„ ์ด์šฉํ•ด์•ผํ•œ๋‹ค. ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์—†์–ด backing field๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— get()์œผ๋กœ ๊ฒŒํ„ฐ๋ฅผ ์ •์˜ํ•ด์ค˜์•ผํ•˜๋ฉฐ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ set()์„ ์ด์šฉํ•ด ๊ฐ„๋‹จํ•œ ์กฐ์ž‘๋„ ๊ฐ€๋Šฅํ•˜๊ธดํ•˜๋‹ค. ์•„๋ž˜๊ฐ€ ๊ทธ ์˜ˆ์‹œ๋‹ค.

var StringBuilder.lastChar: Char
    get() = get(length - 1)
    set(value: Char) {
        this.setCharAt(length - 1, value)
    }
 

Collection

์ฝ”ํ‹€๋ฆฐ์˜ ์ปฌ๋ ‰์…˜์€ ์ž๋ฐ” ์ปฌ๋ ‰์…˜์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ๊ฑฐ๊ธฐ์— ํ™•์žฅํ•จ์ˆ˜๋กœ ์ฝ”ํ‹€๋ฆฐ์—์„œ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” API๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฒƒ์ด๋‹ค.

varargs

์ด๊ฑด ์ต์ˆ™ํ•œ ํ‘œํ˜„์ด๋‹ค. ๊ฐ€๋ณ€๊ธธ์ด ์ธ์ž์ธ๋ฐ, ์›ํ•˜๋Š” ๋งŒํผ ๊ฐ’์„ ๋„ฃ์–ด ์ธ์ž๋กœ ๋„˜๊ธฐ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฐฐ์—ด์— ๊ฐ’์„ ๋„ฃ์–ด ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋ฐฐ์—ด์„ ๊ฐ€๋ณ€์ธ์ž๋กœ ๋„˜๊ธธ๋•Œ๋Š” ์ฝ”ํ‹€๋ฆฐ๊ณผ ์ž๋ฐ”๊ฐ€ ๋‹ค๋ฅธ๋ฐ, ์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ์ „๋‹ฌํ•  ๋ฐฐ์—ด ์•ž์— ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž์ธ *๋ฅผ ๋ถ™์ด๋ฉด ์›์†Œ๋“ค์„ ํŽผ์ณ์„œ ์ธ์ž๋กœ ๋„ฃ์–ด์ค€๋‹ค.

val list = listOf("args: ", *args)
 

์ค‘์œ„ํ˜ธ์ถœ๊ณผ ๊ตฌ์กฐ ๋ถ„ํ•ด

mapOf(a to b)์—์„œ a๋Š” key, b๋Š” value๋กœ ๋งตํ•‘๋˜์–ด ์ €์žฅ๋œ๋‹ค. ์ด๋•Œ ์‚ฌ์šฉ๋˜๋Š” to๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ(ํ™•์žฅํ•จ์ˆ˜๋‹ค)์ด๊ณ , ์ค‘์œ„ํ˜ธ์ถœ(infix)๋กœ ์‚ฌ์šฉ๋œ ๊ฒƒ์ด๋‹ค. ์ˆ˜์‹ ๊ฐ์ฒด to ์œ ์ผํ•œ ๋ฉ”์„œ๋“œ ์ธ์ž๋กœ ๋˜๋Š”๋ฐ toํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜์ด Pair์ž„์„ ์•Œ๋ฉด ๊ตฌ์กฐ๋ถ„ํ•ด๊นŒ์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. Pair๋Š” ์ž๋ฐ”์—๋Š” ์—†๋Š” ๊ฐœ๋…์ธ๋ฐ ์ˆœ์„œ์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

val (num, name) = 1 to "one"
 

์œผ๋กœํ•˜๋ฉด num์— 1, name์— one์ด ๋“ค์–ด๊ฐ€๋Š”๋ฐ, ์ด๊ฑธ ๊ตฌ์กฐ๋ถ„ํ•ด์„ ์–ธ, destructuring declaration์ด๋ผ๊ณ  ํ•œ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๊ตฌ์กฐ๋ถ„ํ•ด์„ ์–ธ์„ ์‚ฌ์šฉํ–ˆ๋‹ค. for๋ฌธ์—์„œ ์‚ฌ์šฉํ•œ .withIndex()๊ฐ€ ๊ทธ ์ •์ฒด๋‹ค.

to๊ฐ€ map์—์„œ ์‚ฌ์šฉ๋ผ์„œ map์—์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ๋˜๋Š” ์ค„ ์•Œ ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ์ˆœ์„œ์Œ์ด ํ•„์š”ํ•˜๋ฉด to๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฌธ์ž์—ด๊ณผ ์ •๊ทœ์‹

์ •๊ทœ์‹์€ ๊ผญ ํ•œ๋ฒˆ ์ตํžˆ๊ณ  ๋„˜์–ด๊ฐ€์•ผํ–ˆ๋˜ ๋ถ€๋ถ„์ด๋‹ค. ์ž๋ฐ”์˜ ๋ฌธ์ž์—ด ๋ฉ”์„œ๋“œ ์ค‘ split()์˜ ์ธ์ž๋กœ “.”์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š”๋ฐ, ์ด๊ฑด split์˜ ์ธ์ž๊ฐ€ ์ •๊ทœ์‹์ด๊ณ  .์ด ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •๊ทœ์‹์œผ๋กœ ํ•ด์„๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

import java.util.Arrays;

class Main {
  public static void main(String[] args) {
      String test = "12.51.6262.6515.";
      System.out.println(Arrays.toString(test.split(".")));
  }
} 
 

๋นˆ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋ณธ์„ String์œผ๋กœ ๋ฐ›๊ณ  .toRegex()๋กœ ์ •๊ทœ์‹์ž„์„ ๋ช…์‹œํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์“ฐ๋ฉด ์ •๊ทœ์‹์„ ํ‘œํ˜„ํ•  ๋•Œ \ ์—ญ์Šฌ๋ž˜์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด \\๋กœ ํ‘œํ˜„ํ•˜๋˜๊ฑธ “”” “"”๋ฅผ ์ด์šฉํ•ด ์ด์Šค์ผ€์ดํ”„ ํ•  ๋…ธ๋™์„ ์ค„์ผ ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค. ์ถ”๊ฐ€๋กœ ์‚ผ์ค‘ ๋”ฐ์˜ดํ‘œ์—๋„ ๋ฌธ์ž์—ด ํ…œํ”Œ๋ฆฟ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

์ •๊ทœ์‹ ๋ฌธ๋ฒ•์€ ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์ฐพ์•„์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

๋กœ์ปฌ ํ•จ์ˆ˜

์ฝ”๋“œ ์ค‘๋ณต์„ ์ค„์ด๋Š” ๋ฐฉ๋ฒ• ์ค‘์— ํ•˜๋‚˜์ธ๋ฐ, ํ•จ์ˆ˜์—์„œ ์ถ”์ถœํ•œ ํ•จ์ˆ˜๋ฅผ ์›ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์ค‘์ฒฉ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๊ทธ๋ƒฅ ํ•จ์ˆ˜ ์•ˆ์— ๋˜ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

fun User.validateBeforeSave() {
    fun validate(value: String, fieldName: String) {
        if (value.isEmpty()) {
            throw IllegalArgumentException(
               "Can't save user $id: empty $fieldName")
        }
    }

    validate(name, "Name")
    validate(address, "Address")
}
 

validate๊ฐ€ ๋กœ์ปฌํ•จ์ˆ˜๋‹ค. ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„๋ฅผ ๋ณด๋ฉด ์ ์–ด๋„ validateBeforeSaveํ•จ์ˆ˜, ์ฆ‰ validateํ•จ์ˆ˜ ๋ฐ”๊นฅ์— ์žˆ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ, ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค. ํ•จ์ˆ˜ ์ค‘์ฒฉ์€ 1 depth๊นŒ์ง€๋งŒ ํ•˜๋Š”๊ฒŒ ๊ถŒ์žฅ์‚ฌํ•ญ์ด๋‹ค.

 

 

 

 

"๋Œ“๊ธ€, ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์‹œ๋ฉด ํฐ ํž˜์ด ๋ฉ๋‹ˆ๋‹ค"
๋ฐ˜์‘ํ˜•

'๐Ÿ“–๐Ÿ–‹๏ธ > ์ฝ”ํ‹€๋ฆฐ ์ธ ์•ก์…˜๐Ÿ“–' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Kotlin in action(5)  (0) 2023.10.10
Kotlin in action(4)  (0) 2023.10.10
Kotlin in action(3)  (0) 2023.10.10
Kotlin in action(9)  (0) 2023.10.10
Kotlin in action(1)  (0) 2023.10.10
COMMENT
 
10
10

์ œ๋„ค๋ฆญ์Šค๋ฅผ ์“ฐ๋ฉด ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›๋Š” ํƒ€์ž…์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.(List, Map ๊ณผ ๊ฐ™์€)

์ฝ”ํ‹€๋ฆฐ์€ ๊ฐ’์ด ๋“ค์–ด์˜ค๋Š” ๊ฒƒ์— ๋”ฐ๋ผ ํƒ€์ž…์ธ์ž๋ฅผ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋นˆ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค ๊ฒฝ์šฐ์—๋Š” ํƒ€์ž…์ธ์ž์˜ ํƒ€์ž…์„ ๋ช…์‹œํ•ด์ค˜์•ผํ•œ๋‹ค. ์ž๋ฐ”์—์„œ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์ œ๋„ค๋ฆญ์ด ์—†์—ˆ๊ธฐ์— ํƒ€์ž…์ธ์ž๋ฅผ ๋ช…์‹œํ•˜์ง€์•Š๊ณ  ์„ ์–ธํ•˜๋Š”๊ฒŒ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ฝ”ํ‹€๋ฆฐ์€ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ œ๋„ค๋ฆญ์ด ๋„์ž…๋ผ์„œ ์ถ”๋ก ์„ ํ•˜๊ฒŒ ํ•˜๋˜๊ฐ€, ๋ช…์‹œ๋ฅผ ํ•ด์•ผํ•œ๋‹ค.

์ œ๋„ค๋ฆญ ํ•จ์ˆ˜์™€ ํ”„๋กœํผํ‹ฐ

๋ชจ๋“  ํƒ€์ž…์ธ์ž๋ฅผ ๊ฐ–๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋ฉด, ๋ฐ˜๋“œ์‹œ ํ˜ธ์ถœ์‹œ์ ์— ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์„ ํƒ€์ž…์ธ์ž๋กœ ๋„˜๊ฒจ์ค˜์•ผํ•œ๋‹ค. 

fun <T> List<T>.slice(indices: IntRange) : List<T>

๋ฐ˜ํ™˜ ๊ฐ’๋„ ์ œ๋„ค๋ฆญ, ํƒ€์ž… ์ธ์ž๋„ ์ œ๋„ค๋ฆญ์ด๋‹ค. ์ˆ˜์‹ ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•œ ํ•จ์ˆ˜๋กœ ์ •์˜๋˜์–ด ์žˆ๋‹ค.

 

์ œ๋„ค๋ฆญ ํด๋ž˜์Šค๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ <T>๋ฅผ ์ด์šฉํ•ด ์„ ์–ธํ•œ๋‹ค.

interface Comparable<T> {
    fun compareTo(other: T): Int
}

class String : Comparable<String> {
    override fun compareTo(other: String): Int = /*...*/
}

ํด๋ž˜์Šค์—์„œ Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ, T์— String์„ ๋„ฃ์–ด์„œ ๊ตฌํ˜„ํ–ˆ๋‹ค.

ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ ์ œ์•ฝ

์–ด๋–ค ํƒ€์ž…์„ ์ œ๋„ค๋ฆญ ํƒ€์ž…์˜ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•œ ์ƒํ•œ์œผ๋กœ ์ง€์ •ํ•˜๋ฉด ๊ทธ ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ์ธ์Šคํ„ด์Šคํ™”ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์ž… ์ธ์ž๋Š” ๋ฐ˜๋“œ์‹œ ๊ทธ ์ƒํ•œ ํƒ€์ž…์ด๊ฑฐ๋‚˜ ๊ทธ ์ƒํ•œ ํƒ€์ž…์˜ ํ•˜์œ„ ํƒ€์ž…์ด์–ด์•ผ ํ•œ๋‹ค. ์ƒํ•œ์œผ๋กœ ์ง€์ •ํ•œ๋‹ค๋Š” ์–˜๊ธฐ๋Š” Number๊ฐ™์€ ์ตœ์ƒ์œ„ ํƒ€์ž…์„ ์ง€์ •ํ•  ๋•Œ๋ฅผ ๋งํ•œ๋‹ค.

fun <T : Number> oneHalf(value: T): Double { 
    return value.toDouble() / 10.0
}

์ƒํ•œ์„ ์ง€์ •ํ•˜๋ฉด ์ด๋•Œ๋ถ€ํ„ฐ T๋Š” ์ƒํ•œํƒ€์ž…์œผ๋กœ ๋ณ€ํ•œ๋‹ค.

 

์ด๋Ÿฐ ์ œ์•ฝ์€ ๋‹จ์ผ ์ œ์•ฝ์ด๊ณ , ์—ฌ๋Ÿฌ ์ œ์•ฝ์„ ์ ์šฉํ•˜๊ณ  ์‹ถ์œผ๋ฉด ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ ์ œ์•ฝ ๋ชฉ๋ก์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

fun <T> ensureTrailingPeriod(seq: T) 
    where T : CharSequence, T : Appendable { // <- ์ด ๋ถ€๋ถ„์˜ ์กฐ๊ฑด ๊ฒ€์‚ฌ๊ฐ€ ๋ชฉ๋ก์—ญํ• ํ•จ
    
    }

non-null ํƒ€์ž…์œผ๋กœ ํ•œ์ •ํ•˜๋Š” ๋ฒ•๋„ ์žˆ๋‹ค. ์ƒํ•œ์„ ์ •ํ•˜์ง€์•Š์€ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” Any?๊ฐ€ ๋””ํดํŠธ์ธ๋ฐ, ๊ทธ๋Ÿฌ๋ฉด nullable์ด ๊ธฐ๋ณธ์ด๋‹ค. ํ•ญ์ƒ non-null๋งŒ ์ธ์ž๋กœ ๋ฐ›๊ฒŒํ•˜๋ ค๋ฉด Any๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์จ์„œ ์ƒํ•œ์„ ์ง€์ •ํ•˜๋ฉด๋œ๋‹ค.(Any๊ฐ€ ์•„๋‹ˆ์–ด๋„ non-null type์œผ๋กœ ์ƒํ•œ์„ ์ง€์ •ํ•˜๋ฉด๋œ๋‹ค.)

๊ทธ๋Ÿฌ๋ฉด String?, Int?๋Š” Any?์˜ ์ž์†ํƒ€์ž…์ด์ง€ Any์˜ ์ž์†ํƒ€์ž…์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— null์ด ๋“ค์–ด์˜ค์ง€ ๋ชปํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์‹คํ–‰ ์‹œ ์ œ๋„ค๋ฆญ์Šค ๋™์ž‘

JVM์˜ ์ œ๋„ค๋ฆญ์Šค๋Š” ํƒ€์ž…์†Œ๊ฑฐ(type erasure)๋ฅผ ์‚ฌ์šฉํ•ด ๊ตฌํ˜„๋œ๋‹ค. ์‹คํ–‰์‹œ์ ์— ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์— ํƒ€์ž…์ธ์ž ์ •๋ณด๊ฐ€ ์กด์žฌํ•˜์ง€์•Š๋Š”๋ฐ, ์ด๊ฑธ inlineํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ํƒ€์ž…์ธ์ž๊ฐ€ ๋Ÿฐํƒ€์ž„์‹œ์ ์— ์ง€์›Œ์ง€์ง€ ์•Š๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ ์‹ค์ฒดํ™”(reify)๋ผ๊ณ  ํ•œ๋‹ค. ํƒ€์ž…์†Œ๊ฑฐ์˜ ์žฅ์ ์œผ๋กœ๋Š” ์ €์žฅํ•ด์•ผํ•˜๋Š” ํƒ€์ž…์ •๋ณด ํฌ๊ธฐ๊ฐ€ ์ค„์–ด์„œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ธ๋‹ค๋Š” ๊ฒƒ์ด ์žˆ๋‹ค.

์‹คํ–‰์‹œ์ ์— ์ œ๋„ค๋ฆญ์Šค ์ธ์Šคํ„ด์Šค๋Š” ๊ทธ ์ž์ฒด๋กœ๋งŒ ์žˆ๊ณ , ์–ด๋–ค ์›์†Œํƒ€์ž…์„ ๊ฐ–๋Š”์ง€๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž˜ ๋ณด์žฅํ•ด์ค€๋‹ค.

 

์ด๋ฒˆ์— ํ”„๋กœ์ ํŠธ ๋ฆฌํŒฉํ† ๋งํ•˜๋ฉด์„œ ์ž์ฃผ ๋ณธ ์—๋Ÿฌ์ธ๋ฐ

if (value is List<String>) { ... }
ERROR: Cannot check for instance of erased type

ํƒ€์ž…์†Œ๊ฑฐ๋กœ ์ธํ•ด is ๊ฒ€์‚ฌ์—์„œ ํƒ€์ž…์ธ์ž๋กœ ์ง€์ •ํ•œ ํƒ€์ž…์„ ์‹คํ–‰์‹œ์ ์—์„œ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋‹ค. ์ด๊ฑธ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ณ ์น˜๋ ค๋ฉด 

if (value is List<*>)

ํƒ€์ž…์ธ์ž ํƒ€์ž…์„ *(์Šคํƒ€ํ”„๋กœ์ ์…˜)์œผ๋กœ ๋ฐ”๊ฟ”์•ผํ•œ๋‹ค. as ์บ์ŠคํŒ…์—์„œ๋Š” ๋นŒ๋“œ๋Š” ํ—ˆ์šฉํ•˜์ง€๋งŒ ๊ฒฝ๊ณ ๋ฌธ๊ตฌ๊ฐ€ unchecked cast๋ผ๊ณ  ๋‚˜์˜ค๊ธดํ•˜๋‹ˆ ์ฃผ์˜ํ•ด์•ผํ•œ๋‹ค.

 

์‹ค์ฒดํ™”

์ œ๋„ค๋ฆญ ํ•จ์ˆ˜์˜ ๋ณธ๋ฌธ์—์„œ ๊ทธ ํ•จ์ˆ˜์˜ ํƒ€์ž…์ธ์ž๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ inline ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์ด๊ฒŒ ์ธ๋ผ์ธ ํ•จ์ˆ˜๊ฐ€ ์œ ์šฉํ•œ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ธ ํƒ€์ž…์ธ์ž ์‹ค์ฒดํ™”์ด๋‹ค.

์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋ฅผ ์ธ๋ผ์ธ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค๊ณ , ํƒ€์ž…ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ reified๋กœ ์ง€์ •ํ•˜๋ฉด ์‹คํ–‰์‹œ์ ์— ํƒ€์ž… ๊ฒ€์‚ฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

inline fun <reified T> isA(value: Any) = value is T

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ธ๋ผ์ธํ•จ์ˆ˜์˜ ๋ณธ๋ฌธ์„ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ํ˜ธ์ถœ ์ง€์ ์— ๋‹ค ๋ถ™์—ฌ๋ฒ„๋ฆฐ๋‹ค. ์ด๋•Œ reified๋œ ์ธ์ž๋ฅผ ํ˜ธ์ถœ ์ง€์ ์—์„œ ๋‹ค ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰์‹œ์ ์— ํƒ€์ž… ๊ฒ€์‚ฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

java.lang.Class ํƒ€์ž…์ธ์ž๋ฅผ ๋ฐ›๋Š” ๊ฒฝ์šฐ ์‹ค์ฒดํ™”๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ•œ๋‹ค.

ClassName::class.java๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋„ฃ๋Š” ๊ฒฝ์šฐ์ธ๋ฐ, ์ด๊ฑธ inline๊ณผ reified๋ฅผ ์ด์šฉํ•ด ๋ฐ”๊ฟ”๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

inline fun <reified T: Activity> Context.startActivity() {
	val intent = Intent(this, T::class.java)
    startActivity(intent)
}

::๋Š” ํด๋ž˜์Šค ์ฐธ์กฐํ•  ๋–„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, 10์žฅ์— ๋ฆฌํ”Œ๋ ‰์…˜ ๋•Œ ์ž์„ธํžˆ ๋‚˜์˜จ๋‹ค๊ณ ํ•œ๋‹ค.

 

์‹ค์ฒดํ™”๋„ ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒŒ ์žˆ๋‹ค.

  • ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
  • ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ ํด๋ž˜์Šค์˜ ๋™๋ฐ˜ ๊ฐ์ฒด ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ
  • ์‹ค์ฒดํ™”ํ•œ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์š”๊ตฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ์‹ค์ฒดํ™”ํ•˜์ง€ ์•Š์€ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์€ ํƒ€์ž…์„ ํƒ€์ž… ์ธ์ž๋กœ ๋„˜๊ธฐ๊ธฐ
  • ํด๋ž˜์Šค, ํ”„๋กœํผํ‹ฐ, ์ธ๋ผ์ธ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ reified๋กœ ์ง€์ •ํ•˜๊ธฐ(์ด๊ฑด ์–ด๋А ์ •๋„ ์˜ˆ์ƒํ–ˆ๋‹ค)

๋งˆ์ง€๋ง‰ ์ œ์•ฝ์ด ์žˆ์œผ๋ฏ€๋กœ, ์„ฑ๋Šฅ์ƒ์˜ ์ด์œ ๋‚˜ ์ธ๋ผ์ด๋‹๋˜๋Š” ๊ณผ์ •์—์„œ ๋žŒ๋‹ค๋ฅผ ์ธ๋ผ์ด๋‹ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด noinline์„ ๋ถ™์—ฌ์„œ ์ธ๋ผ์ด๋‹์„ ๊ธˆ์ง€ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ณ€์„ฑ variance - ๋ฌด๊ณต๋ณ€, ๊ณต๋ณ€์„ฑ, ๋ฐ˜๊ณต๋ณ€์„ฑ

base ํƒ€์ž…์ด ๊ฐ™๊ณ  ํƒ€์ž…์ธ์ž๊ฐ€ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌํƒ€์ž…์ด ์–ด๋–ค ๊ด€๊ณ„์— ๋†“์—ฌ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๋Š” ์ ˆ์ด๋‹ค.

์›์†Œ ๋ณ€๊ฒฝ์ด ์ƒ๊ธด๋‹ค๋ฉด List<String> -> List<Any> ๊ณผ์ •์—์„œ ํƒ€์ž… ๋ถˆ์ผ์น˜๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์–ด์„œ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด ์•ˆ์ „ํ•˜๋‹ค.

์ œ๋„ค๋ฆญ์ด ์•„๋‹Œ ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ ํƒ€์ž…์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ์˜ˆ์‹œ๋กœ String ํด๋ž˜์Šค๋Š” String, String? ๋‘ ํƒ€์ž…์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค์ธ ๊ฒฝ์šฐ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ตฌ์ฒด์ ์ธ ํƒ€์ž… ์ธ์ž๋กœ ๋ฐ”๊ฟ”์ค˜์•ผํ•˜๋ฉฐ List๋Š” ํƒ€์ž…์ด ๋  ์ˆ˜ ์—†์ง€๋งŒ ์—ฌ์ „ํžˆ ํด๋ž˜์Šค์ด๊ณ , List<String>๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ํƒ€์ž…์ด๋‹ค.

 

์ƒํ•œ ๊ฐœ๋…์—์„œ ๋‚ด๋ ค์™€์„œ, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ณ€์ˆ˜๋Œ€์ž…/ ํ•จ์ˆ˜์ธ์ž ์ „๋‹ฌ ์‹œ ํ•˜์œ„ ํƒ€์ž…๊ฒ€์‚ฌ๋ฅผ ๋งค๋ฒˆ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ด๋•Œ ๋ณดํ†ต์˜ ๊ฒฝ์šฐ๋Š” ํ•˜์œ„ํƒ€์ž… == ํ•˜์œ„ ํด๋ž˜์Šค ์ด์ง€๋งŒ(non-null -> nullable๊ฐ€๋Šฅ, ๊ทธ ๋ฐ˜๋Œ€๋Š” ๋ถˆ๊ฐ€๋Šฅ) ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ๋ฅผ ๋ณด์ž.

์ธ์Šคํ„ด์Šคํ™” ํ•  ๋•Œ MutableList<A> MutableList<B>์—์„œ A์™€ B์˜ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ํ•˜์œ„ํƒ€์ž…๊ด€๊ณ„๊ฐ€ ์„ฑ๋ฆฝํ•˜์ง€์•Š๋Š” ๊ฒฝ์šฐ ๊ทธ๋•Œ ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ๋ฌด๊ณต๋ณ€(invariant)์ด๋ผ๊ณ  ํ•œ๋‹ค. 

๋‹ค์‹œ ๋งํ•˜๋ฉด B๊ฐ€ A์˜ ํ•˜์œ„ํƒ€์ž…์ด์ง€๋งŒ MutableList<B>๋Š” MutableList<A>์˜ ํ•˜์œ„ํƒ€์ž…์ด ์•„๋‹Œ ๊ฒƒ์„ ๋ฌด๊ณต๋ณ€์ด๋ผ๊ณ  ํ•œ๋‹ค.

List<T>์˜ ๊ฒฝ์šฐ์—๋Š” ์ฝ”ํ‹€๋ฆฐ์—์„œ ์ฝ๊ธฐ์ „์šฉ ์ปฌ๋ ‰์…˜์ธ๋ฐ, List<A>, List<B>๋Š” ํ•˜์œ„ํƒ€์ž…๊ทœ์น™์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ์ด๋•Œ๋Š” ๊ณต๋ณ€(covariant)์ ์ด๋ผ๊ณ  ๋งํ•œ๋‹ค.

 

์ œ๋„ค๋ฆญ ํด๋ž˜์Šค(์ธํ„ฐํŽ˜์ด์Šค๋„ ๋‹น์—ฐํžˆ ํฌํ•จ)๊ฐ€ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•ด ๊ณต๋ณ€์ ์ž„์„ ๋‚˜ํƒ€๋‚ด๋ ค๋ฉด ํŒŒ๋ผ๋ฏธํ„ฐ ์•ž์— out์„ ํ‘œ๊ธฐํ•ด์•ผํ•œ๋‹ค. ์ด๊ฒŒ ๊ณต๋ณ€์ ์ด๋ผ๊ณ  ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. 

interface Producer<out T> {
    fun produce(): T
}

ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ณต๋ณ€์ ์œผ๋กœ ๋งŒ๋“ค๋ฉด ์ด ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ํ•จ์ˆ˜ ์ธ์ž๋‚˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

๋ชจ๋“  ๊ณณ์— ๊ณต๋ณ€์ ์œผ๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ์ง€๋งŒ ๊ณต๋ณ€์ ์ผ๋•Œ ์•ˆ์ „ํ•˜์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ณต๋ณ€์ ์œผ๋กœ ์ง€์ •ํ•˜๋ฉด ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ๊ทธ ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ด ์ œํ•œ๋˜๋Š”๋ฐ, ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ์œ„ํ•ด์„œ๋Š” ์ƒ์‚ฐ(read)์œผ๋กœ ๊ณ ์ •๋˜๊ณ  ์†Œ๋น„(write)๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์ด๋‹ค.

https://livebook.manning.com/book/kotlin-in-action/chapter-9/17

์ƒ์‚ฐ/ ์†Œ๋น„ ๋„์‹์ด๋‹ค. in์—์„œ Tํƒ€์ž… ๊ฐ’์„ ์†Œ๋น„ํ•˜๊ณ , out์—์„œ Tํƒ€์ž… ๊ฐ’์„ ์ƒ์‚ฐํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ณต๋ณ€์ ์œผ๋กœ ์„ ์–ธํ•˜๋ ค๋ฉด out์œ„์น˜์— ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์•ˆ์ „ํ•˜๋‹ค.

out ํ‚ค์›Œ๋“œ์˜ ์˜๋ฏธ๊ฐ€ ์ด์ œ ํ™•์‹คํ•ด์กŒ๋‹ค.

  1. ๊ณต๋ณ€์„ฑ
  2. T๋ฅผ ์•„์›ƒ์œ„์น˜์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ์‚ฌ์šฉ์ œํ•œ

์ƒ์„ฑ์ž ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” in/out ์–ด๋А์ชฝ์—๋„ ์†ํ•˜์ง€์•Š๋Š”๋‹ค. ๊ทธ ์ด์œ ๋Š” ์ƒ์„ฑ์ž๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ• ๋•Œ ํ˜ธ์ถœ๋˜์ง€ ๊ทธ ์ดํ›„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋‹ค๋งŒ ์ƒ์„ฑ์ž ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ”„๋กœํผํ‹ฐ๋กœ ๋งŒ๋“ ๋‹ค๋ฉด ๊ทธ๊ฑด in/out์— ์†ํ•œ๋‹ค.

 

๋˜ ๋ณ€์„ฑ๊ทœ์น™์€ ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ์˜ ์•ˆ์ „์„ฑ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•จ์ด๋ฏ€๋กœ public, protected, internal ํด๋ž˜์Šค์—๋งŒ ์ ์šฉ๋˜๊ณ  ํด๋ž˜์Šค ๋‚ด๋ถ€์—๋งŒ ์œ ํšจํ•œ private์—๋Š” ์ ์šฉ๋˜์ง€์•Š๋Š”๋‹ค.

 

https://livebook.manning.com/book/kotlin-in-action/chapter-9/17

๋ฐ˜๊ณต๋ณ€์„ฑ(contravariance)๋Š” ๊ณต๋ณ€์„ฑ์„ 180๋„ ๋’ค์ง‘์–ด ๋‘” ๊ฒƒ์ด๋‹ค. 

๊ณต๋ณ€์„ฑ์ด ์ƒ์‚ฐ์ž(read) ๊ด€์ ์—์„œ ๋‚˜์˜จ๊ฒƒ์ด๋ผ๋ฉด ๋ฐ˜๊ณต๋ณ€์„ฑ์€ ์†Œ๋น„์ž(write)๊ด€์ ์ด๋‹ค. ๋”ฐ๋ผ์„œ inํ‚ค์›Œ๋“œ์˜ ์œ„์น˜๊ฐ€ ๋ฐ˜๊ณต๋ณ€์„ฑ์˜ ํ•ต์‹ฌ์ด๊ณ  ํƒ€์ž…์ธ์ž์˜ ํ•˜์œ„ํƒ€์ž…๊ด€๊ณ„๊ฐ€ ๋’ค์ง‘ํ˜€์„œ ์ œ๋„ค๋ฆญ ์ธ์ž๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

 

์ง€๊ธˆ๊นŒ์ง€ ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•˜๋ฉด์„œ ๋ณ€์„ฑ์„ ์ง€์ •ํ–ˆ๋‹ค. ์ด๊ฑธ ์„ ์–ธ์ง€์  ๋ณ€์„ฑ์ด๋ผ๊ณ  ํ•˜๊ณ , ํŠน์ • ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” ์ง€์ ์—์„œ ๋ณ€์„ฑ์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฑธ ์‚ฌ์šฉ์ง€์  ๋ณ€์„ฑ์ด๋ผ๊ณ  ํ•œ๋‹ค.

fun <T> copyData(src: MutableList<out T>)

 ํ˜ธ์ถœ ์ง€์ ์— out์„ ๋ถ™์—ฌ์„œ Tํƒ€์ž…์„ out์— ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ๋งŒ ํ˜ธ์ถœํ•œ๋‹ค๊ณ  ์„ ์–ธํ•ด๋ฒ„๋ฆฐ ์˜ˆ์‹œ๋‹ค. ์ด๋•Œ MutableList๋Š” ์ œ์•ฝ์„ ๊ฐ€ํ•ด์ง„ ํƒ€์ž…์œผ๋กœ ๋ฐ”๋€Œ๋ฉฐ ์ด๊ฑธ ํƒ€์ž… ํ”„๋กœ์ ์…˜์ด๋ผ๊ณ  ํ•œ๋‹ค. 

์Šคํƒ€ ํ”„๋กœ์ ์…˜

์ œ๋„ค๋ฆญ ํƒ€์ž… ์ธ์ž ์ •๋ณด๊ฐ€ ์—†์Œ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์Šคํƒ€ ํ”„๋กœ์ ์…˜์„ ์‚ฌ์šฉํ•˜๊ณ , ์›์†Œ ํƒ€์ž…์ด ์•Œ๋ ค์ง€์ง€ ์•Š์€ ๋ฆฌ์ŠคํŠธ๋Š” List<*> ๋ผ๋Š” ๊ตฌ๋ฌธ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์•ž์„œ ์˜ˆ์‹œ๋กœ ๋ดค๋‹ค.

์ค‘์š”ํ•œ ๋ช‡๊ฐ€์ง€๋ฅผ ์งš๊ณ  ๊ฐ€๋ฉด *์˜ ์ •ํ™•ํ•œ ์˜๋ฏธ๊ฐ€ ์–ด๋–ค ์ •ํ•ด์ง„ ํƒ€์ž…์˜ ์›์†Œ๋ฅผ ๋‹ด์ง€๋งŒ ๊ทธ ์›์†Œ์˜ ํƒ€์ž…์„ ์ •ํ™•ํžˆ ๋ชจ๋ฅธ๋‹ค๋Š” ๊ฒƒ์ด์ง€ MutableList<*> == MutableList<Any?>๋กœ ๋Œ€์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ๋Š” ์ ์ด๋‹ค.

fun printFirst(list: List<*>) {  // ๋ชจ๋“  ๊ตฌ์ฒด์  ํƒ€์ž…์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. 
    if (list.isNotEmpty()) { // isNotEmpty()์—์„œ๋Š” T๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. 
        println(list.first()) // first()๋Š” ์ด์ œ Any?๋ฅผ ๋ฐ˜ํ™˜. 
    }
}

ํ”„๋กœ์ ์…˜์ด ๋ถ™๋Š” ์ด์œ ๋Š” *๊ฐ€ out Any?์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฐ˜๋Œ€๋กœ in์ผ๋•Œ ์Šคํƒ€ํ”„๋กœ์ ์…˜์„ ์ง€์ •ํ•˜๋ฉด ์†Œ๋น„๋Œ€์ƒ์ด ์–ด๋–ค T์ธ์ง€ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— in Nothing์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค. ๋˜ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‹œ๊ทธ๋‹ˆ์ฒ˜์—์„œ ์ „ํ˜€ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ธฐ๋Š” ํ•˜์ง€๋งŒ ๊ทธ ํƒ€์ž…์—๋Š” ๊ด€์‹ฌ์ด ์—†๋Š” ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ํƒ€์ž… ์ธ์ž ์ •๋ณด๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š์„ ๋•Œ๋„ ์Šคํƒ€ ํ”„๋กœ์ ์…˜ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜์‘ํ˜•

'๐Ÿ“–๐Ÿ–‹๏ธ > ์ฝ”ํ‹€๋ฆฐ ์ธ ์•ก์…˜๐Ÿ“–' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Kotlin in action(5)  (0) 2023.10.10
Kotlin in action(4)  (0) 2023.10.10
Kotlin in action(3)  (0) 2023.10.10
Kotlin in action(2)  (1) 2023.10.10
Kotlin in action(1)  (0) 2023.10.10
COMMENT
 
10
10

์ฝ”ํ‹€๋ฆฐ ์ธ ์•ก์…˜ ์ฑ…์œผ๋กœ ์Šคํ„ฐ๋””๋ฅผ ํ•˜๊ฒŒ ๋๋Š”๋ฐ, ๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๊ฒƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž˜ ๊ธฐ๋กํ•ด๋‘˜ ๊ณ„ํš์ด๋‹ค.

๊ฐœ์š”

์ฝ”ํ‹€๋ฆฐ์€ ์ •์ ํƒ€์ž… ์ง€์ •์–ธ์–ด๋‹ค

์ •์  ํƒ€์ž…(statically typed) ์ง€์ •์ด๋ผ๋Š” ๋ง์€ ๋ชจ๋“  ๊ตฌ์„ฑ์š”์†Œ์˜ ํƒ€์ž…์„ ์ปดํŒŒ์ผ ๋•Œ ์•Œ ์ˆ˜ ์žˆ๊ณ , ๊ฐ์ฒด์˜ ํ•„๋“œ/๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉ ์‹œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํƒ€์ž…์„ ๊ฒ€์ฆํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. ๋™์  ํƒ€์ž…์€ ํƒ€์ž…๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋ชจ๋“  ๊ฐ’์„ ๋ณ€์ˆ˜์— ๋„ฃ์„ ์ˆ˜ ์žˆ๊ณ , ๊ฒ€์ฆ์‹œ์ ์ด ์‹คํ–‰์‹œ์ ์ด๋‹ค. Groovy๊ฐ€ ๋Œ€ํ‘œ์ ์ธ๋ฐ, ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ๋Š” ํ™•์‹คํ•œ ์žฅ์ ์ด์ง€๋งŒ ์ปดํŒŒ์ผ ์‹œ ๊ฑธ๋Ÿฌ๋‚ด์ง€ ๋ชปํ•˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ์‹คํ–‰์‹œ์ ์— ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ๊ฐ ์žฅ๋‹จ์ ์ด ์žˆ๋‹ค.

์ •์ ํƒ€์ž… ์ง€์ •์–ธ์–ด์˜ ์žฅ์ ์€ ์„ฑ๋Šฅ, ์‹ ๋ขฐ์„ฑ(์ปดํŒŒ์ผ๋Ÿฌ ๊ฒ€์ฆ), ์œ ์ง€๋ณด์ˆ˜์„ฑ, ๋„๊ตฌ ์ง€์› ๋“ฑ์ด ์žˆ๋‹ค.

์ฝ”ํ‹€๋ฆฐ์€ ์ž๋ฐ”์™€ ๊ฐ™์€ ์ •์  ํƒ€์ž… ์ง€์ • ์–ธ์–ด์ง€๋งŒ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฌธ๋งฅ์œผ๋กœ ํƒ€์ž…์„ ์ถ”๋ก ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํƒ€์ž… ๋ช…์‹œ๊ฐ€ ๋”ฐ๋กœ ํ•„์š”ํ•˜์ง„ ์•Š์ง€๋งŒ ์œ ์ง€ ๋ณด์ˆ˜์‹œ ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ๋ช…์‹œ๋ฅผ ํ•ด ์ฃผ๋Š”๊ฒŒ ๋” ์ข‹์€ ๋ฐฉํ–ฅ์ด๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์ฝ”ํ‹€๋ฆฐ์€ nullable type์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ์‹œ null ๊ฒ€์‚ฌ๋ฅผ ๊ฑฐ์น  ์ˆ˜ ์žˆ๋‹ค. ๋˜ function type์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•œ๋‹ค. ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ ๊ฐœ๋ฐœ์—์„œ๋„ ์ด ์žฅ์ ์€ ์œ ํšจํ•œ๋ฐ, null์„ ์ถ”์ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— NPE(NullPointerException)์˜ ๋นˆ๋„๋ฅผ ํ™• ์ค„์ผ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

์ฒ˜์Œ ์ ‘ํ–ˆ์„ ๋•Œ ๊ต‰์žฅํžˆ ๋‚œํ•ด ํ–ˆ๋Š”๋ฐ, ํฌ๊ฒŒ 3๊ฐ€์ง€ ํŠน์ง•์ด ์žˆ๋‹ค.

  • ํ•จ์ˆ˜๋Š” ์ผ๊ธ‰์‹œ๋ฏผ(์ผ๋ฐ˜ ๊ฐ’์ฒ˜๋Ÿผ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค. ์‹ฌ์ง€์–ด ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋‹ค.)
  • ๋ถˆ๋ณ€์„ฑ
  • side effect ์—†์Œ(์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ)

์ด๋Ÿฐ ํŠน์ง•์€ ๊ฐ„๊ฒฐ์„ฑ์„ ์‚ด๋ ค์ค˜ ์ค‘๋ณต์„ ์ค„์—ฌ์ฃผ๊ณ , ๋™๊ธฐํ™” ๊ฑฑ์ •์ด ์—†์–ด์„œ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ์—์„œ ์‚ฌ์šฉ์‹œ ์•ˆ์ „ํ•˜๋‹ค๋Š” ์ ์ด๋‹ค. ๋˜ ์ˆœ์ˆ˜ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ ์€ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ํŽธํ•˜๋‹ค๋Š” ์žฅ์ ๋„ ์žˆ๋‹ค.

์ฝ”ํ‹€๋ฆฐ ์ฒ ํ•™

์‹ค์šฉ์„ฑ, ๊ฐ„๊ฒฐ์„ฑ, ์•ˆ์ „์„ฑ, ์ƒํ˜ธ์šด์šฉ์„ฑ์ด ์žˆ๋Š”๋ฐ, ๊ฐ ํ•ญ๋ชฉ์„ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋ดค๋‹ค.

 

์‹ค์šฉ์„ฑ:

์ด๋ฏธ ๋‹ค๋ฅธ ์–ธ์–ด๊ฐ€ ๊ฒ€์ฆํ•œ ํ•ด๋ฒ•๊ณผ ๊ธฐ๋Šฅ๋“ค์„ ๋‹ต์Šตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”ํ‹€๋ฆฐ์„ ๋ฐฐ์šฐ๋Š”๋ฐ ์ˆ˜๊ณ ๊ฐ€ ์ค„๊ณ , IDE์— ์ข‹์€ ๋„๊ตฌ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์—(์ปดํŒŒ์ผ๋œ ์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ ์ฝ๊ธฐ์™€ ๊ฐ™์€) ์‹ค์šฉ์ ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ„๊ฒฐ์„ฑ:

๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ๋ฅผ ์ž๋ฐ”์— ๋น„ํ•ด ๋งŽ์ด ์ค„์˜€๋‹ค. getter, setter๋Š” ๋ฌผ๋ก ์ด๊ณ  data class์™€ ๊ฐ™์€ ํŠน์ˆ˜ ํด๋ž˜์Šค, ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด ์ฝ”๋“œ์˜ ๊ฐ„๊ฒฐํ•จ์„ ์œ ์ง€ํ•œ๋‹ค.

์•ˆ์ „์„ฑ:

์šฐ์„  ์–ด๋А์ •๋„ ์•ˆ์ „์„ฑ์ด JVM์„ ๋”ฐ๋ฅด๊ธฐ๋•Œ๋ฌธ์— ์ž…์ฆ๋˜์–ด์žˆ๊ณ , ์—ฌ๊ธฐ์„œ NPE์— ๋Œ€ํ•œ ์•ˆ์ „์„ฑ์ด ์ถ”๊ฐ€๋œ ๊ฒƒ์ด๋‹ค.

์ƒํ˜ธ ์šด์šฉ์„ฑ:

์ž๋ฐ”์˜ ๊ธฐ์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๋‹ค ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ์ž๋ฐ”์™€ ์ฝ”ํ‹€๋ฆฐ์ด ์„ž์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š”๋ฐ ์•„๋ฌด๋Ÿฐ ์žฅ์• ๊ฐ€ ๋˜์ง€์•Š๋Š”๋‹ค.

์ปดํŒŒ์ผ ๊ณผ์ •

.kt๋กœ ์ €์žฅ๋œ ํŒŒ์ผ์„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผ์„ ๋งˆ์น˜๋ฉด .classํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค. .classํŒŒ์ผ์€ .jar๋ฅผ ํ†ตํ•ด ํŒจํ‚ค์ง•๊ณผ์ •์„ ๊ฑฐ์ณ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‹คํ–‰๋œ๋‹ค. ์ฝ”ํ‹€๋ฆฐ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•œ ํŒŒ์ผ์€ ์ฝ”ํ‹€๋ฆฐ ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜์กดํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ”ํ‹€๋ฆฐ์œผ๋กœ ์ปดํŒŒ์ผ ๋œ ์•ฑ์„ ๋ฐฐํฌํ•  ๋•Œ๋Š” ์ฝ”ํ‹€๋ฆฐ ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ๊ฐ™์ด ๋ฐฐํฌํ•ด์•ผ๋˜๋Š”๋ฐ, gradle๊ณผ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ์•ฑ ํŒจํ‚ค์ง€ ์‹œ์ ์— ์ฝ”ํ‹€๋ฆฐ ๋Ÿฐํƒ€์ž„์„ ํฌํ•จ์‹œ์ผœ์ค€๋‹ค. ์ด๋Ÿฌ๋ฉด ์šฉ๋Ÿ‰์ด ์ปค์ง€๋Š” ๊ฒŒ ์•„๋‹๊นŒ? ๋‹คํ–‰ํžˆ ์ฝ”ํ‹€๋ฆฐ ๋Ÿฐํƒ€์ž„ ์‹œ์Šคํ…œ์˜ ์šฉ๋Ÿ‰์€ ์ž‘๊ธฐ ๋•Œ๋ฌธ์— ํฌํ•จ ์ „๊ณผ ํ›„์˜ ์šฉ๋Ÿ‰ ์ฐจ์ด๊ฐ€ ํฌ๊ฒŒ ๋‚˜์ง€ ์•Š๋Š”๋‹ค.

์—ฌ๊ธฐ์„œ ํ•œ๋ฒˆ์ฏค์€ ๊ถ๊ธˆํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ์ฝ”ํ‹€๋ฆฐ์€ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ  fun main(){ }์œผ๋กœ ๋ฐ”๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์ง„์ž…์ ์„ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ธฐ๋ณธ ์š”์†Œ๋“ค

ํ•จ์ˆ˜

fun foo(param: Int): String{
    return if(param>10) "BIG" else "SMALL"
}
 

ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ด๋ฆ„ ๋’ค์— ํƒ€์ž…์„ ๋ช…์‹œํ•œ๋‹ค.

์ฝ”ํ‹€๋ฆฐ์˜ if๋Š” ๋ฌธ(statement)์ด ์•„๋‹ˆ๋ผ ์‹(expression)์ด๋‹ค. ์ฆ‰ ๊ฐ’์„ ๋ฐ˜ํ™˜ ํ•  ์ˆ˜ ์žˆ๊ณ  ๋‹ค๋ฅธ ์‹์˜ ํ•˜์œ„ ์š”์†Œ๋กœ ์—ฐ์‚ฐ์— ๊ด€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ž๋ฐ”์˜ if๋Š” ๋ฌธ์ด์ง€๋งŒ ์ฝ”ํ‹€๋ฆฐ์˜ if๋Š” ์‹์ด๋‹ค.

fun foo(param:Int) = if(param>10) "A" else "B"
 

ํ•จ์ˆ˜๊ฐ€ ์‹์„ ๋ณธ๋ฌธ์œผ๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ๊ฒฝ์šฐ ๋ฐ˜ํ™˜ํƒ€์ž…์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ณ€์ˆ˜

val, var๋กœ ๋‚˜๋‰˜๋Š”๋ฐ, val๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” immutableํ•˜๊ณ , var๋Š” mutableํ•˜๋‹ค. val๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์€ ์ž๋ฐ”์˜ final ๋ณ€์ˆ˜๋กœ ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค. ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™” ํ•  ๋•Œ๋Š” ๋ณ€์ˆ˜ ํƒ€์ž…์ด ํ•„์š” ํ•  ์ˆ˜๋„, ์—†์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™”๋ฅผ ํ•œ๋‹ค๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํƒ€์ž…์ถ”๋ก ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ดˆ๊ธฐํ™” ์‹œ์ ์ด ์„ ์–ธ์‹œ์ ๋ณด๋‹ค ํ›„๋ผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํƒ€์ž…์ถ”๋ก ์„ ํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ์ดˆ๊ธฐํ™”๋ฅผ ๋‚˜์ค‘์— ํ•  ๊ฒฝ์šฐ ํƒ€์ž…๋ช…์‹œ๊ฐ€ ๊ผญ ํ•„์š”ํ•˜๋‹ค.

์ฒ˜์Œ ์ฝ”ํ‹€๋ฆฐ์„ ์ ‘ํ•  ๋•Œ ๋“ค์—ˆ๋˜ ์˜๋ฌธ์ธ๋ฐ

val arr = arrayListOf("a","b")
 

arr์€ immutableํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ arr.add(“c”)๋กœ ์กฐ์ž‘์ด ๊ฐ€๋Šฅํ•œ๋ฐ, ์™œ ๊ทธ๋Ÿด๊นŒ.

val ์ฐธ์กฐ ์ž์ฒด๋Š” ๋ถˆ๋ณ€์ด๋‹ค. ํ•˜์ง€๋งŒ ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๊นŒ์ง€๋Š” val๊ฐ€ ๊ด€์—ฌํ•˜์ง€์•Š๊ธฐ ๋•Œ๋ฌธ์— arr๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ ์—ฐ์‚ฐ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

๋ณ€์ˆ˜๋ฅผ ๋ฌธ์ž์—ด ์•ˆ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œ๊ธฐํ•œ๋‹ค. ์ด๋ฅผ ๋ฌธ์ž์—ด ํ…œํ”Œ๋ฆฟ์ด๋ผ๊ณ  ํ•œ๋‹ค.

print("Hello, $name")
print("Hello, ${name}")
 

์ด๋Ÿฐ์‹์œผ๋กœ $๋ฅผ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š”๋ฐ, ์ค‘๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด์ฃผ๋Š” ๊ฒŒ ์ข‹๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ณ€์ˆ˜์˜ ๋ฒ”์œ„๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ธ์‹ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ํ•œ๊ธ€๊ณผ ์˜๋ฌธ๋ณ€์ˆ˜๋ฅผ ๋ถ™์—ฌ ์“ธ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋‚ด๊ฒŒ ๋˜๋ฏ€๋กœ ์ค‘๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๊ถŒ์žฅ๋œ๋‹ค. ๋ณ€์ˆ˜ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‹๋„ ์ค‘๊ด„ํ˜ธ์— ๋„ฃ์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋กœํผํ‹ฐ

์ž๋ฐ” ํด๋ž˜์Šค์—์„œ์˜ ํ•„๋“œ์™€ ๊ฒŒํ„ฐ, ์„ธํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ๋ฌถ์–ด์„œ ์ฝ”ํ‹€๋ฆฐ ํ”„๋กœํผํ‹ฐ๊ฐ€ ํƒ„์ƒํ–ˆ๋‹ค. val๋กœ ์„ ์–ธํ•œ ํ”„๋กœํผํ‹ฐ๋Š” ์ฝ๊ธฐ์ „์šฉ, var๋กœ ์„ ์–ธํ•œ ํ”„๋กœํผํ‹ฐ๋Š” ์“ฐ๊ธฐ์ „์šฉ์ด๋‹ค. ๋”ฐ๋ผ์„œ val๋Š” ๊ฒŒํ„ฐ๋งŒ ๊ฐ–๊ณ , var๋Š” ๋‘˜๋‹ค ๊ฐ–๋Š”๋‹ค.

์ฝ”ํ‹€๋ฆฐ์˜ ํ”„๋กœํผํ‹ฐ๋„ ๊ธฐ๋ณธ์œผ๋กœ getter๊ฐ€ ์žˆ์ง€๋งŒ, ์ด๊ฑธ ์ปค์Šคํ…€ ํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ ์ด ํ”„๋กœํผํ‹ฐ๋ฅผ backing field๋ผ๊ณ  ํ•˜๋ฉฐ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๊ทธ๋•Œ ๊ทธ๋•Œ ๊ณ„์‚ฐํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ• ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฐ ๊ฐ’๋งŒ ๋ชจ์•„๋‘” ํด๋ž˜์Šค๋ฅผ value object๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์ž๋ฐ”์—์„œ getter์™€ setter๋กœ ์ ์ฒ ๋œ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” data class๋ผ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๊ฐ€ ์žˆ๋‹ค.

val isSquare: Boolean
    get(){
        return h == w
    }
 

get()์„ ๋ถ™์—ฌ ์„ ์–ธํ•˜๋ฉด ์ปค์Šคํ…€ ์ ‘๊ทผ์ž๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค. ์ด ํ”„๋กœํผํ‹ฐ๋Š” h์™€ w๊ฐ€ ๊ฐ™์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๋‹ค.

enum๊ณผ when

enum์€ ์—ด๊ฑฐํ˜• ํƒ€์ž…์ด๊ณ , when์€ ๋ถ„๊ธฐ ๋ฌธ๋ฒ•์ด๋‹ค.

enum class Color{
    RED, ORANGE, BLUE
}
 

enum class ๋ผ๋Š” ํ‚ค์›Œ๋“œ๋กœ enum๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.

enum class ์•ˆ์— ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋•Œ ์ฝ”ํ‹€๋ฆฐ์—์„œ ์œ ์ผํ•˜๊ฒŒ ์„ธ๋ฏธ์ฝœ๋ก ์ด ์‚ฌ์šฉ๋œ๋‹ค. enum ์ƒ์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ, ์ƒ์ˆ˜ ๋ชฉ๋ก ๊ฐ€์žฅ ๋์— ์„ธ๋ฏธ์ฝœ๋ก ์œผ๋กœ ๊ตฌ๋ณ„ ์ง€์–ด์ค˜์•ผ ๋ฉ”์„œ๋“œ ์ •์˜ ๋ถ€๋ถ„์„ ์ธ์‹ํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ๋งŒ๋“  enum ๊ฐ์ฒด๋Š” when์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ธ๋‹ค.

when์— enum ํƒ€์ž…์„ ๋„ฃ์œผ๋ฉด, enum์— ์ •์˜๋œ ๊ฐ’์œผ๋กœ๋งŒ when branch๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค. ๋น ์ ธ์žˆ์œผ๋ฉด ์ปดํŒŒ์ผ์—๋Ÿฌ๊ฐ€ ์ผ์–ด๋‚˜๊ณ , else๊ฐ€ ํ•„์š”์—†์–ด ์œ ์ง€๋ณด์ˆ˜์— ์ข‹๋‹ค.

 

when ์—ญ์‹œ ๋ฐ˜ํ™˜๊ฐ’์„ ๋„์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์‹์ด๊ณ , switch์™€ ๋น„์Šทํ•˜์ง€๋งŒ ๋”์šฑ ์œ ์—ฐํ•˜๊ฒŒ ์ž‘๋™ํ•œ๋‹ค.

when(input){
    a -> "A"
    b,c -> "B"
    1...5 -> "NUM"
    else -> "O" 
}
 

when์€ break๋ฅผ ๋”ฐ๋กœ ์ ์–ด์ค„ ํ•„์š”๊ฐ€ ์—†๊ณ , ๋น„๊ต ๊ฐ’์˜ ํƒ€์ž…์ด ๋‹ฌ๋ผ๋„ ๋˜๊ณ , ๋ฒ”์œ„๋กœ ๋น„๊ตํ• ์ˆ˜๋„ ์žˆ๊ณ , ์—ฌ๋Ÿฌ๊ฐœ ๊ฐ’๊ณผ ๋งค์น˜ํ•ด ๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค. ์•„์ฃผ ์œ ์—ฐํ•˜๋‹ค.

setOf()๋ฅผ ์‚ฌ์šฉํ•ด ์ง‘ํ•ฉ์œผ๋กœ ๋น„๊ต๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด ๋ง์€ ๊ฐ์ฒด ๋น„๊ต๊ฐ€ ๋œ๋‹ค๋Š” ๋ง์ด๋‹ค. when์€ ์ธ์ž๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋  ๋•Œ๋Š” ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ”๋กœ ์กฐ๊ฑด๋ถ„๊ธฐ๋กœ ๋Œ๊ณ ๊ณผ ์ธ์ž ์—†์ด๋„ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.

fun foo1(c1: Color, c2: Color) = when((c1 == "R")&&(c2 == "B") -> "P")
 

์ด๋Ÿฐ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰ ๊ฐ ๋ถ„๊ธฐ์˜ ์กฐ๊ฑด์ด booleanํŒ๋ณ„์ด๋ฉด ๊ฐ€๋Šฅํ•œ ๋ฐฉ์‹์ด๋‹ค.

๋ถ„๊ธฐ์— ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜๋ฉด ๋งจ ๋งˆ์ง€๋ง‰ ์ค„์— return์„ ๋ถ™์ด์ง€ ์•Š์•„๋„ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์ธ์‹ํ•œ๋‹ค.

ํƒ€์ž… ์บ์ŠคํŒ…

์Šค๋งˆํŠธ ์บ์ŠคํŠธ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋จธ ๋Œ€์‹  ์บ์ŠคํŒ…์„ ํ•ด์ฃผ๋Š” ๊ฒƒ์œผ๋กœ, is ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด ํƒ€์ž…์„ ์บ์ŠคํŒ…ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ฒ€์‚ฌ๋ฅผ ๋งˆ์นœ ๋ณ€์ˆ˜์˜ ํƒ€์ž…์€ ๊ฒ€์‚ฌ์ดํ›„ ๊ณ„์† ๊ฐ™์€ ํƒ€์ž…์„ ๊ฐ–๋Š”๊ฒƒ์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ธ์‹ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ val๋กœ ์„ ์–ธํ•ด์ค˜์•ผํ•œ๋‹ค.

๋ช…์‹œ์ ์ธ ํƒ€์ž… ์บ์ŠคํŒ…์€ as ํƒ€์ž… ์œผ๋กœ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

iteration

๋ฐ˜๋ณต๋ฌธ์˜ ์‚ฌ์šฉ๋ฒ•์„ ์•Œ๋ ค์ฃผ๋Š” ์ ˆ์ด๋‹ค

for(i in a..b)์™€ ๊ฐ™์€ ๋ฒ”์œ„ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฐฐ์—ด์„ ๋Œ€์ƒ์œผ๋กœ foreach๊ฐ™์ด ๋Œ๋ฆด ์ˆ˜๋„ ์žˆ๋‹ค.

๋ฒ”์œ„ ์ง€์ •์‹œ ..๋Š” ํ•ญ์ƒ [ ] ์ด๋‹ค. a until b ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด [ )๋กœ ๋ ๊ฐ’์„ ํฌํ•จํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ปฌ๋ ‰์…˜์— .withIndext()์™€ ์ธ๋ฑ์Šค ๋ณ€์ˆ˜๋ฅผ ๊ฐ™์ด ๋„ฃ์–ด์ฃผ๋ฉด ๋˜๋Š”๋ฐ

for((idx, i) in list.withIndex()
 

์ด๋•Œ idx๊ฐ€ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๋ฅผ ๋”ฐ๋ผ๊ฐ„๋‹ค.

๋ฐ˜๋ณต๋ฌธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” in์€ ์—ฐ์‚ฐ์ž์ด๋‹ค. ์–ด๋–ค ๊ฐ’์ด ํ•ด๋‹น ๋ฒ”์œ„์— ์†ํ•˜๋Š”์ง€ in์„ ํ†ตํ•ด true/false๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค. when์—์„œ๋„ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์„ ๋ณธ ์ ์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.

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

์˜ˆ์™ธ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ๋˜๋Š” try, throw ๋ฌธ ์—ญ์‹œ ์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ์‹์ด๋‹ค.

val exc = try{
    ..
}catch(e: NumberFormatException){
    // ์˜ˆ์™ธ ๋ฐœ์ƒ
}finally{
    // ๋งˆ๋ฌด
}
 

์˜ˆ์™ธ์ฒ˜๋ฆฌํ•  ๋•Œ๋Š” try~catch~finally๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์˜ˆ์™ธ๋ฅผ ํฌํ•จํ•  ์˜๋ฌด๊ฐ€ ์—†๋‹ค. ์ž๋ฐ”๋กœ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด throws IOException์„ ์‚ฌ์šฉํ•  ๋•Œ๊ฐ€ ์žˆ๋Š”๋ฐ ์ฝ”ํ‹€๋ฆฐ์—๋Š” ๊ทธ ์ž‘์—…์ด ํ•„์š”์—†๋‹ค๋Š” ๋œป์ด๋‹ค.

 

"๋Œ“๊ธ€, ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์‹œ๋ฉด ํฐ ํž˜์ด ๋ฉ๋‹ˆ๋‹ค"
๋ฐ˜์‘ํ˜•

'๐Ÿ“–๐Ÿ–‹๏ธ > ์ฝ”ํ‹€๋ฆฐ ์ธ ์•ก์…˜๐Ÿ“–' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Kotlin in action(5)  (0) 2023.10.10
Kotlin in action(4)  (0) 2023.10.10
Kotlin in action(3)  (0) 2023.10.10
Kotlin in action(2)  (1) 2023.10.10
Kotlin in action(9)  (0) 2023.10.10
COMMENT
 
10
08

https://www.acmicpc.net/problem/10158

 

10158๋ฒˆ: ๊ฐœ๋ฏธ

๊ฐ€๋กœ ๊ธธ์ด๊ฐ€ w์ด๊ณ  ์„ธ๋กœ ๊ธธ์ด๊ฐ€ h์ธ 2์ฐจ์› ๊ฒฉ์ž ๊ณต๊ฐ„์ด ์žˆ๋‹ค. ์ด ๊ฒฉ์ž๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์™ผ์ชฝ ์•„๋ž˜๊ฐ€ (0,0)์ด๊ณ  ์˜ค๋ฅธ์ชฝ ์œ„๊ฐ€ (w,h)์ด๋‹ค. ์ด ๊ณต๊ฐ„ ์•ˆ์˜ ์ขŒํ‘œ (p,q)์— ๊ฐœ๋ฏธ ํ•œ ๋งˆ๋ฆฌ๊ฐ€ ๋†“์—ฌ์žˆ๋‹ค. ๊ฐœ๋ฏธ๋Š” ์˜ค

www.acmicpc.net

import java.io.*;

class Main {
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] map = br.readLine().split(" ");
        int w = Integer.parseInt(map[0]);
        int h = Integer.parseInt(map[1]);
        String[] start = br.readLine().split(" ");
        int p = Integer.parseInt(start[0]);
        int q = Integer.parseInt(start[1]);
        int t = Integer.parseInt(br.readLine());
        // p๊ฐ€ 0, w์— ๋‹ฟ์œผ๋ฉด ๋‹ค์Œ ์ด๋™์€ (๋ฐ˜์ „, ๊ทธ๋Œ€๋กœ) q๊ฐ€ 0,h์— ๋‹ฟ์œผ๋ฉด (๊ทธ๋Œ€๋กœ, ๋ฐ˜์ „)
        int dir = 0; // 0, 1, 2, 3 ์‹œ๊ณ„๋ฐฉํ–ฅ ์ˆœ์„œ๋Œ€๋กœ

        for(int i=0; i<t; i++){
            if(i!=0 && p == Integer.parseInt(start[0]) && q == Integer.parseInt(start[1])){
                if (t%i == 0) break;
                else{
                    t = t%i;
                }
            }
            switch (dir){
                case 0: {
                    // + +
                    p++;
                    q++;
                    if (p == w) dir = bounceX(0);
                    if (q == h) dir = bounceY(0);
                    if(p==w && q==h) dir = 2;
                }
                break;
                case 1: {
                    // + -
                    p++;
                    q--;
                    if (p == w) dir = bounceX(1);
                    if (q == 0) dir = bounceY(1);
                    if(p==w && q==0) dir = 3;
                }
                break;
                case 2: {
                    // - -
                    p--;
                    q--;
                    if (p == 0) dir = bounceX(2);
                    if (q == 0) dir = bounceY(2);
                    if(p==0 && q==0) dir = 0;
                }
                break;
                case 3: {
                    // - +
                    p--;
                    q++;
                    if (p == 0) dir = bounceX(3);
                    if (q == h) dir = bounceY(3);
                    if(p==0 && q==h) dir = 1;
                }
                break;
            }
        }

        System.out.printf("%d %d",p,q);
    }

    static int bounceX(int dir){
        int next = 0;
        switch (dir){
            case 0: {
                // + + ์ด๊ฒŒ ์ด์ „ ์ƒํƒœ, ๋‹ค์Œ ์ƒํƒœ๋กœ ๊ฐ€๋ ค๋ฉด?
                next=3;
                break;
            }
            case 1: {
                // + -
                next=2;
                break;
            }
            case 2: {
                // - -
                next=1;
                break;
            }
            case 3: {
                // - +
                next=0;
                break;
            }
        }
        return next;
    }

    static int bounceY(int dir){
        int next = 0;
        switch (dir){
            case 0: {
                // + + ์ด๊ฒŒ ์ด์ „ ์ƒํƒœ, ๋‹ค์Œ ์ƒํƒœ๋กœ ๊ฐ€๋ ค๋ฉด?
                next=1;
                break;
            }
            case 1: {
                // + -
                next=0;
                break;
            }
            case 2: {
                // - -
                next=3;
                break;
            }
            case 3: {
                // - +
                next=2;
                break;
            }
        }
        return next;
    }
}

์˜ค๋‹ต๋…ธํŠธ(ํ‘ธ๋Š” ๋™์•ˆ ์‚ฌ๊ณ ๊ณผ์ • ๋ฐ ๊ฐœ์„ ์ )

๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ด˜์ด˜ํžˆ ์งœ์„œ ์ง„ํ–‰ ๋ฐฉํ–ฅ์„ ๋ฐ”๊ฟ”์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ค๊ณ„ํ–ˆ๋‹ค... ์˜ˆ์‹œ๋Š” ๋‹ค ๋งž์•˜๊ณ  ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜๋ฒ„๋ ธ๋‹ค.

๋‹ค์‹œ ์ถœ๋ฐœ์ง€์ ์— ๋„์ฐฉํ•˜๋Š” ๊ฒฝ์šฐ๋กœ ์„ค๊ณ„ํ•ด์„œ ์ œ์ถœํ•ด๋ดค์ง€๋งŒ ์—ฌ์ „ํžˆ ์‹œ์ดˆ๊ฐ€ ๋‚ฌ๋‹ค.


์ •๋‹ต์ฝ”๋“œ

import java.io.*;

class Main {
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] map = br.readLine().split(" ");
        String[] start = br.readLine().split(" ");
        int W = Integer.parseInt(map[0]);
        int H = Integer.parseInt(map[1]);
        int P = Integer.parseInt(start[0]);
        int Q = Integer.parseInt(start[1]);
        int T = Integer.parseInt(br.readLine());

        int p = (P + T) % (2 * W);
        int q = (Q + T) % (2 * H);
        if (p > W) p = 2 * W - p;
        if (q > H) q = 2 * H - q;
        System.out.println(p + " " + q);
    }
}

 

๋„์ฐฉํ•˜๋Š” ๊ฒŒ ๋Šฅ์‚ฌ๊ฐ€ ์•„๋‹ˆ๋ผ ์ถœ๋ฐœ์ง€์ ์—์„œ ์ถœ๋ฐœ ๋ฐฉํ–ฅ๋„ ๊ฐ™์„ ๋•Œ๋ฅผ ๊ณ ๋ คํ–ˆ์–ด์•ผ๋๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฃผ๊ธฐ๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•œ๋ฐ, ๊ทธ๋ƒฅ ๋Œ€๊ฐ์„ (์ด๋™)์„ ๊ธฐ์ค€์œผ๋กœ ์ฃผ๊ธฐ๋ฅผ ์žก์œผ๋ ค๋ฉด ๋ฌด์กฐ๊ฑด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚œ๋‹ค.

X, Y์ขŒํ‘œ์˜ ์ฃผ๊ธฐ๋ฅผ ๊ฐ๊ฐ ๊ด€์ฐฐํ•˜๋ฉด,

X๊ฐ€ ๋ฐฉํ–ฅ์ด ๊ฐ™์€ ์ขŒํ‘œ์— ๋„์ฐฉํ•˜๋Š” ์ฃผ๊ธฐ๊ฐ€ p = (T%2W)*N ์ด๊ณ  Y์ขŒํ‘œ๋Š” q = (T%2H)*N ์ด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฃผ๊ธฐ๋ฅผ ๊ตฌํ•  ๋•Œ X์ขŒํ‘œ Y์ขŒํ‘œ๋ฅผ ๋ถ„๋ฆฌ์‹œํ‚ค๋ฉด ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ X, Y ๋‘˜์ค‘ ํฐ ๊ฐ’์œผ๋กœ ๊ท€์†๋˜๋‹ˆ๊นŒ ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜์ง€์•Š๋Š”๋‹ค..!

 

์ถœ๋ฐœ์ง€์ ์ด ์ง€๊ธˆ์€ (0,0)์ด ์•„๋‹Œ๋ฐ ์ถœ๋ฐœ์ง€์ ์„ ์›์ ์œผ๋กœ ๋•ก๊ฒจ์„œ ๋ณด๋ฉด ์ฃผ๊ธฐ๋ฅผ ์•„์ฃผ ๋นจ๋ฆฌ ๊ตฌํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค. ์ด๋•Œ ๋•ก๊ธฐ๋Š” ์ •๋„๊ฐ€ ์ดˆ๊ธฐ ์ขŒํ‘œ๋งŒํผ์ด๊ธฐ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ์กฐ์ ˆ์„ ์ž˜ ํ•ด์•ผํ•œ๋‹ค. p, q ๊ฐ€ W, H ๋ณด๋‹ค ํด ๋•Œ 2*W-p ์ž‘์—…์„ ํ•ด์ฃผ๋Š” ์ด์œ ๊ฐ€ ๊ทธ ๋•Œ๋ฌธ์ด๋‹ค.

 

์œ„ ์ •๋‹ต์ฝ”๋“œ๋Š” ๋†€๋ž๊ฒŒ๋„ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚œ๋‹ค..!

๊ทธ ์ด์œ ๋Š” java ๋ฒ„์ „์— ๋”ฐ๋ฅธ ์˜ค์ฐจ๋กœ, 11๋กœ ํ–ˆ์„๋•Œ๋Š” ์‹œ๊ฐ„์ดˆ๊ณผ, 8๋กœ ํ–ˆ์„๋•Œ๋Š” ๋ฌด์‚ฌํžˆ ์ฑ„์ ์™„๋ฃŒ๊ฐ€ ๋œ๋‹ค.

 

 

"๋Œ“๊ธ€, ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์‹œ๋ฉด ํฐ ํž˜์ด ๋ฉ๋‹ˆ๋‹ค"

 

๋ฐ˜์‘ํ˜•
COMMENT