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 삭제