1. 변수
코틀린은 변수를 선언할 때 자료형에 따라 타입 추론을 하기 때문에 변수 형을 지정하지 않아도 됩니다.
fun main() {
//var [변수명] = [값]
var booleanValue = true
var intValue = 1
var doubleValue = 3.14
var floatValue = 9.8f
var charValue = 'a'
var stringValue = "text"
}
그래서 이처럼 변수를 선언할 때는 var 키워드만 이용하면 됩니다.
* 코틀린에서는 변수명을 작성할 때 카멜 표기법을 사용하도록 권장하고 있습니다.
변수명의 앞 글자는 소문자로 시작하고 다음에 오는 단어는 앞글자를 대문자로 표기하여 단어들을 구분합니다.
단어 사이에는 특수문자나 공백이 없어야 합니다.
또한 다른 언어와 마찬가지로 실수를 저장할 때는 기본으로 double타입으로 저장이 됩니다. 만약 float로 저장하고 싶다면 값 뒤에 f를 붙여 주시면 됩니다.
정수 또한 기본 Int 형으로 저장이 됩니다.
그리고 코틀린은 변수 선언 시 초기화를 반드시 시켜주어야 합니다.
기본적으로 타입추론을 하지만 임의적으로 타입을 명시할 수도 있습니다.
fun main() {
//var [변수명]: [타입] = [값]
var booleanValue: Boolean = true
var byteValue: Byte = 1
var shortValue: Short = 1
var intValue: Int = 1
var longValue: Long = 1L
var doubleValue: Double = 3.14
var floatValue: Float = 9.8f
var charValue: Char = 'a'
var stringValue: String = "text"
}
변수명 뒤에 : 콜론을 붙이고 타입을 작성하시면 됩니다.
앞서 코틀린은 (불, 정수, 실수, 문자, 문자열) 자료형에 따라 타입추론을 하기 때문에 타입을 안 적어도 된다고 했습니다.
하지만 변수에는 같은 정수라도 Byte, Short, Int, Long 가 있기 때문에 기본적으로 타입추론을 할 때는 Int 형으로 지정이 됩니다.
사실 Byte, Short 는 임베디드와 같이 시스템 메모리가 부족한 경우에만 사용하고 대부분의 현대 시스템들의 사양이 좋아졌기 때문에 사용할 필요가 사라졌지만 사용해야 한다면 타입을 명시해주어야 합니다.
또한 Long 타입 정수형은 Float처럼 뒤에 L을 붙여주셔야 합니다.
***중요***
코틀린은 변수를 생성할 때 참조타입으로 생성이 됩니다.
하지만 자바와 호완성을 위해 컴파일 과정을 통해 기본타입으로 변환되기 때문에 자바와 동일한 결과를 낼 수 있습니다.
또한 코틀린은 기본적으로는 null값을 허용하지 않고 있습니다.
하지만 변수타입 앞에다 ? 를 붙이면 컴파일 과정에서 참조타입을 유지할 수 있게 되며 null값을 사용할 수 있게 됩니다.
fun main() {
//var [변수명]: [타입]? = [값]
var booleanValue: Boolean? = null
var byteValue: Byte? = null
var shortValue: Short? = null
var intValue: Int? = null
var longValue: Long? = null
var doubleValue: Double? = null
var floatValue: Float? = null
var charValue: Char? = null
var stringValue: String? = null
println(booleanValue)
println(byteValue)
println(shortValue)
println(intValue)
println(longValue)
println(doubleValue)
println(floatValue)
println(charValue)
println(stringValue)
}
위 코드에서 String 문자열은? 을 붙이건 안븥이건 항상 참조타입으로 유지가 됩니다.
하지만 그런 문자열도 null을 사용하기 위해서는 ? 를 붙여야 합니다.
2. 상수
코틀린은 상수를 선언할 때 val 키워드를 사용합니다.
다른 프로그래밍 언어와 마찬가지로 초기 선언시 값을 지정하면 이후로는 바꾸지 못하게 됩니다.
선언방식은 변수와 동일합니다.
fun main() {
//val [상수명] = [값]
val booleanValue = true
val byteValue: Byte = 1
val shortValue: Short = 1
val intValue = 1
val longValue: Long = 1;
val doubleValue = 3.14
val floatValue = 9.8f
val charValue = 'a'
val stringValue = "text"
}
3. 형 변환
형 변환은 지정된 자료형을 다른 자료형으로 변환하는것 입니다.
다른 프로그래밍 언어들도 자료형을 변환할 수 있지만 코틀린은 조금 다릅니다.
C나 Java와 같은 언어에서는
int i = 10;
long l = i;
이런 식으로 암시적 형 변환을 제공하지만 코틀린에서는 에러를 방지하기 위한 차원에서 명시적 형 변환만 지원됩니다.
그리고 명시적 형 변환을 하는 방식도 타 언어와는 조금 다릅니다.
코틀린은 변수가 앞서 말씀드렸다시피 참조타입으로 생성이 됩니다. 실제로 변수 내부를 보면 클래스로 선언이 되어있고 다양한 기능들을 제공하고 있습니다. 그중에 형 변환을 하는 함수는 [변수명]. to [데이터타입]입니다.
fun main() {
var intValue = 65
println(intValue.toByte())
println(intValue.toShort())
println(intValue.toLong())
println(intValue.toFloat())
println(intValue.toDouble())
println(intValue.toChar())
println(intValue.toString())
}
위 코드는 Int형 변수를 다양한 데이터 타입으로 변환시키는 코드와 출력결과입니다.
정상적으로 형 변환이 되었습니다.
하지만 다른 언어와 마찬가지로 실수 -> 정수로 변환 시 소수 부분이 잘리거나 오버플로우 등의 문제가 생길 수 있으니 조심하셔야 합니다.
4. Any형
Any는 코틀린에서 사용할 수 있는 최상위 클래스 변수로 모든 타입의 변수를 담을 수 있습니다. 이는 자바에서 object와 동일한 역할을 하는 클래스로 실제로 컴파일 시 자바에서의 object로 변환이 됩니다.
추가로 Any도 명시적으로 선언 시 변수명 뒤에? 를 붙이면 코틀린 내부에서 참조형으로 사용이 가능합니다.
참고로 자바에서의 object는 null도 기본적으로 포함할 수 있기 때문에 Any, Any? 2가지 모두 컴파일 시 동일한 object 형으로 변환됩니다.
5. 정리
위에서도 설명드렸다시피 코틀린은 모든 변수가 클래스로 정의되어 있습니다. 그래서 변수 앞에?를 붙이건 붙이지 않건 사실 모두 참조형 변수라고 보는 것이 맞습니다. 하지만 Java Bytecode로 컴파일 시 컴파일러는 효율성을 위해 원시타입 변수로 언박싱(변환) 하고 참조타입으로 박싱(유지) 하기도 합니다.
예시로 정리해 보겠습니다.
var intValue = 10 -> 컴파일 -> int intValue = 10;
var floatValue: Float? = null -> 컴파일 -> Float floatValue = null;
var stringValue = "str" -> 컴파일 -> String stringValue = "str";
var anyValue = 3.14 -> 컴파일 -> Object anyValue = 3.14;
이상으로 변수에 대한 설명은 여기서 마치겠습니다.
감사합니다.