상세 컨텐츠

본문 제목

[Kotlin] 배열과 컬렉션

Mobile/Kotlin

by 클리엘 클리엘 2020. 12. 7. 21:38

본문

728x90

1. 배열

 

배열은 다음과 같이 선언합니다.

var ints = IntArray(10)

예제는 Int형 배열을 10개 할당하라는 의미입니다. Long이나 Double과 같이 다른 타입의 배열을 지정하고자 한다면 해당 타입 + Array형태로 배열을 선언하면 됩니다.

var doubles = DoubleArray(10)

다면 문자열에 대한 배열을 선언하려면 다음과 같이 해야 합니다.

var s = Array(10, {item -> ""})

배열의 크기는 배열 변수 선언 시 지정할 수 있으며 향후 배열의 크기를 변경하는 것은 불가능합니다. 이제까지 예제는 미리 배열의 크기만 확보하는 방법이었는데 반면 다음과 같이 배열을 선언하는 방법도 있습니다.

var ints = arrayOf(10, 20, 30)
//또는
var ints = intArray(10, 20, 30)

초기화 시 직접 값을 통해서 배열을 선언하는 방법입니다. 이때 값의 타입에 따라 배열의 타입이 정해지며 초기화에 사용된 값의 개수에 따라 배열의 크기가 결정됩니다. 또한 위와 같은 방법을 사용하면 하나의 배열에 여러 타입의 데이터를 혼용해서 사용할 수도 있습니다.

var arrays = arrayOf(10, 2.0, "홍길동")

배열을 선언한 이후에 값을 할당하려면 '배열[인덱스]' 형태로 접근해 직접 값을 입력하거나 배열의 set 함수를 사용해 값을 입력합니다.

var i = IntArray(10)
i[5] = 100
//또는
i.set(5, 100)

10개의 Int형 배열을 선언하고 그중 6번째 배열 항목에 100이라는 값을 입력합니다. 예제제에서 사용된 5라는 숫자는 인덱스이며 인덱스는 0번부터 시작하므로 5는 총 배열 중 6번째 배열에 해당합니다.

 

값을 읽는 방법은 배열을 설정하는 방법과 매우 유사합니다. 읽어 들일 배열을 '배열[인덱스]'형태로 접근해서 읽거나 get함수로 특정 인덱스의 값을 읽으면 됩니다.

var i = IntArray(10)
i[5] = 100

Log.d("test1", "${i[5]}")
Log.d("test2", "${i.get(5)}")


2. 컬렉션

 

배열과 컬렉션은 여러 데이터를 담는다는 점에서 같은 역할을 수행합니다. 다만 컬렉션이 배열과 다른 점은 배열은 처음부터 배열의 크기를 정해놓고 시작하지만 컬렉션은 그렇지 않습니다.

 

(1) List

 

Kotlin에서 List는 다음과 같이 사용합니다.

var myList = mutableListOf<String>("홍길동", "홍길순")

mutableListOF에서 <> 안에 저장할 데이터의 타입을 지정하고 괄호(())를 통해 실제 값을 초기화합니다. 내부 값은 배열처럼 인덱스를 통해 접근할 수 있으며 본래 데이터 타입이 아닌 다른 형의 데이터로는 초기화할 수 없습니다.

 

하지만 <데이터 타입> 부분(제네릭)을 생략하면 다른 데이터형의 값들을 혼용하여 사용할 수 있습니다.

var myList = mutableListOf("홍길동", "홍길순", 100)

다만 성능상 <데이터형>을 사용한 것보다 약간의 손해를 볼 수 있으며 다음과 같이

var myList = mutableListOf()

빈 List를 생성할 수 없으니 참고하시기 바랍니다. <데이터형>이 없이 mutableListOf를 사용하는 경우에는 값에 의한 타입을 추론할 수 없기 때문입니다.

 

List에 값을 추가하는 경우에는 add함수를 사용합니다.

var myList = mutableListOf("홍길동", "홍길순", 100)
myList.add(200)

인덱스를 지정하면 지정한 인덱스의 값의 바꾸거나

