본문으로 바로가기

[Kotlin] Collection - List / Set / Map

category Android 2020. 3. 31. 13:47

Collection 이란?


  • 데이터를 저장하는 기본 자료 구조들을 한 곳에 모아 관리와 사용을 편하게 하기 위해 제공하는 프레임 워크를 말한다. 
  • 크게 List, Set, Map 으로 나뉜다.
  •  collection 안에 있는 object들을 elements 또는 items라고 부른다.
  • 일반적으로 같은 유형의 개체 수(이 숫자는 0일 수도 있음)를 포함한다.

 

 

 

Collection types

The Kotlin Standard Library provides implementations for basic collection types: sets, lists, and maps. A pair of interfaces represent each collection type:

 

  • A read-only(immutable) interface that provides operations for accessing collection elements.
  • A mutable interface that extends the corresponding read-only interface with write operations: adding, removing, and updating its elements.

 

출처 : https://kotlinlang.org/docs/reference/collections-overview.html

List 


List의 default는 수정불가한 고정배열(immutable List) 이다.

 

1. Immutable List

 

list 만들기

var nums:List<Int> = listOf(10, 20, 30, 40, 50) // '='대입 연산자 사용시 주의할점! 'List<Int>=listOf()' 경우 띄어쓰기를 안하면 '비교 연산자'로 인식 된다.
var names = listOf("kim", "lee", "park") //type이 추론도므로 List<String>으로 명시하지 않아도 된다.

 

list 값 가져오기

data 클래스를 정의해서 객체를 생성하고,

생성된 객체의 참조값을 고정배열(immutable List) 담아서 값을 가져 오는 예제이다

//data 클래스 정의하기(DTO)
data class Member(var num:Int, var name:String)

fun main(){
	//data class로 객체를 생성하고
    var mem1=Member(1, "김구라")
    var mem2=Member(2, "해골")
    var mem3=Member(3, "원숭이")
    //배열에 참조값을 담아 놓기
    var members= listOf(mem1,mem2,mem3)
}

list에 담겨 있는 값을 갖고 오는 방법은 2가지가 있다.

 

(1)배열 형태로 값 가져오기

//배열 형태로 값을 가져 올 수도 있고
var a=members[0].num //1
var b=members[0].name //"김구라"

(2)메소드를 사용하여 값 가져오기

//메소드를 사용하듯이 값을 가져올 수도 있다.
var c= members.get(0).num //1
var d= members.get(0).name //"김구라"

 

list 수정

고정배열(immutable List)에 값이 들어가면 해당 data는 수정할 수 없다.

//배열 자체의 데이터는 수정 불가하다.(immutable List 이기 때문에)
members[0]=Member(4,"주뎅이") //에러

그러나 배열 안에 있는 객체의 필드 수정은 가능하다.

//배열 안에 있는 객체의 필드 수정은 가능하다.(var 로 객체의 필드가 선언되어 있다면)
members[0].num=999

 

 

 

2. Mutable List

 

list 만들기

//Int type을 담는 MutableList
var nums2:MutableList<Int> = mutableListOf(10, 20, 30)

//String type을 담는 MutableList
var names= mutableListOf("kim", "lee", "park") //type이 추론도므로 List<String>으로 명시하지 않아도 된다.

 

list 값 가져오기

Immutable List 처럼 배열형태 또는 메소드를 이용해서 가져올 수 있다.

 

list의 전체 item을 가져올때는 반복문을 사용하면 편리하다

    //mutableList 생성
    var members:MutableList<Member2> = mutableListOf()
    //Member2 객체 생성해서 배열에 저장
    members.add(Member2(1, "김구라"))
    members.add(Member2(2, "해골"))
    members.add(Member2(3, "원숭이"))

    for (item in members){
        println("번호 : ${item.num}, 이름 : ${item.name}")
    }

 

list item 수정

(1) item 추가

    var nums2:MutableList<Int> = mutableListOf(10, 20, 30)
    nums2.add(40)
    nums2.add(50)
    
    var names= mutableListOf("kim", "lee", "park")
    names.add("jung")
    names.add("an")

 

(2) item 삭제

    //mutable list
    var nums2:MutableList<Int> = mutableListOf(10, 20, 30)
    var names= mutableListOf("kim", "lee", "park")
    
    //index에 의한 item 삭제
    nums2.removeAt(0)
    names.removeAt(0)
    //item 값에 의한 삭제
    nums2.remove(20)
    names.remove("lee")

 

존재하지 않는 item 값으로 삭제를 시도하면 false가 리턴된다.

//존재하지 않는 아이템 삭제 (false 리턴)
var result1=names.remove("aaa")

존재하지 않는 index 값으로 item 삭제를 시도하면 IndexOutOfBoundException이 발생한다.

//존재하지 않는 인덱스 삭제(IndexOutOfBoundException 발생)
try {
	var result2=nums2.removeAt(1000)
}catch (e:IndexOutOfBoundsException){
	e.printStackTrace()
}

이때, try~catch 구문으로 exception을 잡아주면 실행의 흐름을 계속 이어나갈 수 있다.

 

 

Map


1. Immutable Map

수정 불가능한 Map

 

Map 만들기

var map1:Map<String, Any> = mapOf("num" to 1, "name" to "김구라")
var map2= mapOf("num" to 2, "name" to "해골") //type infferred(type 추론)

 

Map 값 가져오기

//저장된 값을 참조
var a=map1.get("name") //메소드 형으로 참조
var b=map1["name"] //javascript에서 object를 참조하듯이

 

2. Mutable Map

수정 가능한 Map

 

Map 만들기

//Mutable Map : 수정 가능한 Map
var map3:MutableMap<String, Any> = mutableMapOf()
var map4= mutableMapOf<String, Any>()

 

Map item 수정

(1) item 추가

//Mutable Map : 수정 가능한 Map
var map3:MutableMap<String, Any> = mutableMapOf()
var map4= mutableMapOf<String, Any>()

//메소드로 map에 값 추가하기
map3.put("num", 3)
map3.put("name", "원숭이")
//javascript에서 object를 참조하듯이 값 넣기
map4["num"]=4
map4["name"]="주뎅이"

(2) item 삭제