본문 바로가기
개발/Kotlin

[코틀린] 변수와 자료형, Null 처리

by 윤호 2021. 12. 8.

코틀린에서 메인 함수는 자바와 달리 클래스 안에 생성하지 않는다.

fun main(){
    // 실행 내용
}

 

변수와 자료형

val과 var

  • val : 초기화 후 더이상 변경할 수 없음
  • var : 초기화 후에도 값을 바꿀 수 있음

var/val 변수명: 타입 = 값

val number = 10  // number는 Int로 추론
var language = "Korean" // language는 String으로 추론
val secondNumber: Int = 20 // sercondNumber는 자료형을 Int로 명시적으로 지정
var name: String // 초기화하지 앙않으면 타입을 명시해야함
language = "English" // var 선언이므로 변수의 값을 재할당 할 수 있다.

 

타입은 기본적으로 생략이 가능하다. 코틀린은 타입을 알아서 추론해줌

단, 초기화하지 않고 생성만할 경우엔 타입을 명시해줘야한다.

 

기본형과 참조형

  • 자바는 int, double 등의 기본형과 String, Date 등의 참조형을 모두 사용함
  • ## 코틀린은 참조형만 사용함, 하지만 컴파일을 거치면서 참조형을 기본형으로 바꿈
  • 기본형 : 메모리(스택)에 값 자체가 들어있으며, 실행시 코드 수행 시간이 더 빠름
  • 참조형 : 메모리(스택)에 값을 가리키는 주소가 들어가 있음 (가리키는 값은 힙에 저장돼있다)

 

문자열에 표현식 사용

var a = 1
val str1 = "a = $a"
val str2 = "a = ${a + 2}" // 문자열에 표현식 사용
println("str1: \\"$str1\\", str2: \\"$str2\\"")

 

null을 허용한 변수 검사하기

기본적으로 변수에 null 할당을 허용하지 않는다. NotNull

var str1 : String = "Hello Kotlin"
str1 = null // 기본적으로 null을 허용하지 않으므로 에러

 

타입에 ? 기호를 추가하여 Nullable 타입으로 지정할 수 있다.

var str1 : String? = "Hello Kotlin"  // null 허용
str1 = null
println("str1: $str1 length: ${str1.length}")  // null일 경우 NPE 발생

 

Nullable 타입에서 메소드 사용은 세이프 콜(?.) 또는 non-null 단정 기호(!!.)를 사용해야한다.

var str1 : String? = "Hello Kotlin"  // null 허용
str1 = null
println("str1: $str1 length: ${str1?.length}")  // str1이 null이면 length에 접근하지 않음
println("str1: $str1 length: ${str1!!.length}")  // str1이 null이면 NPE 발생

 

세이프 콜과 엘비스 연산자(?:)를 이용해서 nullable 타입을 안전하게 사용할 수 있다.

?: 는 변수가 null이 아니라면 왼쪽 식을, null이라면 오른쪽 식을 실행한다.

var str1 : String? = "Hello Kotlin"
str1 = null
println("str1: $str1 length: ${str1?.length ?: -1}") // str1이 null이면 -1 실행 

 

자료형 비교, 검사, 변환

자바에서는 자료형이 다르면 자동 변환 되지만, 코틀린에선 변환 함수를 사용해야한다.

val a: Int = 1
val b: Double = a.toDouble() // 변환 메소드 사용

표현식에서 자료형이 다른 경우 범위가 큰 자료형으로 자동 형 변환 된다.

val result = 1L + 3 // Long 형 + Int 형 -> Long 형

 

이중 등호(==)는 값을 비교하고 삼중 등호(===)는 참조 주소를 비교할 수 있다.

val a: Int = 128
val b = a
println(a === b) // 자료형이 기본형인 int가 되어 값이 동일하기 때문에 true
val c: Int? = a
val d: Int? = a
val e: Int? = c
println(c == d) // 내용만 비교하는 경우 동일하므로 true
println(c === d) // 내용은 같지만 다른 객체(주소 다름)이므로 false
println(c === e) // 내용은 같지만 같은 객체(주소 동일)이므로 true

 

스마트 캐스트를 이용해서 여러 타입의 값을 저장할 수 있다. 이는 컴파일러가 자동 형 변환을 함

스마트 캐스트가 적용되는 대표적인 자료형으로 Number가 있다.

var test: Number = 12.2 // 12.2에 의해 test는 Float형으로 스마트 캐스트
test = 12  // Int형으로 스마트 캐스트
test = 120L // Long형으로 스마트 캐스트
test += 12.0f  // Float형으로 스마트 캐스트

 

is 키워드를 사용해서 변수의 자료형 알아낼 수 있다. 변수와 타입이 같은지 Boolean 값을 반환

is는 변수를 해당 자료형으로 변환하는 기능도 있음. 검사를 할 때, 스마트 캐스트가됨.

val num = 256
num is Int // true
val x: Any // 코틀린의 최상위 클래스
x is String // x가 String 타입으로 변환됨

as로 스마트 캐스트할 수 있다.

val x: String = y as String // y를 String으로 변환하고 x에 할당

 


reference : Do it! 코틀린 프로그래밍 2장

댓글