Kotlin 배열 Array, 컬렉션 - List, Map, Set

박미소·2023년 12월 12일
0

코틀린

목록 보기
8/44

배열

  • 배열의 생성
fun main() {
	val arr1 = arrayOf<Int>(1, 2, 3, 4, 5)    // [1,2,3,4,5]
    val arr2 = arrayOf("하나", "둘", "셋", 1, 2, 3)    // [하나, 둘, 셋, 1, 2, 3]
    val arr3 = arrayOfNulls<Int>(3)    // [null, null, null]
    val arr4 = Array<Int>(5) {0}    // [0, 0, 0, 0, 0]
    val arr5 = Array<String>(3) {i -> "Name$i"}    // [Name0, Name1, Name2]
}

코틀린에서 배열을 선언하는 방법에는 크게 arrayOf와 Array가 있다. arrayOf는 배열의 크기를 지정할 수는 없지만 배열 선언과 동시에 배열의 원소 값을 직접 지정해줄 수 있다. 자료형을 명시하지 않은 경우에는 자료형이 혼합된 배열 생성도 가능하다. Array는 배열 선언과 동시에 배열의 크기를 지정해야 한다. 중괄호를 이용해 배열의 초기값을 지정할 수 있고 람다식을 활용해 초기값을 조작할 수 있다.

  • 배열의 값 읽기, 수정
    앞서 언급했듯이 생성된 배열은 기본적으로 Mutable 타입이므로 수정이 가능하며 인덱스로 접근한다.
fun main() {
	val arr1 = arrayOf<Int>(1, 2, 3, 4, 5)    // [1,2,3,4,5]
    println(arr1[3])    // 4
    arr1[3] = 10    // 배열의 값 수정
    println(arr1[3])    // 10
    


컬렉션

a. List

리스트는 읽기전용과 수정가능한 종류로 구분한다. 배열(array)와 달리 크기가 정해져있지 않아 동적으로 값을 추가할 수 있다.

fun main(args: Array<String>) {
    val list1: List<Int> = List(3) { i -> i }    // [0, 1, 2]
    val list2: List<String> = listOf("하나", "둘", "셋")    // [1, 2, 3]
    val list3 = mutableListOf<Int>(1,2,3,4,5)    // [1, 2, 3, 4, 5]

    list1[0] = 3    // 수정 불가, 오류 발생
    println(list1[0])    // 0
    list3[1] = 8    // 데이터 수정
    println(list3)    // [1, 8, 3, 4, 5]
}

  • listOf( )
    읽기 전용 리스트. 인덱스에 접근해서 값 변경 불가.

var scores1 = listOf(1,2,3)

    val items = listOf("apple", "banana", "kiwi")
    for(index in items.indices) { //indices -> 0..2
        println("item at $index is ${items[index]}")
    }
}

+++ indices = 반복문을 통해 배열의 최소 인덱스..최대 인덱스 반환


  • mutableListOf( )

수정 가능 리스트. 인덱스에 접근해서 값 변경 가능. mutable !!

var scores2 = mutableListOf(1,2,3)
scores2.set(0(인덱스),5)


  • ArrayList( )
    ArrayList는 배열과 리스트의 장단점을 보완한 Array 형태로 이루어진 List이다. mutable 타입이고 크기가 자유롭다. array 형태, 배열 형태로 차곡차곡 저장하기 때문에 실제로 코딩할 때 많이 사용된다.

var scores3 = ArrayList<자료형>(1,2,3)
scores3.set(인덱스,값)


  • ArrayList 생성과 데이터 추가, 삭제
fun main(args: Array<String>) {
    val arr1 = ArrayList<Int>()    // []

    arr1.add(10)
    arr1.add(20)
    arr1.add(30)
    arr1.add(40)    // 맨 뒤에 원소 삽입
    println(arr1)    // [10, 20, 30, 40]

    arr1.remove(20)    // 맨 앞에서 부터 20을 찾아 삭제
    println(arr1)    // [10, 30, 40]
    arr1.removeAt(1)    // 1번째 인덱스 위치의 데이터 삭제
    println(arr1)    // [10, 40]

    arr1.removeFirst()    // 맨 첫 번째 원소 삭제
    arr1.removeLast()     // 맨 마지막 원소 삭제
    arr1.clear()    // 배열 전체 비우기
}
fun main() {
    var a_list = ArrayList<String>()
    a_list.add("one")
    a_list.add("two")
    a_list.add("three")

    println(a_list.toArray())     // [Ljava.lang.Object;@7f63425a
    println(a_list.toList())     // [one, two, three]
    println(a_list.toString())  // [one, two, three]
}
  1. ArrayList : 동적으로 데이터를 배열에 저장할 수 있다.
  2. toString : ArrayList에 저장된 데이터를 전체 출력시켜준다.

출처: https://kkh0977.tistory.com/630




b. Map

