개발자의 생활

List, Set, Map 컬렉션(Collection) 본문

kotlin(코틀린) 강좌

List, Set, Map 컬렉션(Collection)

Developer성현 2024. 8. 29. 16:44

이번에는 List, Set, Map 인터페이스에 대해 알아보겠습니다.

List와 Set는 Collection인터페이스를 상속받아 만들어진 인터페이스입니다.  하지만 Map은  Collection와 관련은 있지만 상속받은 인터페이스는 아닙니다. 그렇지만 Map은 Collection을 통해 접근이 가능하기 때문에 다른 List와 Set과도 호완이 가능하며 유사한 데이터형이기 때문에 동일한 범주에 들어가 있습니다.

Map 이 Collection 상속을 받지 않았지만 접근이 가능한 이유는 유사한 데이터 구조를 가졌기 때문입니다.

 

그리고 Collection 인터페이스는 immutable타입과, mutable타입이 있습니다.

immutable는 한번 선언하게 되면 길이와 값을 변경하기 못하는 불변속성을 가지고 있습니다.

하지만 mutable 타입은 선언한 후에도 값은 물론이고 길이또한 변경이 가능하다는 특징이 있습니다.

 

믈론 List, Set도 Collection 를 상속받았기에 동일한 특징을 가지고 있으며 Map도 유사한 타입으로 만들어졌기에 동일하게 immutable타입과 mutable이 있습니다.

 

그럼 각각 사용법을 알아보겠습니다.

 

1. (immutable) List, Set, Map

fun main() {
    var intListValue: List<Int> = listOf(0, 1, 2, 3)
    var intSetValue: Set<Int> = setOf(0, 1, 2, 3, 2, 3, 4)
    var intMapValue: Map<Int, Int> = mapOf(0 to 10, 1 to 20, 2 to 30)

    //전체 출력
    println(intListValue)

    println(intSetValue)

    println(intMapValue)

    //지정 인덱스 값 출력
    println(intListValue[0])
    println(intListValue.get(1))

    println(intMapValue[2])
    println(intMapValue.get(1))

    //Set 는 인덱스를 지정할 수 없음(특정 데이터의 존재유무 확인법)
    println(intSetValue.contains(1))
    println(intSetValue.contains(5))
}

기본적인 사용법은 배열과 동일합니다.

각각의 특징들을 살펴보겠습니다.

 

List: 배열과 거의 유사합니다.

 

Ser: 중복된 값을 배제하고 저장하게 됩니다. 하지만 저장된 데이터에 순서가 없기 때문에 인덱스를 지정할 수 없으며 특정 데이터의 존재 유무만 파악할 수 있습니다.

 

Map: [키, 값] 형테로 데이터가 저장됩니다. 키와 값은 각각 정수, 실수, 문자, 문자열 모두 지정이 가능하며 데이터를 읽을 때 키를 통해서만 가져올 수 있습니다. 만약 존재하지 않는 키값을 가져오려고 하면 null이 반환됩니다.

 

2. (mutable) List, Set, Map

1. MutableList

fun main() {
    var intMutableListValue: MutableList<Int> = mutableListOf(0, 1, 2, 3)

    //===================================삽입
    intMutableListValue.add(4)                          // 데이터 삽입
    intMutableListValue.add(1, 5)          //1번 인덱스에 데이터 삽입

    var listValue = listOf(5, 6, 7, 8, 9, 10)
    intMutableListValue.addAll(listValue)               // 리스트 데이터 삽입
    intMutableListValue.addAll(0, listValue)      // 0번째 인덱스에 리스트데이터 삽입

    println(intMutableListValue)// 출력 확인

    //===================================변경
    intMutableListValue[1] = 100                        // 1번째 인덱스값 변경

    println(intMutableListValue)// 출력 확인

    //===================================삭제
    intMutableListValue.remove(10)              // 데이터 10 삭제
    intMutableListValue.removeAt(0)               // 0번째 인덱스 데이터 삭제
    
    println(intMutableListValue)// 출력 확인
    
    var removeList = listOf(0, 1, 2, 3)
    intMutableListValue.removeAll(removeList)           // 리스트에 있는 동일한 모든 데이터 삭제
    
    println(intMutableListValue)// 출력 확인
    
    intMutableListValue.removeIf { i -> (i <= 10) }     // 람다식 조건 데이터 삭제

    println(intMutableListValue)// 출력 확인
}

