좌충우돌 코딩

코틀린 - 컬렉션(Collection) 본문

코틀린/순수 코틀린

코틀린 - 컬렉션(Collection)

Tracoding 2023. 3. 21. 23:54

여러 개의 값을 가질 수 있는 것은 배열이죠! 그 배열 외에도 컬렉션이 있습니다.

컬렉션은 동적 배열이라고도 하는데, 그 이유는 배열과 다르게 공간의 크기를 정하지 않아도 됩니다.

또한 컬렉션은 크게 리스트(List), 맵(Map), 셋(Set)으로 나뉩니다.

 

컬렉션은 기본적으로 상수의 배열입니다.

한번 입력된 값을 바꿀 수 없습니다!?

 

다행이도 mutable이라는 것이 우리에게 있습니다.

프로그래밍 언어에서 뮤터블(mutable)은 변할 수 있다는 의미를 가지고 있습니다.

그 반대되는 개념이 임뮤터블(Immutable)이 있는데, 컬렉션을 사용시 임뮤터블을 쓰진 않습니다.

뮤터블 컬렉션을 쓰지 않으면 임뮤터블 컬렉션이 디폴트입니다.

 

리스트(List)

중복된 값을 넣을 수 있고 크기를 정하지 않아도 되는 배열이라고 생각하면 됩니다.

var FRUIT = listOf("딸기", "망고", "사과")	// 리스트 생성
var num = mutableListOf("1", "3", "5")		// 리스트 생성
FRUIT.add("리치")		// fruit 리스트에 "리치" 값 추가
num.add("7")		// num 리스트에 "7" 값 추가

위 코드에서 이상한 점이 있을까요??

 

다들 찾으셨을 겁니다. 바로 fruit 리스트에 값을 추가한 "리치"가 문제가 되죠.

임뮤터블이 컬렉션에 기본값으로 설정되어 있습니다.

fruit 리스트는 listOf("딸기", "망고", "사과")로 선언 및 초기화를 했기 때문에 기본값인 상수 배열이 됩니다.

그래서 세번째에 있는 fruit.add("리치") 코드는 에러가 발생합니다.

하지만 num 리스트는 mutableListOf("1", "3", "5")로 선언 및 초기화를 했기 때문에 변수 배열이 됩니다.

그래서 네번째 코드인 num.add("7")는 문제없이 실행이 되죠.

 

var num = mutableListOf("1", "3", "5")		// 리스트 생성
Log.d(${num.get(2)})	// "5"
Log.d(${num[1]})	// "3"

배열과 동일하게 값을 불러올 수 있습니다.

 

var num = mutableListOf("1", "3", "5")		// 리스트 생성
num.set(2, "7")		// "5"
Log.d(${num.get(1)})  	// "3"
num.removeAt(1)		// num 리스트 두번째 값 삭제
Log.d(${num.get(1)}) 	// "7"

두번째 코드는 리스트를 수정하는 방법입니다.

num 리스트의 세번째 값 5를 7로 수정을 했죠.

그리고 num 리스트 두번째 값을 조회하니 3이라고 나옵니다.

removeAt으로 두번째 값을 삭제하고 다시 두번째값을 조회하니 7이 나옵니다.

 

var strList = mutableListOf<String>()	// String 타입 빈 배열 생성
strList.add("인덱스 0")			// strList 리스트에 "인덱스 0" 값 추가

처음에 설명을 했었죠. 배열과 리스트의 차이는 동적 배열이다.

빈 배열을 만들 수 있습니다. mutableListOf<타입>()으로 빈 배열을 만들 수 가 있죠.

 

맵(Map)

맵은 키(Key)와 값(Value)가 입력되는 컬렉션입니다.

키는 쉽게 말해서 인덱스라고 보면 되고 값은 말그대로 값이 됩니다.

리스트와 배열과 같은 거 아니야? 라고 생각할 수 있지만, 개발자가 원하는 인덱스를 만들 수 있다는 것이 큽니다.

리스트 혹은 배열은 앞 번호의 인덱스가 삭제되면 뒷 번호 인덱스가 사라진 인덱스 번호를 가져갑니다.

하지만 맵 키1, 키2, 키3 중 키2를 삭제하면 키1, 키3이 남습니다. 키값이 변경이 되지 않는 것이죠.

 

코드를 보시죠!

var map = mutableMapOf<String, String>()
map.put("key1", "value1")	// key: "key1", value: "value1" 추가
map.put("key2", "value2")	// key: "key2", value: "value2" 추가
map.put("key3", "value3")	// key: "key3", value: "value3" 추가
map.remove("key2")		// key: "key2" 삭제

Log.d(${map.get("key3")})	// value3
map.put("key3", "update1")	// key: "key3", value: "update1" 수정
Log.d(${map.get("key3")})	// update1

배열이나 리스트는 중간 인덱스를 삭제하면 위와 같은 결과가 나올 수 없죠.

 

맵도 상수배열로 만들 수 있습니다.

val map = mapOf("A" to "1", "B" to "2")

map["A"] = 3	// 에러발생

// 맵의 키와 값 쉽게 탐색
for((key, value) in map) {
	println("$key : $value")
}

// 결과
// A : 1
// B : 2

mapOf를 사용하면 상수 맵을 만들 수 있습니다.

또한 in키워드를 통해서 키와 값도 쉽게 탐색이 가능합니다.

 

셋(Set)

셋은 중복을 허용하지 않는 리스트라고 생각하면 됩니다.

위에 리스트 설명이 조금 이상하지 않았나요? '중복된 값을 넣을 수 있고' 라고 적은 이유가 바로 여기에 있습니다.

또한 셋은 좀 특이합니다. 인덱스가 없습니다.

- 네??

- 정말입니다.

var set1 = mutableSetOf<String>()
set.add("월요일")	// 월요일 추가
set.add("화요일")	// 화요일 추가
set.add("수요일")	// 수요일 추가
set.add("목요일")	// 목요일 추가
set.add("목요일")	// 목요일 추가
set.remove("화요일")	// 화요일 삭제
Log.d("${set}")		// [월요일, 수요일, 목요일]

분명히 목요일을 2개 추가했지만, 결과는 [월요일, 수요일, 목요일]만 나왔습니다.

셋은 중복을 허용하지 않기 때문이죠. 다만 중복으로 값을 넣는다고 해도 어플리케이션은 작동을 합니다.

즉, 에러를 발생시키지 않고 값만 중복으로 추가가 되지 않을 뿐이죠.

 

셋 역시 상수 셋을 만들 수 있습니다.

val set2 = setOf("한국, 중국, 미국, 영국")

set2.add("태국")	// 에러 발생

println("$set")

setOf 키워드를 이용해서 상수로 만들 수 있습니다.

 

컬렉션 3가지 모드 컬렉션이름(list, set, map) 뒤에 Of를 붙여주면 상수배열, mutable를 컬렉션이름Of를 붙여주면

변수배열로 만들 수 있습니다. 기억하기 무척 쉽죠??

 

 

그럼 이만~~

'코틀린 > 순수 코틀린' 카테고리의 다른 글

코틀린 - 함수(funcation)  (0) 2023.03.23
코틀린 - 반복문(for, while)  (0) 2023.03.22
코틀린 - 배열(Array)  (0) 2023.03.21
코틀린 - when문 설명  (0) 2023.03.21
코틀린 - 상수 val과 const val의 차이  (0) 2023.03.21
Comments