hoon's bLog

Kotlin array 코틀린 배열 참조 및 사용 emptyArray arrayOf 본문

IT/Kotlin

Kotlin array 코틀린 배열 참조 및 사용 emptyArray arrayOf

개발한기발자 2024. 8. 7. 11:14
반응형


배열  정의하기, arrayOf()

  • 코틀린에서도 역시 배열 구조를 구현하는 타입은 Array
  • 배열 크기를 미리 안다면 표준 함수 중 하나를 사용해 배열을 생성 가능

배열 정의

val a = 배열명<배열타입>
val b = arrayOf("배열원소1", "배열원소2", ...)

예제

fun main(){
    val a = emptyArray<String>()        // Array<String> (원소 0개)
    val b = arrayOf("Hello", "World")   // Array<String> (원소 2개)
    val c = arrayOf(1, 4, 9)            // Array<Int> (원소 3개)

    // 방법 1: contentToString 사용
    println(a.contentToString())
    println(b.contentToString())
    println(c.contentToString())

    // 방법 2: for 루프 사용
    for (item in a) {
        println(item)
    }

    for (item in b) {
        println(item)
    }

    for (item in c) {
        println(item)
    }

    // 방법 3: joinToString 사용
    println(a.joinToString(", "))
    println(b.joinToString(", "))
    println(c.joinToString(", "))

    // 방법 4: forEach 사용
    a.forEach { println(it) }
    b.forEach { println(it) }
    c.forEach { println(it) }
}

결과

  • 필요에 맞게 contentToString(), jointoString("구분자"), for, forEach문을 이용해서 출력

람다식과 Array()

다음은 사용자가 입력한 값에 이르는 정수의 제곱으로 이뤄진 배열을 만든다.

val size = readLine()!!.toInt()
val squares = Array(size) { (it + 1)*(it + 1) }

println(squares.contentToString())  // [1, 4, 9, 16, 25]
  • size에 배열의 크기를 입력받음.
  • !!는 null 안전성 연산자로 readLine()이 null을 반환할 수 있기 때문에 !!를 사용하여 null이 아닌 값을 보장한다.
  • { (it + 1) * (it + 1) } : 배열의 각 요소를 초기화하는 람다 함수
  • it는 배열의 인덱스를 표현하는 변수로 자동 선언되며, 0부터 시작!

원시타입(primitive type), 박싱타입(boxing type)

  • 원시타입(primitive type) : 실제 값이 스택 메모리에 저장되는 타입
    ex). Int, Long, Short, Byte, Float, Double, Char, Boolean
    • 원시 타입은 박싱 되지 않은 상태로 메모리에 직접 저장
    • 즉, 이러한 타입의 변수는 실제 값 자체를 저장하고 있어 성능이 우수하고 메모리 사용이 효율적이다.
  • 박싱타입(boxing type) : 원시 타입을 객체로 감싸는 래퍼 클래스
    ex). Integer, Long, Float, Double 등
    • 객체로 감싸져 힙 메모리에 저장되고, 추가적인 메모리 오버헤드가 발생한다
fun main() {
    // 원시 타입
    val primitiveInt: Int = 100
    println(primitiveInt)  // 출력: 100

    // 박싱 타입
    val boxedInt: Int? = primitiveInt
    println(boxedInt)  // 출력: 100

    // 박싱된 타입의 null 처리
    val nullInt: Int? = null
    println(nullInt)  // 출력: null

    // 박싱 타입을 사용하는 리스트
    val intList: List<Int?> = listOf(1, 2, null, 4)
    println(intList)  // 출력: [1, 2, null, 4]
}
  • 원시 타입은 메모리와 성능 면에서 더 효율적이며, null 값을 가질 수 없음.
  • 박싱 타입은 객체로 감싸져 힙 메모리에 저장되며, null 값을 가질 수 있음.

배열 사용하기

배열타입

  • 배열 타입은 문자열 타입과 꽤 비슷하여, size와 lastIndex 프로퍼티가 있고,. 과 인덱스 연산으로 원소에 접근하는 점이 비슷하다.
  • 잘못 인덱스를 사용하면 런타임에 IndexOutOfBoundsException이 발생
