/* 본 게시물은 ' ' 의 내용을 토대로 작성되었습니다. */
참고 자료
[Koltin] 코틀린의 자료형 :
https://velog.io/@jinny_0422/%EC%BD%94%ED%8B%80%EB%A6%B0%EC%9D%98-%EC%9E%90%EB%A3%8C%ED%98%95
[Kotlin] 자료형과 변수 심화 :
#코틀린 자료형
1. 자료형 이란?
자료형의 정의는 다음과 같다.
자료형(data type)
저장되는 데이터의 종류에 따른 형태로, 저장되는 값의 종류와 범위에 따라 다르게 표현한다.
프로그래밍 언어의 자료형은 기본적으로 기본형 자료형 과 참조형 자료형 두 가지가 있다.
2. 기본형 자료형
기본형 자료형은 언어에서 지원하는 기본 자료형이라고 생각하면 된다. (int, char, ...)
기본형의 특징은 다음과 같다.
- 실제 값을 그대로 메모리에 할당
- 메모리 크기 고정
- null로 초기화가 불가능, 기본(디폴트) 값이 정해져있음.
- 스택에 값을 저장
코틀린에서는 참조형만 사용된다고 한다. 그럼 정말로 Kotlin의 자료형은 모두 참조형일까?
이에 대한 답은 '아니다'이다.
Kotlin 공식 문서를 확인해보면
In Kotlin, everything is an object in the sense that we can call member functions and properties on any variable. Some of the types can have a special internal representation — for example, numbers, characters and booleans can be represented as primitive values at runtime — but to the user they look like ordinary classes.
번역 :
Kotlin에서는 모든 변수에 대해 멤버 함수와 속성을 호출할 수 있다는 점에서 모든 것이 객체입니다. 일부 유형은 특별한 내부 표현을 가질 수 있습니다. 예를 들어 숫자, 문자 및 부울은 런타임에 기본 값으로 표시될 수 있지만 사용자에게는 일반 클래스처럼 보입니다.
즉, 우리는 코드를 쓸 때 모든 변수를 참조형(객체)로 사용하지만, 컴파일 과정에서 기본형으로 대체한다. 따라서, 코틀린의 경우 자료형을 고려하는 최적화를 신경쓰지 않아도 된다.(컴파일러가 알아서 해줌)
이를 코드로 이해해보자.
val bool = true // 컴파일러가 알아서 boolean 형으로 추론
val char1 = 'C' // 컴파일러가 알아서 char 형으로 추론
val a = 123 // Int형으로 추론
val b = 123L // 접미사 L을 이용하여 long형으로 추론
val c = 0x1F // 접두사 0x 를 사용해 16진법 표기가 사용된 int 형으로 추론
val d = 0b00101010 // 접두사 0b 를 이용하여 2진 표기가 사용된 int 형으로 추론
val float1 = 1.23e-2F // 접미사 F를 이용하여 float형 으로 추론
코틀린으로 위 코드를 역컴파일 해본 결과는 다음과 같다.
3. 참조형 자료형
기본 자료형을 제외한 자료형은 참조형 자료형(객체)라고 이해하면 된다.
참조형 자료형의 특징은 다음과 같다.
- 스택에 참조 주소를 저장
- null로 초기화 가능
- 참조 주소 위치에 해당하는 곳(힙)에 실제 객체 저장
대표적으로 String 형을 생각해보자.
fun main(){
val str = "Hello"
val str2 = "World"
val str3 = "Hello"
println(str === str2) // false
println(str === str3) // true
}
String 자료형은 변수에 Heap 영역에 존재하는 인스턴스의 주소를 가지고 있다. 참조 연산자(===) 를 통해 str 과 str3 를 계산해보면 true 를 반환한다. 이 의미는 두 변수가 같은 인스턴스의 주소를 가지는 것을 알 수 있다.
4. 정리
여태까지 설명했던 내용을 밑에 이미지로 정리할 수 있다. (이미지 출처)
cf > Int / Int? 의 차이
관련글
기본적으로 기본형 자료형은 null을 지원하지 않는다. 그렇다면 기본형 자료형에서 null을 지원하고 싶으면 어떻게 하면 될까? 기본형 자료형을 객체를 만들면 된다. 이를 Wrapper class 라고 한다. Wrapper class 예시로 Int? , Long? (자바에서는 Integer / Double / Character) 가 있다.
val a: Int = 1
val b: Int? = 1
위 코드를 역컴파일 해보면 Int로 선언한 변수 a는 기본 자료형 int, Int? 로 선언한 변수 b는 Integer class 로 선언된 것을 확인 할 수 있다.
즉, Int형은 기본 자료형, Int? 형은 참조 자료형 이라는 것을 알 수 있다.
Kotlin 에서 기본형 자료형 / 참조형 자료형에 대해 알았으니
IntArray, Array<Int> 의 차이에 대한 감이 온다.