함수형 프로그래밍 2-8

컬렉션

함수형 프로그래밍에서는 불변 자료구조를 사용한다. 불변 자료구조는 객체의 상태 변화를 미연에 방지해서 부수효과를 근본적으로 방지한다. 코틀린에서는 mutable 과 immutable 를 구분해서 사용한다.

리스트

비어 있거나 동일한 타입의 값들을 여러 개 넣을 수 있는 자료구조다.

class ListTest {

    @Test
    fun plusListItem(){
        val list = listOf(1,2,3,4,5)
        val newList = list.plus(6)

        println(list)    //[1, 2, 3, 4, 5]
        println(newList) //[1, 2, 3, 4, 5, 6]
    }

    @Test
    fun addListItem(){
        val list = mutableListOf(1,2,3,4,5)
        println(list) //[1, 2, 3, 4, 5]
        list.add(6)
        println(list) //[1, 2, 3, 4, 5, 6]
    }

}

위의 차이점은 plus는 새로운 리스트를 반환 하지만 add는 해당 리스트에 추가로 아이템을 더해 준다.

세트

리스트와 동일한 타입의 값들을 여러 개 넣을 수 있다는 점에서 리스트와 유사하나 중복값이 들어갈 수 없다는 점이 리스트와 다르다.

class SetTest {
    @Test
    fun testSet() {
        val set = setOf("1", "2", "3")
        println(set) //[1, 2, 3]
        val newSet = set.plus("4")
        println(newSet) //[1, 2, 3, 4]

        val mutableSet = mutableSetOf("1", "2", "3")
        println(mutableSet) //[1, 2, 3]
        mutableSet.add("4")
        println(mutableSet) //[1, 2, 3, 4]
        mutableSet.add("4")
        println(mutableSet) //[1, 2, 3, 4]
    }
}

4를 두번 더했지만 4는 한번만 들어 간다.

코틀린에서는 키와 값을 가진 자료구조인 Pair 를 제공한다. 맵은 키와 값인 Pair 를 여러개 가진 자료구조이다.

class MapTest {

    @Test
    fun testMap() {
        val map1 = mapOf(1 to "One", 2 to "Two")
        val map2 = map1.plus(3 to "Three")

        println(map1) //{1=One, 2=Two}
        println(map2) //{1=One, 2=Two, 3=Three}

        val mutableMap = mutableMapOf(1 to "One", 2 to "Two")
        println(mutableMap)  //{1=One, 2=Two}
        mutableMap[3] = "Three" // mutableMap.put(3,"Three") 와 같다.
        println(mutableMap)  //{1=One, 2=Two, 3=Three}
    }
}

맵도 마찬가지로 plus는 새로운 맵을 반환 하지만 put은 해당 맵에 추가로 아이템을 더해 준다.