mutable 타입은 추가, 수정기능이된거 뿐라 초기생성 및 출력기능은 동일합니다.

기능 및 사용법은 주석을 보시면서 직접 실행해 보시면 느낌이 오실 겁니다.

 

추가로 데이터 삽입 삭제에 All 이 있는데 이는 mutable 타입이건 immutable 이건 동일하게 사용이 가능합니다.

그리고 마지막에 람다식이 있는데 이는 아직 배우지 않았기에 몰라도 상관은 없지만 이렇게 사용할 수도 있다는 걸 미리

보여드린 겁니다.

 

2. MutableSet

fun main() {
    var intMutableSetValue: MutableSet<Int> = mutableSetOf(0, 1, 2, 3)

    //===============================삽입
    intMutableSetValue.add(4)
    intMutableSetValue.add(0)

    println(intMutableSetValue)

    var setValue = setOf(0, 1, 2, 3, 4, 5, 6, 7)
    intMutableSetValue.addAll(setValue)

    println(intMutableSetValue)

    //===============================삭제
    intMutableSetValue.remove(0)

    println(intMutableSetValue)

    var removeSet = setOf(3, 4, 5)

    intMutableSetValue.removeAll(removeSet)

    println(intMutableSetValue)
}

Set는 중복된 값은 배제하기 때문에 데이터를 삽입하더라도 동일한 데이터기 이미 존재하면 삽입이 안됩니다.

또한 순서가 존재하지 않기 때문에 특정 위치에 삽입, 삭제가 되지 않습니다.

 

3. MutableMap

fun main() {
    var intMutableMapValue: MutableMap<String, Int> = mutableMapOf("num1" to 1, "num2" to 2, "num3" to 3)

    //===============================삽입
    intMutableMapValue.put("num4", 4)
    intMutableMapValue["num5"] = 5

    println(intMutableMapValue)
    //===============================변경
    intMutableMapValue.put("num1", 10)
    intMutableMapValue["num2"] = 20

    println(intMutableMapValue)
    //===============================삭제

    intMutableMapValue.remove("num1")
    intMutableMapValue.remove("num2", 2)

    println(intMutableMapValue)

}

Map 데이터를 삽입하고 변경하는 방법이 동일합니다. put함수를 이용해서 삽입과 변경이 가능하며 배열 형태처럼 사용도 가능합니다. 가장 큰 특징으로는 기존에 존재하니 않는 키값을 추가한다면 삽입이 되고 이미 존재한다면 데이터 변경이 된다는 것입니다.

삭제는 키값만 입력해고 되고 데이터도 함께 입력해도 되지만 키값은 동일해도 값이 다르면 삭제가 안됩니다.

 

이렇게 List, Set, Map를 알아보았는데요 실무에서도 유용하게 사용할 수 있을 거 같으니 다양하게 해 보면서 익히는 게 좋을 거 같습니다. 그리고 여기서는 다루지 않았지만 삽입, 변경, 삭제 함수들마다 반환값이 있습니다.

직접 한 번씩 함수들의 구조를 보시길 바랍니다.

'kotlin(코틀린) 강좌' 카테고리의 다른 글

조건문, 반복문 (연산자)  (2) 2024.09.09
함수  (0) 2024.08.30
배열 기본 사용법  (0) 2024.08.26
변수  (0) 2024.08.22
kotlin(코틀린) 시작하기  (0) 2024.08.13