myList.add(2, 200)

인덱스의 범위를 늘려 값을 넣게 됩니다. 다만 인덱스의 다음 크기만큼만 지정할 수 있습니다. 예컨대 List의 크기가 현재 3만큼인 경우 다음 인덱스인 3을 지정해 인덱스를 늘릴 수 있지만 4나 5처럼 순서를 건너뛴 형태로는 지정할 수 없습니다.

myList.add(3, 200)

List의 값을 가져오는 경우 []를 통해 인덱스를 지정하거나 get함수를 사용합니다.

Log.d("test", "${myList[2]}")
Log.d("test", "${myList.get(3)}")

add함수를 통해서 지정한 인덱스의 값을 바꿀 수 있지만 set함수를 사용하면 동일한 기능을 수행할 수 있습니다.

myList.set(1, "홍길남")

List에서 특정 인덱스를 삭제하려면 removeAt함수를 사용합니다.

myList.removeAt(1)

이렇게 하면 해당 인덱스의 값은 삭제되고 대신 그 뒤에 있던 모든 값들의 인덱스가 하나씩 앞으로 당겨지게 됩니다.

 

List상의 전체 크기 값은 size속성을 통해 가져올 수 있습니다.

var myList = mutableListOf("홍길동", "홍길순", 100)
Log.d("test", "${myList.size}")

가끔은 다음과 같이 mutable이 제거된 listOf가 사용되는 경우도 있은데

var MYLIST = listOf("홍길동", "홍길순", 200)

mutable을 쓰지 않으면 값을 추가하거나 변경하는 것이 불가능합니다. 이 규칙은 다음에 설명할 Set이나 Map에도 동일하게 적용됩니다. 최초로 설정된 값만을 사용할 수 있다는 규칙 때문에 월(Month)이나 요일처럼 값이 변할 일이 없는 상수적인 값을 다룰 때만 사용됩니다.

 

(2) Set

 

List는 각 값을 구분하기 위해 인덱스를 사용하는데 Set은 인덱스를 사용하지 않고 값으로만 배열을 구성합니다. 따라서 중복된 값은 저장할 수 없습니다.

 

Set은 다음과 같이 선언할 수 있습니다.

var mySet = mutableSetOf("홍길동", "홍길순", 100)

명칭만 List에서 Set으로 바뀔 뿐 사용법은 동일합니다. 다만 인덱스를 사용하지 않으므로 Get함수도 사용할 수 없습니다. 값을 확인하는 경우에 Set은 모든 값을 나열합니다.

Log.d("test", "${mySet}")

삭제 시에는 값을 직접 전달해서 삭제해야 합니다.

mySet.remove("홍길순")

(3)  Map

 

List처럼 키와 값을 가집니다. 다만 List에서 키는 순차적인 번호를 통해 인덱스를 형성했지만 Map에서는 직접 키를 설정할 수 있습니다.

 

Map을 생성할 때는 키의 데이터형과 값의 데이터형을 직접 제네릭으로 지정해야 합니다.

var myMap = mutableMapOf<Int, String>()

그리고 Put함수를 통해 키와 값을 추가합니다. 만약 지정한 키가 이미 존재한다면 해당 키의 값을 변경합니다.

myMap.put(100, "홍길동")
myMap.put(200, "홍길순")

값을 가져올 때는 Get함수를 통해 값의 키를 지정합니다.

Log.d("test", "${myMap.get(200)}")

삭제는 remove함수를 통해 키를 지정해 삭제합니다.

myMap.remove(200)

 

728x90

'Mobile > Kotlin' 카테고리의 다른 글

[Kotlin] 클래스(Class)  (0) 2020.12.09
[Kotlin] 함수  (0) 2020.12.08
[Kotlin] 배열과 컬렉션  (0) 2020.12.07
[Kotlin] 반복문  (0) 2020.12.07
[Kotlin] 제어문 - 조건문  (0) 2020.10.01
[Kotlin] 변수와 상수  (0) 2020.10.01

관련글 더보기

댓글 영역