@) See Also
Basic TypesData Types

타입 추론이 되는 경우는 회색으로 타입을 명시 하지 않아도 됨을 알려준다.
리터럴을 확인해 보자
println("b = $b ${b.javaClass}") println("f1 = $f1 ${f1.javaClass}") println("boolean1 = $boolean1 ${boolean1.javaClass}") println("str = $str ${str.javaClass}")
b = 127 byte f1 = 3.14 float boolean1 = true boolean str = ABC class java.lang.String
Variable vs. Constant
var
variable : 변수 - 저장하는 데이터가 언제든 변할 수 있는, 메모리 공간에 붙인 이름
val
constant : 상수 - 단 한번 초기화 되는 value 값을 갖는, 일종의 네임드 상수; java
final
package my val familyName = "Hong" var givenName: String = "GilDong" fun printMyName() { println("My name is '$givenName $familyName`") } fun main() { givenName = "Alice" //재할당 reassign var // familyName = "Kim" //Error - Val cannot be reassigned printMyName() }
fun main() { val favNumber: Int = 7 var myAge = 7 println("favNumber = ${favNumber.inc()}") println("myAge = ${myAge.inc()}") println("favNumber = ${favNumber}") println("myAge = ${myAge}") }
favNumber = 8 myAge = 8 favNumber = 7 myAge = 7
Numbers

b.javaClass = byte -128 ~ 127 s.javaClass = short -32768 ~ 32767 i.javaClass = int -2147483648 ~ 2147483647 l.javaClass = long -9223372036854775808 ~ 9223372036854775807 f.javaClass = float 1.4E-45 ~ 3.4028235E38 d.javaClass = long 4.9E-324 ~ 1.7976931348623157E308
Overflow

sumTwoByte() = -128
sumTwoByteToInt() = 128
Char & String
Base/Radix
Any
~ 자바의
Object
package kotlin public open class Any { public open operator fun equals(other: Any?): Boolean public open fun hashCode(): Int public open fun toString(): String }
kotlin.Any
package main fun main() { //kotlin.Any 최상위 타입 클래스 val a1 : Any = 1234 val a2 : Any = 'A' var a3 : Any = "xyz" a3 = 3.141592 a3 = true }
is
연산자
~ 자바의
instanceof
package main fun main() { val b1 = 365 println(b1 is Int) // 타입 체킹 is }
is
연산자가 조건문의 판별식에 작성된 경우블락 내에서 smart casting 이 적용된다.
캐스팅
package main fun main() { val c: Byte = 127 val c2 : Any = c val d: Byte = c2 as Byte val d2: Int = c2 as Int// ClassCastException }
package main fun whichType(data: Any){ if(data is String) { println("data.length = ${data.length}") }else if(data is Int){ println("data*2 = ${data*2}") }else{ println("$data 는 ${data.javaClass} 형이다.") val result = data as? Float println("float 라면? data = $result") } } fun main() { whichType(1); whichType("hi") whichType(1.0F) whichType(true) } 실행 결과 : --- data*2 = 2 data.length = 2 1.0 는 class java.lang.Float 형이다. float 라면? data = 1.0 true 는 class java.lang.Boolean 형이다. float 라면? data = null
type caseting
- as 캐스트 연산자 : 타입변환 예외 발생 가능성
smart type cast
- 타입 추론하여 자동 변환
- 연산 결과 자동 형 변환, is 타입 체크 판단 문맥, …
explicit conversions
- toByte(), toInt(), toShort(), toLong(), toFloat(), toDouble()
- (형변환 x) toChar(), toString()
safe case - nullable 타입으로 변환해준다.
Nullable
fun main() { var a: String = "ABCD" //non-null type // a = null //Null can not be a value of a non-null type String var b: String? = "XYZ" //nullable type // b = null //null 저장 가능 println("a.length = ${a.length}") // println("b.length = ${b.length}") // Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String? println(b?.length) //safe call -> null println(b!!.length) //non-null asserted call -> KotlinNullPointException println("b의 길이 => ${ if(b!=null) b.length else "b는 null임!" }") println("b의 길이 => ${b?.length ?: "b는 null임!"}") }
null
이 아닌것이 확인이 된다면 String?
가 String
으로 smart casting 되어 length 를 안전하게 참조 할 수 있음이를 한줄로사용한 것이 Elvis 연산자