코틀린은 기본형 형식이 없고 모든 것이 객체이다 (short, int, long은 기본형으로 취급되지만 객체처럼 쓰인다). 그렇기에 데이터 형식을 자유롭게 변환할 수 있고 속성에 접근할 수 있다.
아래 예시는 Int변수를 Char로 바꾼 것이다.
var number: Int = 120
number.toChar()
박싱도 가능하지만 기본형을 사용하는 것이 메모리를 적게 사용한다.
숫자 데이터 형식
Double, Float, Long, Int, Short, Byte가 있다. 자바와 차이점은 작은 형식이 큰 형식으로 암시적으로 변환되지 않는다.
var age: Int = 12
var earthAge: Long = age // 오류
var earthAge: Long = age.toLong() // 통과
위 코드는 Int인 변수를 Long 변수에 바로 할당하려 해서 오류가 난다. 자바는 Int보다 Long이 더 큰 형식이므로 컴파일이 되지만 코틀린에서는 형변환을 하려면 변수의 형식을 명시적으로 변환해야 한다.
메소드를 사용해서 형변환을 해도 되고 숫자 리터럴을 지정하는 방법도 있다. Long으로 지정하고 싶으면 L
, float은 F
또는 f
를 숫자 뒤에 붙이면 된다. 16진수는 0x
, 2진수는 0b
를 숫자 앞에 붙이면 된다.
문자, 문자열 데이터 형식
문자는 Char 형식에 저장된다. 작은 따옴표('
)를 사용해 정의하면 된다. 문자열을 저장하는 String 형식은 큰 따옴표("
)를 사용한다.
Char와 String 변수 모두 특수문자를 사용할 때 백슬래시를 사용해야 한다. 코틀린의 escape sequence는 다음과 같다.
\t
: 탭\b
: backspace\n
: 줄바꿈\'
, \"
: 따옴표\/
: 슬래시\u
: 유니코드 escape sequence배열
Array 클래스로 배열을 나타낼 수 있으며, 코틀린 라이브러리 함수를 사용한다. arrayOf()가 보편적으로 쓰인다.
val array = arrayOf(1, 2, 3)
위 예시에서 유추되는 형식은 Array<Int>
이다. 만약 Int말고 다른 데이터 형식을 원한다면 배열 형식을 명시적으로 지정하면 된다.
val array: Array<Short> = arrayOf(1, 2, 3)
val array: shortArrayOf(1, 2, 3)
첫번째 코드처럼 박싱표현을 사용하면 되지만, 메모리를 더 많이 사용하게 되기 때문에 두번째 코드처럼 특수한 데이터형식 클래스의 메소드를 사용하면 된다. 다만 메소드를 사용하는 방법은 해당 클래스로 형식이 유추되기 때문에 주의해야 한다. 두번째 코드의 유추 형식은 ShortArray
이다.
arrayOfNulls 함수는 지정한 크기만큼 배열을 null로 채운다.
val array = arrayOfNulls(3)
println(array) // output: [null, null, null]
Boolean
true 또는 false 값을 가질 수 있으며, null도 허용될 수 있다. 다만 조건에는 null 불허인 boolean만 사용할 수 있다.
val answer: Boolean = true
val answer: Boolean? = null
String (문자열)
코틀린에서는 문자열에 인덱싱이 되어있어 각각의 문자에 인덱스로 접근할 수 있다. 또한, 여러 확장들로 문자열 작업을 쉽게 할 수 있다. compareTo, equals, hashCode, toString 등을 제외하면 메소드들이 String 클래스에 있는 것이 아니라 확장에 있다는 점을 알아두자.
공식문서에서 문자열 사용에 유용한 모든 확장 메소드를 확인할 수 있다.
+
기호로 변수와 단어들을 이어 문자열을 만들었던 자바와 달리 코틀린에서는 문자열 안에서 $
기호 옆에 변수 이름을 붙이기만 하면 된다.
val username = "Halley"
val message = "Welcome $username!"
println(message) // output: Welcome Halley!
이렇게 ${변수}
형태를 문자열 템플릿이라고 하며, 자바스크립트에서도 사용되는 개념이다. 문자열 템플릿은 단일 변수에만 제한되지 않아서 값을 변환하는 함수를 호출하거나 속성에 접근할 수 있다.
val username = "Halley"
val message = "Your name has ${username.length} characters"
println(message) // output: Your name has 6 characters
범위
일련의 값들의 순서를 정의하는 방법이다. 형식은 다음과 같다.
val 변수이름 = 첫번째값..마지막값
범위에 첫번째값과 마지막값이 포함된다. 또한, 범위는 기본적으로 순서대로 1씩 증가하기 때문에 역순으로 순회하려면 downTo함수를 사용해 증가 단계를 -1로 만들어야 한다.
for (i in 1..5) print(i) // output: 12345
for (i in 'g'..'l') print(i) // output: ghijkl
for (i in 5..1) print(i) // 출력값 없음
for (i in 5 downTo 1) print(i) // output: 54321
step을 이용해 증가단계를 다르게 설정할 수 있다.
for (i in 1..6 step 2) print(i) // output: 135
문자의 범위를 지정할 때는 작은 따옴표를 써야 한다.
범위를 활용해 특정 값이 해당 범위 안에 있는지 확인할 수 있다.
val myWeight = 53
val healthy = 48..57
if (myWeight in healthy)
println("I'm healthy!")
else
println("I have to exercise")