Search
castle

document

kotlin document

변수명 규칙

  • 숫자 시작 불가
  • keyword 불가
  • variable : camelExpression
  • file, class : UpperCamel
// varable
var camelCase
var numberOfBook

// class
class AnimalCategory
class CarEngine

변수 타입

assignmet를 통해 compile time typing 가능.
declationexplicit typing 필요

  • strong & static typed + null 안전성
  • variable_type : 변수 타입
    • val(value) : immutable
    • var(variable) : mutable
  • variable_type variable: type = value
    • variable_type : 변수 타입
      • 기본적으로 null 할당 불가
      • variable_type? : null 할당 가능하다고 선언
    • : : type 지정 선언
    • "" : double quotation(String)
    • '' : Char type
// type 선언
val username: String = "heeeeee"
// declation + explicit type
val int: Int
// assignment + implicit type
val username = "aaa"

data type

  • variable.javaClass : return javaClass
package org.example

fun main() {
    var numEx: Number = 99.2345
    println("numEx = $numEx type : ${numEx.javaClass}")   // class java.lang.Double
    
    numEx = 19
    println("numEx = $numEx type : ${numEx.javaClass}")   // class java.lang.Integer
    
    numEx = 19L
    println("numEx = $numEx type : ${numEx.javaClass}")  // class java.lang.Long

    numEx = 19F
    println("numEx = $numEx type : ${numEx.javaClass}") // class java.lang.Float
}

Primitive type

  • stack 저장
  • byte, short, int, …
    • compile time typing, explicit 선언 X
  • Int, Double : 기본 type
    • 100L : Long type 선언
    • 기본 type에서 byte를 넘어갈 시 범위에 맞게 추론
    • rvaluetype checking 하는 듯?
  • _ : 정수 타입에서 무시됨(사용자 편의 범위 표시)
  • is
    • is + 변수 → Boolean(implicit)
    • 단 선언 시 explicit 선언 필요
  8비트(1byte) 16비트(2byte) 32비트(4byte) 64비트(8byte)
정수 Byte Short Int Long
실수     Float Double
문자   Char    
부울값 boolean      

// Int
val num_var = 210000
val int_var = 0x0F
val int_var = 0b000101

// Long
val long_var = 9223373548354135563541535
val long_var = 9_223_373_548_354_135_563_541_535
val long_var = 123L
val long_var: Long =321

// Byte
val byte_var: Byte = 123

// Double
val double_var = 3.14

// Float
val float_var = 3.14F

// Boolean
val isOpen = true
val isBool: Boolean

fun main() {
    val name = "Kotlin";
    var num = 0.1;
    var numF = 0.1F;

    for (x in 0..999) {
        num += 0.1;
        // numF += 0.1;   // error
        numF += 0.1F
    }
    println("num:$num")
    println("numF:$numF")
}

>>>

num:100.09999999999859
numF:100.099045

부동 소수점

자료형 유효 소수 이하 자리
Double 15자리
Float 7자리

Reference type

  • 기본 선언 type
  • Byte, Short, Int, …
    • 대문자 시작
    • complie time
    • Object
  • 참조 타입
  • Heap 저장
자료형 비트수 범위 기본값
String 고정 X 제산 없음 null

String

  • String Pool : Heap, String 저장 공간
  • 동일한 리터럴(literal value) : String 객체 공유
  • == : value 비교
  • === : value + 참조(reference) 비교, alias
    • !== : not ===
**package org.example

fun main() {
    val strEx01: String = "str"
    val strEx02 = "str_diff" 
    val strEx03 = "str"

    println("$strEx01 == $strEx02 ${strEx01 == strEx02}")
    println("$strEx01 == $strEx03 ${strEx01 == strEx03}")
    println("$strEx01 === $strEx04 ${strEx01 === strEx03}")
}

>>>

str == str_diff false
str == str true
str === str true**
  • " ... $integer ...
    • 문자로 인식
    • $integer 이후 문자 : 사이 공백 필요
    • type conversion 방식?
package org.example

fun main() {
    val strEx = "str"
    val integerEx = 111

    println("$integerEx")
    println(integerEx)
    println("$strEx expression $integerEx str")
}

>>>

111
111
str expression 111 str

Const

  • 변하지 않는 값을 입력
  • 읽기 전용 변수 val앞에 const 키워드
  • local variable : const 선언 불가
const val foo = complexFunctionCall()   //Not okay
val fooVal = complexFunctionCall()  //Okay

const val bar = "Hello world"       //Also okay

fun main() {
    const val bar = "Hello world"       //Not okay
}
  • constexpr(C++) vs val
특징 Kotlin val Kotlin const val C++ constexpr
재할당 가능 여부
값 확정 시점 런타임 가능 컴파일 타임 컴파일 타임
함수 결과 가능? ✅ (런타임) ✅ (constexpr 함수)
주 용도 읽기 전용 참조 컴파일 타임 상수 컴파일 타임 상수

NULL

  • null
  • not null type : 기본적으로 허용 X
  • ? (declation)
    • reference variable
    • null 값 허용 선언
  • ?(safe call) : null값일 시 shortcut circuit 적용
  • !!(non-null assertion) : non null 명시
    • run-time error
  • NIPE(NullPointerException) : 사용할 수 없는 null인 변수에 접근하면발생하는 예외
    • dangling pointer
package org.example

