Kotlin - Array & 배열에서 자주쓰이는 속성, 함수

이동수·2024년 8월 27일

Kotlin

목록 보기
8/33
post-thumbnail

우선 코틀린에서 배열은 잘 사용안함 (c에서는 중요)

이런게 있다 정도만 알아두자

collection으로 충분함

배열을 초기값으로 줘야하는 안드로이드 adapter빼고는 그닥

mbti 선택할때도 배열쓰긴한다. (enfj, en…16개)

알아둘거 2가지 + 2가지

밑에 두개만 알아두자

IntArray,DoubleArray()이런거 알아 둘 필요없다

배열

1. Array

사용하는 이유

사용하는 곳

특징

  • 동일한 타입 이여야함
    • int, String 같이 못씀
  • 정적인 데이터타입으로 선언하는순간 배열의 크기(size)가 정해지며 변경불가
  • 배열의 값(value)에 인덱스(index)를 이용해 접근
    • 기본적으로 Mutable(수정가능)타입, 인덱스(index)를 통해 값(value)변경
  • Array를 이용해 생성한 배열은 Array클래스를 이용해 생성한것

사용법

  • 기본
    • var array = Array<타입>(사이즈){들어갈값}
      • val a = Array(5) {0} // [0, 0, 0, 0, 0]
      • val a = Array(3) {i -> "Name$i"} // [Name0, Name1, Name2]
    • var array = Array<타입>(사이즈,{들어갈값})
      • var array = Array(10,{0}) // 사이즈는 10이고 각 자리에는 지금 빈값이라고 할 수 있는 0이 들어가 있음
        var a = Array(10,{i->i5}) //사이즈는 10이고 각 자리에 인덱스5의 값이 들어가 있음
        var a = Array(5,{""}) //사이즈는 5이고 각 자리에는 공백이 들어가 있음
      • var a = Array(10, {index -> index * index}) // Int 배열 10개를 만들고 각 index에 제곱 값으로 초기화
    • 타입지정해서 생성
      • 제너릭, 제공클래스
        • var a = Array(4,{0})
          var a = Array(10,{""})
        • var a = IntArray(10,{0})
          var a = ByteArray(5,{0})
          var a = CharArray(10){' '}
  • 크기만 정해서 배열 생성하기
    • var a = Array(10,{0}) // 크기만 정해서 배열을 생성하는 경우 (10의 크기 배열)

2. arrayOf(vararg T)

사용하는 이유

사용하는 곳

특징

  • 서로다른 타입도 배열로 가능
    • var anyArray = arrayOf(1,100,"안녕하세요",true, 100.13)
  • arrayOf()는 Array타입의 배열 객체를 반환하는 형태

사용법

  • 타입추론
    • val a = arrayOf(1,2,3,4,5) //알아서 Int형 배열로 타입추론
    • var a : Array = arrayOf(1,2,3,4,5)
  • 타입 안정해져있는
    • val a = arrayOf(1,2,'a','b',"ab",12345.6)
  • 타입 정해져 있는 기본
    • val a = arrayOf(1, 2, 3, 4, 5)
  • 비어있는타입
    • var a = arrayOfNulls(3) // 크기 33의 비어있는 함수 만들기, 출력시 [null,null,null]
  • 제너릭 이용, 제공함수 이용
    • 제너릭 이용
      • var a = arrayOf(10,20,30)
        var a = arrayOf("하나","둘","셋")
    • 제공함수
      • var a = intArrayOf(100,200,300)
        var a = charArrayOf('A','B','C')
        var a = booleanArrayOf(true,false)

3. 2차원 배열

사용하는 이유

사용하는 곳

특징

  • 행(가로)길이가 n 열(세로)길이가 m인 2차원 배열

사용법

  • val array = Array(n) { IntArray(m) } //행(가로)길이가 n 열(세로)길이가 m인 2차원 배열
  • 배열안에 배열을 넣어서 직접 index생성