맵은 키와 값의 쌍으로 이루어진 자료형이다.(딕셔너리 형태) 읽기전용과 수정가능 종류로 구분.

// 읽기전용 맵
// 변수명[키]로 데이터에 접근할 수 있다
var scoreInfo1 = mapOf("kor" to 94, "math" to 90, "eng" to 92)
println(scoreInfo1)   //{kor=94, math=90, eng=92}
println(scoreInfo1["kor"])

// 수정가능한 맵
// 변수명[키]로 데이터에 접근할 수 있다
var scoreInfo2 = mutableMapOf("kor" to 94, "math" to 90)
scoreInfo2["eng"] = 92
println(scoreInfo2["eng"])

// 맵의 키와 값을 동시에 추출해서 사용할 수 있다
for((k,v) in scoreInfo2) {
    println("${k}의 값은 ${v}입니다")
}



}

  • 불변형 mapOf( ) 함수
val langMap: Map<Int,String> = mapOf(11 to "Java", 22 to "Kotlin", 33 to "C++")
    for((key, value) in langMap){
        println("key=$key, value=$value")
        // key=11, value=Java
        // key=22, value=Kotlin
        // key=33, value=C++
    }
    println("langMap[22] = ${langMap[22]}") 		
    // langMap[22] = Kotlin
    println("langMap.get(22) = ${langMap.get(22)}")		
    // langMap.get(22) = Kotlin
    println("langMap.keys = ${langMap.keys}")   	
    // langMap.keys = [11, 22, 33]

/* 요소를 키와 값의 쌍의 형태로 저장. 키는 중복 불가능. 사이즈 자동, 기본 Immutable */
    val map1 = mapOf(1 to "Kim", 2 to "Han") // 수정 불가능
    val map2 = mutableMapOf(1 to "Kim", 2 to "Han") // 수정 가능
    map2.size // 맵의 사이즈 반환
    map2.keys // 맵의 모든 키 반환
    map2.values // 맵의 모든 값 반환
    map2.isEmpty() // 맵이 비어있으면 true, 아니면 false
    map2.containsKey(1) // 1에 해당하는 키가 있으면 true, 아니면 false
    map2.containsValue("Kim") // Kim에 해당하는 값이 있다면 true, 아니면 false
    map2[1] // 키에 해당하는 값 반환.
    		//map2.get(1) 과 같음.



  • 가변형 mutableMapOf( )
    val map1 = mapOf(1 to "Kim", 2 to "Han") // 수정 불가능
    val map2 = mutableMapOf(1 to "Kim", 2 to "Han") // 수정 가능
    map2.put(3, "Lee") // 3과 Lee의 쌍 추가
    map2.remove(1) // 1에 해당하는 요소 제거
    map2.clear() // 초기화




c. Set

  • 불변형 setOf( )
    /* 집합은 순서를 가지지 않고, 중복 불가능. 사이즈가 자동으로 정해지며 기본은 Immutable 타입 */
    val set1 = setOf(1,2,3) // 1,2,3을 담은 Set 생성 (수정 불가)
    val set2 = mutableSetOf(1,2,3) // 1,2,3을 담은 mutableSet 생성 (수정 가능)
    set2.remove(2) // 집합에서 2 삭제
    

  • 가변형 mutableSetOf( )
//  읽기전용 Set입니다.
    var birdSet = setOf("닭", "참새", "비둘기")

//  수정가능 Set입니다.
//  var mutableBirdSet = mutableSetOf("닭", "참새", "비둘기")
//  mutableBirdSet.add("꿩")
//  mutableBirdSet.remove("꿩")
    println("집합의 크기는 ${birdSet.size} 입니다")

    var findBird = readLine()!!

    if(birdSet.contains(findBird)) {
        println("${findBird} 종류는 존재합니다.")
    } else {
        println("${findBird}는 존재하지 않습니다.")
    }

  • 합집합, 교집합, 차집합
		// 귀여운 새의 집합
    var birdSet = setOf("닭", "참새", "비둘기", "물오리")

    // 날수있는 새의 집합
    var flyBirdSet = setOf("참새", "비둘기", "까치")

    // 모든 새의 집합 (합집합)
    var unionBirdSet = birdSet.union(flyBirdSet)

    // 귀엽고 날수있는 새의 집합 (교집합)
    var intersectBirdSet = birdSet.intersect(flyBirdSet)

    // 귀여운 새들중에서 날수없는 새의 조합 (차집합)
    var subtractBirdSet = birdSet.subtract(flyBirdSet)

    println("=====합집합=====")
    println("모든 새의 집합 : ${unionBirdSet}")

    println("=====교집합=====")
    println("귀엽고 날수있는 새의 집합 : ${intersectBirdSet}")

    println("=====차집합=====")
    println("귀엽고 날수없는 새의 집합 : ${subtractBirdSet}")

0개의 댓글