• var : 변수, variable
  • val : 상수, value

  • 코틀린은 선언된 기본 값을 보고 타입을 추론
val number1 = 1    // Int
val number2 = 1L   // Long
val number = 100_000  // Int

val number3 = 3.0f  // Float
val number4 = 3.0   // Double
val number5 = .25   // 0.25

val bin = 0b10101   // 21
val hex = 0xF9      // 249
  • 코틀린은 타입 변환을 명시적으로 해야 한다
val number1 : Int = 4
val number2 : Long = number1.toLong() 
  • 값을 할당 하지 않으면 타입이라도 지정해 줘야 한다 (컴파일 에러 발생)
  • 코틀린은 래퍼 클래스만 사용
    • 내부에서 자동으로 primtive 타입으로 변환한다. 즉, 박싱/언박싱을 고려하지 않아도 됨
long number1 = 10L;
final long number2 = 10L;
Long number3 = 1000L;

↓↓↓↓↓

var number1 = 10L
val number2 = 10L
var number3 = 1000L

val number4 : Long
number4 = 10000L
print(number4)

특별한 타입

  • Any : 자바의 Object 타입
    • 모든 타입의 조상
  • Unit : 자바의 void 타입
    • 아무것도 return 하지 않음을 나타냄
  • Nothing : 존재하지 않음을 나타내는 타입
    • 코틀린에만 존재하는 타입
    • 함수가 종료되지 않을 경우, exception을 터뜨리는 함수의 경우 같이 return 자체가 존재 하지 않을 때 Unit 대신 Nothing을 사용할 수 있다
    • 모든 타입의 자식

String

val s = "Hello"

println(s[0])         // H
println(s.length)     // 5
println(s.lastIndex)  // 4

문자열 탬플릿(String Template)

  • ${}를 통해 문자열 탬플릿에 변수를 넣을 수 있다
    • 변수의 경우 중괄호 생략가능
import java.util.Date

fun main() {
    val name = "europa"
    println("Hello, $name~! Today is ${Date()}")
}

nullable

  • 코틀린의 타입 시스템은 not null타입과 nullable타입이 확실하게 구분되어 있어 컴파일 시점에 확인할 수 있다
  • 코틀린은 default가 Not Null 타입 이다
  • nullable 시 ? 사용
var number : Long? = 400L
number = null

Safe call

  • ? 앞의 변수가 null이 아니면 실행하고 null이면 null을 리턴
val str : String? = "ABC"
str.length  // 불가능
str?.length  // 가능 (return:3)

val str : String? = null
str?.length  // null

str은 nullable이기 때문에 ?을 추가해야 한다

Elvis 연산자

  • ?: 앞의 연산 결과가 null이면 설정한 값을 사용
val str : String? = null
str?.length ?: 0    // 0
  • null이 무조건 아닌 변수 (not-null assertion)
    • nullable 변수이지만 아무리 생각해도 무조건 null이 될 수 없는 경우 !! 사용
    • 해당 키워드를 사용했는데 혹시나 null이 들어온다면 NPE 발생
    • BUT, DO NOT USE !! (SonaQube가 잡는다)
fun startsWith(str : String?){
  return str!!.startWith("A")
}

스마트 캐스팅(Smart Cast)

  • 코틀린은 not null 타입과 nullable 타입이 별개의 타입으로 취급되고 있다
  • null 체크를 하면 nullable -> not null 타입으로 자동으로 캐스팅해준다
fun isLetterString(s : String?) : Boolean {
  // null 체크
  if (s == null) return false

  // 스마트 캐스팅 발동 (s : String? -> String 캐스팅)
  if (s.isEmpty()) return false

  return true
}