[Kotlin] 변수(variable)
-
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가 잡는다)
- nullable 변수이지만 아무리 생각해도 무조건 null이 될 수 없는 경우
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
}