-
배열과 컬렉션프로그래밍 언어/Kotlin 2023. 7. 14. 03:25
배열
배열은 데이터를 메모리에 연속적으로 저장하여 하나의 변수에 할당할 수 있도록 하는 데이터 타입이다. 이때 배열로 사용할 메모리의 공간을 미리 할당해줘야 하기 때문에, 중간에 개수를 추가하거나 제거할 수 없다. C언어의 배열과 같은 형태라고 볼 수 있다.
이러한 배열 객체는 Int, Long, Char 등과 같은 기본 타입 뒤에 Array를 붙여서 만든다.
val doubleArr = DoubleArray(10) val floatArr = FloatArray(10) val longArr = LongArray(10) val intArr = IntArray(10) val shortArr = ShortArray(10) val byteArr = ByteArray(10) val charArr = CharArray(10) val boolArr = BooleanArray(10)
이때 파라미터로 사용한 숫자는 배열의 size를 나타낸다.
String Array
문자열의 경우 코틀린의 기본 타입이 아니기 때문에 StringArray와 같은 방식으로 배열을 생성할 수 없다. 대신 Array나 ArrayOf 함수를 사용해서 String 타입의 배열을 생성할 수 있다.
val stringArr = Array(10) { _ -> "" } // 10의 size를 가지는 빈 문자열 배열을 생성 val dayArr = arrayOf("MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN") // String값을 직접 할당
배열의 set과 get
배열에 값을 입력하고 싶다면, 배열이 제공하는 set함수를 사용할 수 있다.
val arr = arrayOf("Cookie", "Poky") arr[0] = "COOKIE" arr.set(0, "COOKIE")
배열에 있는 값을 가져오고 싶다면, 배열이 제공하는 get함수를 사용할 수 있다.
val arr = arrayOf("Cookie", "Poky") println(arr[0]) println(arr.get(0))
컬렉션
여러 개의 값을 넣을 수 있는 자료형에는 배열 외에도 컬렉션이 있다. 이는 동적 배열이라고도 할 수 있는데, 메모리상에서 물리적으로 연속적인 배열과 달리 논리적으로 연결되어 있어, 공간의 크기를 고정하지 않고 가변적으로 사용할 수 있기 때문이다.
코틀린에서 컬렉션은 크게 세 가지로 List, Map, Set이 있다.
List
리스트는 배열과 같이 저장되는 데이터에 인덱스를 부여하는 자료형이다. 이는 Python의 List, JavaScript의 Array와 비슷한 포지션이다.
기본적으로는 val과 같이 변하지 않는 데이터 타입이며, 동적으로 리스트를 사용하기 위해서는 Mutable이라는 접두어를 붙여 사용해야 한다.
리스트 생성
리스트를 생성하기 위해서는 listOf를 사용한다. 이는 기본적으로는 immutable이며, 동적으로 사용하기 위해서는 mutableListOf를 사용해야 한다.
val list = mutableListOf("MON", "TUE", "WED")
리스트 값 추가
리스트는 값을 동적으로 추가할 수 있는데, 이를 위해서 add 메서드를 사용할 수 있다.
val list = mutableListOf("MON", "TUE", "WED") list.add("THU")
리스트 값 수정 및 조회
리스트에 입력된 값을 사용하거나 수정하기 위해서는 배열과 같은 방식을 사용하면 된다.
val list = mutableListOf("mon", "TUE", "WED") list[0] = "MON" list.set(0) = "MON" println(list[0]) // MON println(list.get(0)) // MON
리스트 값 삭제
리스트에 입력된 값 삭제하기
val list = mutableListOf("MON", "TUE", "WED") list.removeAt(0) // list: ["TUE", "WED"]
빈 리스트 사용
비어있는 리스트를 생성할 때에는 앞으로 입력되는 값의 데이터 타입을 미리 알려줘야 한다. 이를 위해 제네릭을 사용하여 리스트의 타입을 지정해야 한다. (제네릭은 TypeScript의 제네릭과 유사하다)
val emptyStringList = mutableListOf<String>()
리스트 개수
리스트의 개수는 size 프로퍼티를 사용하여 참조할 수 있다.
val list = mutableListOf("MON", "TUE", "WED") print(list.size) // 3
Set
Set은 중복을 허용하지 않는 리스트이다. 리스트와 유사한 구조이지만 인덱스로 접근할 수 없고, 따라서 값의 순서도 보장되지 않는다.
Set 생성
Set을 생성하기 위해서는 setOf를 사용한다. 이는 기본적으로 immutable이며, 동적으로 사용하기 위해서는 mutableSetOf를 사용해야 한다. 비어있는 Set을 생성할 때 제네릭을 이용하는 것은 리스트와 동일하다.
val mutableSet = mutableSetOf("MON", "TUE", "WED") val emptySet = mutableSetOf<String>()
Set 값 추가
Set에 값을 추가할 때에는 리스트와 동일하게 add 메서드를 사용한다.
val mutableSet = mutableSetOf("MON", "TUE", "WED") mutableSet.add("THU") // mutableSet: ["MON", "TUE", "WED", "THU"] mutableSet.add("MON") // mutableSet: ["MON", "TUE", "WED", "THU"]
Set 자료구조의 경우 중복되는 값을 허용하지 않기 때문에, 중복되는 값이 입력되더라도 값이 저장되지 않는다. 이때 값을 입력하려고 시도하는 행위에 대해서 오류가 발생하지는 않는다.
Set 값 삭제
Set의 모든 값은 서로 중복되지 않기 때문에 값으로 직접 조회해서 삭제할 수 있다.
val mutableSet = mutableSetOf("MON", "TUE", "WED") mutableSet.remove("WED") // mutableSet: ["MON", "TUE"]
Set 값 조회
Set은 인덱스가 존재하지 않기 때문에, 인덱스를 이용해서 값을 참조하는 방식을 사용할 수 없다. 대신 해당 값이 Set에 존재하는지 확인할 수 있는데, 이를 위해 contains 메서드를 사용한다.
val mutableSet = mutableSetOf("MON", "TUE", "WED") mutableSet.contains("TUE") // true mutableSet.contains("THU") // false
Map
Map은 Key와 Value의 쌍으로 입력되는 컬렉션이다. Python의 딕셔너리나 JavaScript의 Object와 유사한 포지션이라고 볼 수 있다.
Map 생성
Map을 생성하기 위해서는 mapOf를 사용한다. 이는 기본적으로 immutable이며, 동적으로 사용하기 위해서는 mutableMapOf를 사용해야 한다. 비어있는 Map을 생성하기 위해서는 제네릭을 사용해야 하며, Key와 Value의 타입을 모두 지정해주어야 한다.
val mutableMap = mutableMapOf(1 to "x", 2 to "y", Pair(3, "z")) val emptyMutableMap = mutableMapOf<Int, String>()
Map에 값 추가
Map에 값을 추가하기 위해서는 put 메서드를 사용하여 Key와 Value를 입력하면 된다.
val map = mutableMapOf<String, Int>() map.put("age", 21) map.put("year", 2023)
Map 값 수정 및 조회
Map의 값을 수정하거나 조회하기 위해서는 리스트의 값을 수정하거나 조회하는 방식과 동일하다. 단, 수정을 위해서는 set이 아니라 put을 사용한다.
val mutableMap = mutableMapOf<String, String>() mutableMap["age"] = 24 println(mutableMap["age"]) // 24 mutableMap.put("age", 25) println(mutableMap.get("age")) // 25
Map 값 삭제
Map의 값을 삭제하기 위해서는 Set과 마찬가지로 remove 메서드를 사용한다. 이때 리스트나 Set과는 달리 Key값을 사용하여 값을 삭제한다.
mutableMap.remove("age")