[코틀린 스터디 03] 0530

ssook·2021년 5월 30일
0

● null을 허용한 변수 검사

코틀린의 변수 선언은 기본적으로 null을 허용하지 않음

val a: Int

위처럼 선언만 하고, 값이 들어있지 않은 경우 null이라고 함.
이러한 상태에서 참조할 경우 에러가 발생.
따라서, null값을 쓰기 위해서는 아래처럼 null이 가능한 선언을 해야 함

val a: Int? = null

→ 단순 출력은 상관 없으나 널인 상태에서 연산된는 멤버에 접근할 때 nullPointerException가 발생
(사용할 수 없는 null인 변수에 접근하면서 발생하는 예외)

● Safe Call

fun main() {
	var str1: String?
    str1 = null
    println("str1: $str1")
}

fun main() {
	var str1: String?
    str1 = null
    println("str1: $str1, length: ${str1.length}")
}


null값에 접근해 연산을 하려 했기에 오류가 발생하는 것을 확인할 수 있다.
이처럼 null의 가능성이 존재하거나 null인 경우, safe call(?.)을 호출할 수 있다.

fun main() {
	var str1: String?
    str1 = null
    println("str1: $str1, length: ${str1?.length}")
}

❗safe call은 null 값이 발생한 경우, safe call 이후의 명령문을 수행하지 않는다❗

+ 넌널 단정기호, !!

!!는 널이 아닐 것이라고 단정하여 컴파일러가 오류를 무시하게 함.

fun main() {
	var str1: String?
    str1 = "hi"
    println("str1: $str1, length: ${str1!!length}")
}
fun main() {
	var str1: String?
    str1 = null
    println("str1: $str1, length: ${str1!!length}")
}

이 경우 NEP가 발생.
따라서, 최대한 쓰지 않는 것이 좋음.

또한, if문을 이용해 미리 검사할 수 있음.

fun main(){
	var str1: String?
    str1 = null
    val len = if(str1 != null) str1.length else -1
    println("str1: $str1, length: $len ")
}

이를 아래처럼 엘비스 연산자로 간단하게 줄여 표현할 수 있음.

fun main(){
	var str1: String?
    str1 = null
    val len = str1?.length ?: -1 //safe call을 이용해 더 안전하게 사용 가능
    println("str1: $str1, length: $len ")
}

✅자료형 비교, 검사, 변환

● 코틀린의 자료형 변환

  • 기본형을 사용하지 않고 참조형만 사용
  • 서로 다른 자료형은 변환 과정을 거친 후 비교
  • 자바와는 다르게 자동으로 형 변환 과정이 없어 오류가 발생하므로 꼭 변환 과정을 거쳐야 함.

변환 메소드의 이용

val a: Int = 1
val b: Double = a.toDouble()

변환 메소드에는 아래와 같은 종류가 있다.

  • toByte: Byte
  • toLong: Long
  • toShort: Short
  • toFloat: Float
  • toInt : Int
  • toDouble : Double
  • toChar: char

표현식에서 자료형의 자동 변환

val result = 1L + 3
// Long형과 Int형의 연산, 더 큰 Long으로 자동 형 변환

✅기본형과 참조형 자료형의 비교 원리

● 이중 등호(==)와 삼중 등호(===)의 사용

  • == : 값만 비교하는 경우
  • === : 값과 참조 주소를 비교할 때
val a: Int = 128
val b: Int? = 128
println(a == b)
println( a === b)

● 스마트캐스트

구체적으로 명시되지 않은 자료형을 자동 변환할 때 사용

  • 값에 따라 자료형을 결정
  • Number 형은 숫자를 저장하기 위한 특수한 자료형으로 스마트 캐스트 됨.
fun main(){
var test: Number = 12.2 //Float형
println("$test")

var test: Number = 12 //Int형
println("$test")

var test: Number = 120l //Long형
println("$test")

var test: Number = 12.0f //Float형
println("$test")
}

● is 키워드를 사용한 검사

데이터의 자료형을 사용할 때 사용.

val num = 256
if(num is Int){
print(num)}
else (num !is Int) //!(num is Int){
print("not")}

● 묵시적 변환

any

  • 자료형이 정해지지 않은 경우
  • 모든 클래스의 뿌리, Int나 String 형은 Any형의 자식 클래스임.
  • Any는 언제든 필요한 자료형으로 자동 변환(스마트 캐스트)

▼ any 형으로 인자 받는 함수 만들기

fun main(){
	checkArg("hello")
    checkArg(5)
}

fun checkArg(x: Any){
	if(x is String){
    	println("x is String: $x")
    }
    if(x is Int){
    	println("x is Int: $x")
    }
}
profile
개발자에서, IT Business 담당자로. BrSE 업무를 수행하고 있습니다.

0개의 댓글