코틀린에 대해 공부하던 초창기 완전히 이해하지는 못했던 부분에 대해 이번에 다시 한 번 잘 정리해 보았다. IntArray와 Array<Int>가 도대체 무슨 차이인지 이해할 수 없어서 열심히 찾아보았고 찾아보았던 것들을 잘 정리해보았다.
Kotlin의 원시 타입과 참조 타입
코틀린에서는 자바와는 다르게 원시 타입과 참조 타입을 구분하지 않고 항상 같은 타입을 사용한다.
코틀린에서는 모든 대상을 객체처럼 취급할 수 있다. Int, Double 등 과 같이 자바에서는 원시 타입이었을 값들에 대해서도 편하게 메서드를 호출할 수 있고, 해당 값이 사용되는 문맥에 따라 컴파일러가 알아서 원시 타입 값으로 처리하거나 객체로 처리해준다.
컴파일러단에서 알아서 효율적으로 처리되기 때문에 개발자 입장에서는 매우 편리하다.
원시 배열과 참조 배열
코틀린에서는 원시 타입과 참조 타입을 위에서 설명한 것 처럼 구분하지 않기 때문에 Array<Int>와 같은 배열의 경우 배열 내부에 저장할 값이 원시 타입의 32비트 정수 값으로만 쓰일지 아닐지 여부를 알 수가 없다. 따라서 이러한 경우 컴파일러는 가장 안전한 방식을 택해야 하기 때문에 배열의 원소로 32비트 정수 값이 아니라 정수 값 객체를 가리키는 참조를 사용할 수 밖에 없다.
arrayOf(1, 2, 3, 4)와 같이 배열을 생성한다는 것은 Int 객체를 가리키는 참조 4개가 들어있는 배열 객체가 생기고 각각 1, 2, 3, 4의 값이 들어있는 Int 타입 객체가 생긴다는 뜻이다. 배열 자체에는 객체를 가리키는 참조만 들어가고 실제 객체는 힙 안의 다른 위치에 저장된다.
반면 intArrayOf(1, 2, 3, 4)와 같이 배열을 생성하면 배열에 원시 타입 값을 연속적으로 저장하게 된다.
원시 타입은 JVM의 메모리 공간의 스택 영역에 저장되는 반면, 참조 타입은 스택 영역에 참조 값만 있고 실제 값은 힙 영역에 존재하게 된다. 참조 타입은 최소 2번 메모리 접근을 해야하고, 일부 타입의 경우 값을 필요로 할 때 참조 타입에서 원시 타입으로 변환하는 과정까지 거쳐야하기 때문에 원시타입과 비교해서 접근 속도가 매우 느리다. 또한 참조 타입이 원시 타입에 비해 사용되는 메모리 양이 압도적으로 높다.
Kotlin의 원시 배열
코틀린에서 지원하는 원시 배열들을 정리해보았다.
타입 | 원소 | 배열 생성 메서드 |
ByteArray | 1바이트 정수 | byteArrayOf() |
ShortArray | 2바이트 정수 | shortArrayOf() |
IntArray | 4바이트 정수 | intArrayOf() |
LongArray | 8바이트 정수 | longArrayOf() |
CharArray | 2바이트 문자 | charArrayOf() |
BooleanArray | 1바이트 정수 | booleanArrayOf() |
FloatArray | 4바이트 실수 | floatArrayOf() |
DoubleArray | 8바이트 실수 | doubleArrayOf() |
'Kotlin' 카테고리의 다른 글
Kotlin에서의 동등성과 동일성 (0) | 2024.12.30 |
---|---|
Kotlin에서 정규 표현식 사용하기 (2) (0) | 2024.12.24 |
Kotlin에서 정규 표현식 사용하기 (1) (0) | 2024.12.20 |