val array1 = arrayOf(arrayOf("Aa", "Bb", "Cc", "Dd", "Ee"),
        arrayOf("Ff", "Gg", "Hh", "Ii", "Jj"),
        arrayOf("Kk", "Ll", "Mm", "Nn", "Oo")   
  • Array(행의 크기, {IntArray(열의 크기, {초기화 값})}
    //2차원 배열 선언
       val array2 = Array(3,{IntArray(3,{2})}) //전부 2로 출력
       
       //출력값
        for ((i, row) in array2.withIndex()){
            for ((j,column) in row.withIndex()){
                print("[$i,$j] => $column\t")
            }
            println()
        }
    • 응용
       //배열 선언
         val array3 = Array(3,{ i -> IntArray(4,{j -> j + i*4})})
         
         //출력값
         for ((i, row) in array3.withIndex()){
              for ((j,column) in row.withIndex()){
                  print("[$i,$j] => $column\t")
              }
              println()
          }
          //출력
          0 1 2 3
          4 5 6 7
          8 9 10 11
  • 다른 예제
 fun main(){
    var increment = 0
    var twoArray= Array(3,{IntArray(3) { _ -> increment * increment++ } })
    //var twoArray= arrayOf(intArrayOf(0,1,4), intArrayOf(9,16,25), intArrayOf(36,49,64))
    for(i in twoArray.indices){
        for(j in twoArray[i].indices){
            // print("twoArray[$i][$j] = ${twoArray[i][j]}\t")
            print("twoArray[$i][$j] = ${twoArray.get(i).get(j)}\t")
        }
        println()
    }
    println(Arrays.deepToString(twoArray))
    println(twoArray)
}
/* 출력
twoArray[0][0] = 0	twoArray[0][1] = 1	twoArray[0][2] = 4	
twoArray[1][0] = 9	twoArray[1][1] = 16	twoArray[1][2] = 25	
twoArray[2][0] = 36	twoArray[2][1] = 49	twoArray[2][2] = 64	
[[0, 1, 4], [9, 16, 25], [36, 49, 64]]
[[I@12edcd21
*/

4. List (collection)

  • 동적인 데이터
  • 순서를 가지지만 크기(size)가 정해지지않음, size에 관계없이 데이터 추가 가능 (부족하면 저절로 증가)
  • 배열과 마찬가지로 인덱스를 통해 접근하지만 ‘몇 번째 데이터인가’정도 의미임, 리스트의 데이터에는 포인터를 이용해 접근
  • 기본적으로 수정불가타입, 수정하기 위해서는 MutableList선언

List 생성, 데이터읽기 및 수정

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]
}

5. ArrayList

사용하는 이유

  • array와 List의 장단점을 보완하기 위해

사용하는 곳

특징

  • array와 List의 장단점을 보완한 array형태의 List
  • 기본적인 Mutable타입, 크기가 자유롭다

사용법

  • 기본
    • var a = ArrayList(사이즈)
  • of
    • var a = arrayListOf(1,2,3,4,5)
  • 생성과 데이터추가
    fun main(args: Array<String>) {
        val arr1 = ArrayList<Int>()    // []
        val arr2 = arrayListOf<Int>(1,2,3,4,5)    // [1, 2, 3, 4, 5]
    
        arr1.add(10)    
        arr1.add(20)    
        arr1.add(30)    // 맨 뒤에 원소 삽입
        println(arr1)    // [10, 20, 30]
    
        arr2.add(1,6)    // 1번째 인덱스에 6삽입 
        println(arr2)    // [1, 6, 2, 3, 4, 5]
    }
    • add(x) : 맨뒤에 x삽입
    • add(a,x) : a번째 index에 x삽입
  • 데이터 삭제
    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()    // 배열 전체 비우기
    }
    • remove(x) : 맨앞부터 x찾아서 삭제
    • removeAt(x) : x번째 인덱스 위치의 데이터 삭제
    • removeFirst() : 맨 첫번째 원소 삭제
    • removeLast() : 맨 마지막 원소 삭제
    • clear() : 배열 전체 비우

배열에서 자주 쓰이는 속성or함수

1. indices

특징

  • 앞에서부터 차례대로 하나씩 뽑기

사용법

  • 이름지정 in 배열이름.indices
    val numbers = Array<Int>(10, { index -> index * index })
    
    println("===>indices는 index를 순회하므로 numbers[index] 해야 값이 출력")
        for (index in numbers.indices) { 
            print("${numbers[index]}\t")
        }
        println()
    

2. withIndex()

특징

  • (index,value)로 나눠서 뽑기

사용법

  • (index,value) in 배열이름.withIndex()
    println("===> withIndex()는 numbers 배열을 구조(객체)분해(index,value)을 순회하며 리턴")
        for((index,value) in numbers.withIndex()){
            print("(index$index 의 값은 $value),")
        }
        println()
        // (index0 의 값은 0),(index1 의 값은 1),(index2 의 값은 4),(index3 의 값은 9),(index4 의 값은 16),(index5 의 값은 25),(index6 의 값은 36),(index7 의 값은 49),(index8 의 값은 64),(index9 의 값은 81),

3. contentToString()

1차원 배열 모든 원소를 문자열로 나타내기

배열이름.contentToString

4. contentDeepToString()

2차원 배열 모든 원소를 문자열로 나타내기

twoArray.contentDeepToString() = Arrays.deepToString(twoArray)

val arr = Array(3) { i -> IntArray(3) { it + i * 3 } }
println(arr.contentDeepToString()) //[[0, 1, 2], [3, 4, 5], [6, 7, 8]]
println(arr.joinToString { it.contentToString() }) //[0, 1, 2], [3, 4, 5], [6, 7, 8]
println(arr.joinToString("\n") { it.joinToString(" - ") })
/*
0 - 1 - 2
3 - 4 - 5
6 - 7 - 8
*/

5. set(), get()

배열에 값 넣고 빼기

  • 넣기
    • array.set(0,100) //array.set(인덱스, 넣을 값)
      array[3] = 300 //array[인덱스] = 넣을 값
  • 빼기
    • array.get(0) // array.get(인덱스)
      array[3] // array[인덱스]

0개의 댓글