๊พธ์ค€ํ•จ์ด ์ง„๋ฆฌ๋‹ค!!

์–ด์ œ๋ณด๋‹ค ๋ฐœ์ „ํ•œ ์˜ค๋Š˜์ด ๋˜๊ณ ํ”ˆ ๐Ÿง‘๐Ÿปโ€๐Ÿ’ป ์˜ ๋ธ”๋กœ๊ทธ

Tutorial/tutorial

[Kotlin] ์ฝ”ํ‹€๋ฆฐ ์—ฌ๋Ÿฌ๊ฐ€์ง€ Collection์— ๋Œ€ํ•˜์—ฌ

๋ށ์š” 2022. 9. 29. 20:39

์•ˆ๋…•ํ•˜์„ธ์š”

์˜ค๋Š˜์€ ํฌ์ŠคํŒ…ํ•  ๋‚ด์šฉ์€ ์ฝ”ํ‹€๋ฆฐ Collection์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

์ฒ˜์Œ ๋ธ”๋กœ๊ทธ์— ํฌ์ŠคํŒ… ํ–ˆ๋˜ ๋‚ด์šฉ์ด Array์˜ ์‚ฌ์šฉ๋ฒ•์ด์—ˆ๋Š”๋ฐ.. 

Collection์— ๋Œ€ํ•ด์„œ๋„ ์ข€ ๋” ๊ณต๋ถ€ํ•˜๊ฒŒ ๋˜์–ด ์ด๋ ‡๊ฒŒ ํฌ์ŠคํŒ…ํ•ฉ๋‹ˆ๋‹ค :)

Collection(์ปฌ๋ ‰์…˜)์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•˜๊ณ  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ํด๋ž˜์Šค , ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ , ํ•จ์ˆ˜๋“ค์˜ ๋ชจ์ž„

์ด๋ผ๊ณ  ์„ค๋ช… ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

Collection์„ ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋ฉด ์ ˆ๋Œ€ ๋น ์งˆ ์ˆ˜ ์—†๋Š” 1๊ฐ€์ง€!

๋ฐ”๋กœ Gneneric(์ œ๋„ค๋ฆญ)์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด Generic(์ œ๋„ค๋ฆญ)์ด๋ž€?

ํด๋ž˜์Šค ๋˜๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ํƒ€์ž…์„ ์™ธ๋ถ€์—์„œ ์ธ์ž๋กœ ๋ฐ›๊ณ  ํ•„์š”ํ•˜๋ฉด ๋ฆฌํ„ด ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ํƒ€์ž…์„ ์ œํ•œ ์ œํ•œํ•ด์คŒ์œผ๋กœ์จ ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ์ด ํ™•๋ณด๋œ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

/**
	'< T >'๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ T์—๋Š” ๋ชจ๋“  type์ด ๋“ค์–ด ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
*/

val list = arrayListOf()<String>

var map : MutableMaP<Int , String> = mutableMapOf()

 

Generic์„ ์‚ฌ์šฉํ•  ๋•Œ ๊ด€๋ก€์ ์ธ ์˜ˆ์•ฝ์–ด๋“ค์ด ์žˆ๋Š”๋ฐ ์ฐธ๊ณ ๋กœ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํŒŒ๋ผ๋ฏธํ„ฐ ์˜ˆ์•ฝ์–ด
T type
R Result , Return
E Element
N Number
K Key
V Value

 

์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์œ„ํ•ด ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

interface Stackable<T> { //Stack ์ธํ„ฐํŽ˜์ด์Šค
    fun pop() : T
    fun push(value : T)
    fun size() : Int
}

 

์œ„ ์ฝ”๋“œ๋Š” Stack์˜ ๊ฐ„๋‹จํ•œ ๋™์ž‘๋“ค์„ ์ •์˜ํ•ด๋†“์€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ œ๋„ค๋ฆญ์„ ํ†ตํ•ด ํ•ด๋‹น Stack์ด ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์„ ์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ์—๋Š” Stack์„ ์‚ฌ์šฉํ•  ๋•Œ ๊ผญ ์ œ๋„ค๋ฆญ์˜ ํƒ€์ž…์„ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ๋Š” ํƒ€์ž…์„ ์ถ”๋ก ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

class StackImpl<T> : Stackable<T> { // Stack ๊ตฌํ˜„
    private val stack = arrayListOf<T>()
    private var index = -1
    override fun pop(): T {
        var ret : T? = null
        when(index){
            -1 -> println("stack is empty!!")
            else -> {
                ret = stack[index]
                stack.removeAt(index)
                index--
            }
        }
        return ret ?: throw ArrayIndexOutOfBoundsException()
    }

    override fun size(): Int {
        return stack.size
    }

    override fun push(value: T) {
        stack.add(value)
        index++
    }

}

 

