모든 코드 실행은 Kotlin REPL으로 진행했습니다.
1/2
res3: kotlin.Int = 0
1.0/2.0
res4: kotlin.Double = 0.5
위처럼 다른 언어와 같이 숫자 유형에 따라서 반환 값이 달라집니다. int는 소수점을 버리기 때문에 0으로 나오는걸 볼수있습니다.
그럼 형변환도 이뤄지나?
1/2.0
res5: kotlin.Double = 0.5
1.0/2
res6: kotlin.Double = 0.5
자동으로 자료형을 바꿔서 계산합니다!
참고로 일반 원시 자료형에 대해서 객체처럼 메소드도 호출할수있습니다.
1.div(3)
res7: kotlin.Int = 0
1.0.div(3)
res8: kotlin.Double = 0.3333333333333333
참고: 숫자 주위에 실제 객체 래퍼를 만들 수 있으며, 이를 박싱 이라고 합니다 . 박싱은 컬렉션과 같이 필요에 따라 숫자가 박싱되고 언박싱되는 경우 자동으로 발생합니다.
나중에 리스트,셋,맵과 같은곳에 원시 자료형은 사용하지 못합니다. 때문에 일반 값을 객체로 바꿔야 하는데 이런걸 박싱이라고 합니다. 그냥 참고정도로 알아둡시다!
val b2: Byte = 1
println(b2)
1
val i1: Int = b2
error: type mismatch: inferred type is Byte but Int was expected
val i1: Int = b2 // 다른 자료형을 바로 대입하려니까 오류가 발생합니다
^
val i1: Int = b2.toInt() // 형변환을 시켜준뒤 대입해야 오류가 발생하지 않습니다.
println(i1)
1
위의 코드를 실행해보면서 알수있듯, 코틀린은 암묵적 형변환이 이뤄지지 않습니다. 예를 들어 long에 int를 못넣는다는 얘기입니다. 이를 해결하기 위해 .to
를 사용하여 캐스팅을 해준뒤에 할당해야 합니다.
val m1 : Int = 1
val m2 : Long = m1
error: type mismatch: inferred type is Int but Long was expected
val m2 : Long = m1
^
val m2 : Long = m1.toLong()
또 코틀린에서는 가독성을 위한 언더바도 허용합니다.
val oneMillion = 1_000_000
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010
참고: Kotlin은 컴파일러가 일반적으로 변수의 형식을 추론할 수 있으므로 명시적으로 변수의 형식을 선언할 필요가 없습니다.
즉val mNumber = 10
처럼 선언해도 무방합니다.
일반적으로 변수와 상수를 언어에서는 지원하죠. 값을 한번 할당하고 재할당의 가능 여부를 코틀린에서는 val과 var로 구분합니다.
var fish = 1
fish = 2
val aquarium = 1
aquarium = 2
error: val cannot be reassigned
aquarium = 2
^
여기서 val로 선언된 변수는 재할당이 불가능 하다고 나옵니다. 또한 변수형은 명시적으로 지정할수도 있지만 컴파일러가 문장에서 추론할수도 있습니다. 때문에 명시적 선언이 항상 필요한것은 아니나,
사용자 또는 컴파일러가 유형을 할당한 후에는 유형을 변경할 수 없으며, 유형을 변경하면 오류가 발생합니다.
코틀린에서 문자열은 대부분 다른 프로그래밍 언어에서와 유사하게 동작하며, 큰따옴표(")는 문자열을, 작은따옴표(')는 단일 문자를 나타냅니다. 문자열은 + 연산자를 사용하여 이어붙일 수 있습니다. 또한 문자열 템플릿을 사용하여 변수와 결합할 수 있으며, $변수이름은 해당 변수의 값으로 대체됩니다. 이를 variable interpolation이라고 합니다.
val age = 25
val name = "Min"
"제 이름은 $name 이고 " + "나이는 $age 입니다."
res39: kotlin.String = 제 이름은 Min 이고 나이는 25 입니다.
또한 중괄호를 사용해서 수식을 집어넣을수도 있습니다.
val geckos = 2
val dogs = 3
"저는 총 ${geckos + dogs}마리의 동물들을 키워요."
res40: kotlin.String = 저는 총 5마리의 동물들을 키워요.