val squares = arrayOf( 1, 4, 9, 16 )  
squares.size 	 // 4 
squares.lastIndex // 3
squares[3]       // 16
squares[1]       // 4

배열 원소 변경

위 코드에 이어서 배열의 원소를 변경해 보겠다.

squares[2] = 100 // squares : 1, 4, 100, 16
squares[3] += 9  // squares : 1, 4, 100, 25
squares[0]--     // squares : 0, 4, 100, 16
  • 코틀린에서는 배열의 원소에 직접 연산을 하여, 원본 배열을 변경할 수 있다!

참조형 데이터

  • 자바처럼 배열 타입의 변수 자체에는 실제 데이터에 대한 참조를 저장한다.
  • 이로 인해 배열 변수에 다른 배열을 대입하면 같은 데이터 집합을 공유한다.
val numbers = squares // numbers에 squares 배열을 대입하며 [0, 4, 9, 16]
numbers[0] = 1000     // 바뀐 데이터가 squares와 numbers에 공유됨 [1000, 4, 9, 16]
println(squares[0])   // 1000

배열 복제

  • 원본과 별도의 배열을 만들고 싶다면 copyOf() 함수를 사용해야 한다.
  • copyOf()는 필요시 다른 크기의 배열을 만들어 내기도 한다.
val numbers = squares.copyOf()
numbers[0] = 1000 // squares에는 영향이 없다.
squares.copyOf(2) // 뒤가 잘림 [1, 4]
squares.copyOf(5) // 부족한 부분에 0이 채워짐 [1, 4, 9, 16, 0]

다른 타입의 배열은 대입 X

  • 배열 타입 변수에 타입이 다른 배열 대입 X
val a = arrayOf(1, 4, 9, 16)
a = arrayOf("one", "two") // Error : can't assign Array<String> to Array<Int>
  • 자바는 상위 타입의 배열에서 하위 타입 배열을 대입할 수 있었다.
  • 코틀린에서는 배열이 가변 데이터 구조 이므로 이런 대입은 런타임시 문제가 될 수 있다.

배열 원소 추가

  • 배열을 생성하면 길이를 바꿀 수 없지만 + 연산자로 원소를 추가한 새로운 배열을 만들 수 있다.
val b = intArrayOf(1, 2, 3) + 4                // 원소를 하나만 추가 : 1, 2, 3, 4
val c = intArrayOf(1, 2, 3) + intArrayOf(5, 6) // 다른 배열을 추가 : 1, 2, 3, 5, 6

배열 비교

  • 문자열과 달리 배열에 대한 ==, != 연산자는 원소자체를 비교하지 않고 참조를 비교한다.
  • 배열 내용을 비교하려면 contentEquals() 함수를 사용하자.
intArrayOf(1, 2, 3) == intArrayOf(1, 2, 3)             // false
intArrayOf(1, 2, 3).contentEquals(intArrayOf(1, 2, 3)) // true

배열 표준 함수

함수 설명 메서드 결과
isEmpty 배열이 비었는지 검사 intArrayOf(1, 2).isEmpty() false
isNotEmpty 배열에 원소가 있는지 검사 intArrayOf(1, 2).isNotEmpty() true
indexOf 인자와 일치하는 최초의 배열 아이템의 인덱스를 반환
(일치하는 원소가 없으면 -1)
intArrayOf(1, 2, 3).indexOf(2)
intArrayOf(1, 2, 3).indexOf(4)
1
-1

언제나 새로운 정보 공유와 잘못된 정보

비판/지적/태클은 환영입니다!

도움이 되셨다면 공감♥️, 댓글 부탁드려요:)

끝.

728x90
반응형

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

Kotlin 코틀린 문자열 템플릿 및 기본 문자열 연산  (0) 2024.07.31
Kotlin 비교와 동등성  (5) 2023.09.14
Kotlin boolean 타입 및 비교 연산  (4) 2023.09.13
Kotlin char 문자 타입  (0) 2023.08.24
Kotlin 정수 타입  (2) 2023.08.14