fun main() {
    var str: String?
    str = null

    println("str : $str")
    println("str.length : ${str?.length}")

    str = "null"
    println("str.length : ${str?.length}")
    println("str.length : ${str!!.length}")
}

>>>

str : null
str.length : null

// ?
ain.kt:11:32: warning: unnecessary safe call on a non-null receiver of type String?
    println("str.length : ${str?.length}")
                               ^
str : null

// !!
ain.kt:11:32: warning: unnecessary non-null assertion (!!) on a non-null receiver of type String
    println("str.length : ${str!!.length}")
                               ^
str.length : 4  
  • 함수형 언어 특징
    • var variable = if(condition) true_value else false_value : 조건문 할당
package org.example

fun main() {
    var str: String?
    str = null

    // 조건식을 통해 null 상태 검사
    var strLen = if(str == null) "null" else str.length
    println("str : $str, lenth: $strLen")
}

>>>

Main.kt:8:21: warning: condition 'str == null' is always 'true'
    var strLen = if(str == null) "null" else str.length
                    ^
Main.kt:8:50: warning: unreachable code
    var strLen = if(str == null) "null" else str.length
                                                 ^
str : null, lenth: null
  • ?:(엘비스 연산자)
    • variable?.method ?: "value" : return if(variable == null) null else variable?.method
package org.example

fun main() {
    var str: String? = "aaa"

    println("str : $str, lenth: ${str?.length ?: "is null"}")

    str = null
    println("str : $str, lenth: ${str?.length ?: "is null"}")
}

>>>

str : aaa, lenth: 3
str : null, lenth: is null

형변환

  • 참조형만 사용(기본형 X)
  • type widen X (strong typing)
    • 단 expression 내에서는 가능
  • const variable : 형변환 가능
val a = 1           
val v: Double = a   // type error
val c: Int = 1.1    // type error

val d = 1L + 10     // Long type
  • variable.toType() : 원하는 type으로 변환
package org.example

const val int = 10
fun main() {
    // val int = 10
    val double: Double = int.toDouble()
    val int2: Int = double.toInt()

    println("int : $int")        // int : 10
    println("double : $double")  // double : 10.0
    println("int2 : $int2")      // int2 : 10
}

Any

  • 모든 클래스의 조상, class 상속으로 smart casting(overriding, overloading) 구현
  • java, kotlin : 단일 상속 지원
  • object의 root class
  • 즉 모든 object는 Any를 자동 상속
  • java : java.lang.Object
package org.example

fun main() {
    anyFunc(100)    // anyPar is Int: 100 type: 100.javaClass
    anyFunc("str")  // anyPar is String: str type: str.javaClass
}

fun anyFunc(anyPar: Any){
    if(anyPar is Int)
    println("anyPar is Int: $anyPar type: $anyPar.javaClass")

    if(anyPar is String)
    println("anyPar is String: $anyPar type: $anyPar.javaClass")
}

Smart Casting

  • implicit type
  • Nunber type : interger, float, … 등 숫자 타입 저장을 위해 특수한 데이터 타입으로 스마트 캐스트
package org.example

fun main() {
    var numEx: Number = 99.2345
    var numEx: Any = 99.2345
    println("numEx = $numEx type : ${numEx.javaClass}")   // class java.lang.Double
    
    numEx = 19
    println("numEx = $numEx type : ${numEx.javaClass}")   // class java.lang.Integer
    
    numEx = 19L
    println("numEx = $numEx type : ${numEx.javaClass}")  // class java.lang.Long

    numEx = 19F
    println("numEx = $numEx type : ${numEx.javaClass}") // class java.lang.Float
}

is

  • type checking
  • var1 is var2
  • var1 !is var2
package org.example

fun main() {
    var numEx: Number = 99999

    println(numEx is Int)   // true
    println(numEx !is Int) // false
}

as

  • casting operation
  • variable as Type
    • compile time checking X
    • run-time error
    • class 상속 관계 기반
  • variable as? Type : null-sage casting operation
    • casting 실패 시 null
package org.example

fun main() {
    val obj: Any = "str"
    val str = obj as String
    println("str: $str, type: ${str.javaClass}")  // str: str, type: class java.lang.String

    val num: Any = 1111
    val strval = num as? String
    println("strval: $strval")  // strval: null
    // println("strval: $strval, type: ${strval.javaClass}")
}

>>>

val strval = num as String
Exception in thread "main" java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String (java.lang.Integer and java.lang.String are in module java.base of loader 'bootstrap')
	at org.example.MainKt.main(Main.kt:9)
	at org.example.MainKt.main(Main.kt)

예제

package org.example

fun main() {
    typeRange("Int", Int.MIN_VALUE, Int.MAX_VALUE)
}

fun typeRange(type: String, min_value: Int, max_value: Int){
    println("$type: ${min_value}, ${max_value}")
}

package org.example

fun main() {
    val null_val = null
    val str_val = "str"
    
    safePrint(null_val as? String)  // null
    safePrint(str_val as? String)   // str
}

fun safePrint(input: String?){
    println("$input")
}

package org.example

fun main() {
    val str = "str"
    val num = 111

    printType(str)   // strval: str, type: class java.lang.String
    printType(num)   // strval: null, type: wrong type
}

fun printType(variable: Any){
    val strval = variable as? String
    println("strval: $strval, type: ${strval?.javaClass ?: "wrong type"}")
}
left
right

C

Contents