스터디/Kotlin

[ 스터디 ] 코틀린 : 원시타입, 참조 타입 배열

공또뤼 2023. 5. 9. 22:07
반응형

1. 원시타입, 참조타입 배열

- 원시 타입 primitive type : 컴퓨터 CPU가 즉시 이해할 수 있는 값 = 메모리상에 존재하는 타입

-> 코틀린에서는 모든 대상을 객체처럼 취급할 수 있다.

 

(내가 가장 이해하기 어려웠던 부분.... 정리...)

! 모든 대상을 객체처럼 취급하여 발생하는 문제점 

Array<Int> 같은 배열 타입의 값인 경우 배열 내부에 저장할 값의 타입을 알 수 없다.
이런 경우 컴파일러는 가장 안전한 방식... 런타임에 문제가 생기지 않는 방식을 택해야 한다.

-> 배열의 원소로는 32비트 정수 값이 아니라 정수 값 객체를 가리키는 참조 reference를 사용할 수 밖에 없다.

이 부분이 내가 공부를 아직 얕게 했다고 느끼게 해준 부분이었다. 질문이 많이 생겼지만 읽으면서 생긴 질문들은 차차 해결하도록 하고 내용에 집중해보려고 했다.

 

75페이지에 있는 예시를 보며 이해해보려고 하였다.

val arrayOf1to4 = arrayOf(1, 2, 3, 4)

Int 객체를 가리키는 참조가 4개 들어있는 배열 객체가 1개 생기고 1, 2, 3, 4 가 들어있는 Int 타입 객체가 생긴다는 뜻이다..?

 

배열 자체에는 객체를 가리키는 참조만 들어가고 실제 객체는 힙 heap 안의 다른 위치에 저장된다.

참조를 통해 간접적으로 객체에 접근해야 하는 배열을 참조 배열 reference array 이라 한다.

 

String 을 제외한 코틀린 기본 타입들의 경우 객체로는 쓰이지 않고 원시타입으로만 쓰일 수 있다.
-> 배열 안에 참조를 저장하지 않고 즉시 값을 저장해서 불필요한 부가 비용을 피할 수 있다........

원시 타입 값을 연속적으로 저장한 배열을 원시 배열 primitive array 이라 한다.
타입 배열 생성 방법
ByteArray byteArrayOf(...)
ShortArray shortArrayOf(...)
IntArray intArrayOf(...)
LongArray longArrayOf(...)
CharArray charArrayOf(...)
BooleanArray booleanArrayOf(...)
FloatArray floatArrayOf(...)
DoubleArray doubleArrayOf(...)

추가로 부호 없는 정수 타입에 대한 원시 타입 배열도 제공한다.

 

 

2. 배열 기본 연산

- 코틀린은 객체지향 언어이다.

  그러므로 멤버 프로퍼티를 활용하거나 멤버 함수를 활용한다.

 

배열.size 프로퍼티

fun main(){
	val x = arrayOf(1, 2, 3)
    println(x.size)
}

 

배열.lastIndex, 배열.indices

* 배열의 마지막 index를 얻거나 index 범위를 얻을 수 있다.

fun main(){
	val array = intArrayOf(1, 2, 3, 4, 5)
    val lastIndex = array.lastIndex
    val indices = array.indices
    
    println(lastIndex == indices.last)
    println(lastIndex == array.size - 1)
    println(0 == indices.first)
}

 

for ... in

* 배열의 원소를 차례로 변수에 담아 사용 할 수 있다.

fun main(){
	val x = arrayOf(1, 2, 3)
    val y = arrayOf(1, 2, 3)
    
    for(i in x){
    	for(j in y){
        	println("$i * $j = ${i*j}")
        }
    }
}

 

in

* 배열에 들어있는지 판단할 수 있다.

fun main(){
	val x = intArrayOf(1, 2, 3)
    println(1 in x) //true
    println(5 in x) //false
}
반응형