fun main() {
	// ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉ์‹œ์— ํƒ€์ž…์„ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
    val stringStack : StackImpl<String> = StackImpl() 
    val integerStack : StackImpl<Int> = StackImpl()

    for(i in 1 .. 10){
        //stringStack.push(i) String ํƒ€์ž…์„ ๋ฐ›์•„์•ผ ํ•˜๊ธฐ์— Error ๋ฐœ์ƒ
        integerStack.push(i)
    }

    for(i in 1.. integerStack.size()){
        println(integerStack.pop())
    }

 

 

์œ„ ์™€ ๊ฐ™์ด ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ

type mismatch์™€ ๊ฐ™์€ ์—๋Ÿฌ๋ฅผ ์žก์•„์ค€๋‹ค๋Š” ๋ถ€๋ถ„์—์„œ ๋งค์šฐ ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿซข

 

์ด์–ด์„œ Collection์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์ž๋ฉด 

Collection์€ ํฌ๊ฒŒ 2๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๋ฐ”๋กœ Mutable & Immutable ๋ฐฉ์‹์˜ ๊ตฌํ˜„์ฒด๋“ค์ž…๋‹ˆ๋‹ค.

 

์ด ๋‘˜์˜ ์ฐจ์ด๋Š” ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์ƒ์„ฑ ์ดํ›„ ๋ณ€ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•œ์ง€ ๋ถˆ๊ฐ€๋Šฅํ•œ์ง€์— ์—ฌ๋ถ€์— ์žˆ์Šต๋‹ˆ๋‹ค.

Immutable Collection์˜ ๊ฒฝ์šฐ ์ƒ์„ฑ ํ›„ ์ค‘๊ฐ„์— ์‚ฝ์ž… ๋ฐ ์‚ญ์ œ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

var mutableList : MutalbeList<Int> = mutableListOf()

val list : List<Int> = listOf(1, 2, 3)

var index = 0

mutableList.add(1) // ๊ฐ€๋Šฅ
// list.add(1) or list[0] = 2 ๋Š” ๋ถˆ๊ฐ€ํ•˜๋‹ค Error!!

// ์ฝ๊ธฐ๋Š” ๋‘˜ ๋‹ค ๊ฐ€๋Šฅ
index = mutableList.get(0)

index = list[1]

๋Œ€ํ‘œ์ ์ธ Collection์œผ๋กœ๋Š” List , Set , Map์ด ์กด์žฌํ•˜๋ฉฐ 

 

List๋Š” index๊ฐ€ ์กด์žฌํ•˜๊ณ  ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜๋ฉฐ index๋ฅผ ํ†ตํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•„์š”๋กœ ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

fun main() {
    val list : ArrayList<Int> = arrayListOf()

    for(i in 1..10){
        list.add(i)
    }
    for(i in 0 until list.size){
        println(list.get(i))
    }
}

 

Set์€ index๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

โœ”๏ธ ์—ฌ๊ธฐ์„œ '์ค‘๋ณต'์ด๋ž€ equals(๊นŠ์€ ๋น„๊ต)์™€ hashCode์˜ ๊ฐ’์„ ๋น„๊ต ์‹œ์— true์ธ ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

 

fun main() {
    val set : MutableSet<String> = mutableSetOf()

    set.run {
        add("์‚ฌ๊ณผ")
        add("์˜ค๋ Œ์ง€")
        add("๋ฐ”๋‚˜๋‚˜")
        add("์‚ฌ๊ณผ")// ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ์— ๊ฐ™์€ ๊ฐ’์€ ํ•˜๋‚˜๋งŒ ์ž…๋ ฅ๋œ๋‹ค.
    }

    val iterator : Iterator<String> = set.iterator()

    while(iterator.hasNext()){ 
    // index๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ์— iterator ํ˜น์€ forEach๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’๋“ค์— ์ ‘๊ทผํ•œ๋‹ค.
        println(iterator.next())
    }
}

 

์ค‘๋ณต๋œ ๊ฐ’์€ ํ•˜๋‚˜๋งŒ ์ž…๋ ฅ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ Map์€ key, value๋ฅผ ํ•œ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ

Key๊ฐ’์€ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ณ  value์˜ ๊ฐ’์€ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

fun main() {
    val map : MutableMap<Int , String> = mutableMapOf()

    map.run {
        put(1 , "์‚ฌ๊ณผ")
        put(2 , "์˜ค๋ Œ์ง€")
        put(3 , "๋ฐ”๋‚˜๋‚˜")
        put(1 , "ํŒŒ์ธ์—ํ”Œ") // ์ค‘๋ณต๋œ key๊ฐ’์€ value๊ฐ’์ด ๋‹ค๋ฅผ ๊ฒฝ์šฐ ์ถ”๊ฐ€ ์ž…๋ ฅ์„ ํ•˜์ง€ ์•Š๊ณ  replace๋จ
        put(4 , "ํŒŒ์ธ์—ํ”Œ")
    }

    map.forEach{
    	// ์•„๋ž˜์™€ ๊ฐ™์ด map์€ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ key , value๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
        println("${it.key},${it.value}")
    }
}

๊ฐ™์€ Key๊ฐ’์ด ์ถ”๊ฐ€๋กœ ์‚ฝ์ž… ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

์ด์ƒ์œผ๋กœ Collection์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

 

์˜ค๋Š˜๋„ ์ฆ์ฝ” ํ•˜์„ธ์š” ๐Ÿคฉ