[kotlin] null-safety / 예외처리

2023. 2. 2. 01:24JAVA Back-End/kotlin

kotlin에서의 null 안정성을 정리

 

널 안정성 (null-safety)

1. null참조의 위험성

 프로그래밍 언어에서 가장 많이 발생하는 예외 유형은 NullPointerException  - 줄여서 NPE

null을 발명한 토니호어는 1965년 null을 발명 후 수십년간 수십억 달러의 시스템 오류 및 피해가 발생해 null을 개발한 게 1조 짜리 실수였다고 고백함... ㅜㅜ

>> 자바는 NPE을 줄이기 위해 Optional을 지원

>> 자바의 Optional은 값을 래핑하기 위해 때문에 객체 생성에 따른 오버헤드(미미하지만) 발생하고, 컴파일 단계에서 null가능성을 검사하지 않음 ㅜ

 

>> 코틀린을 비롯한 최신 언어에선 null가능성을 컴파일러가 감지해서 NPE가능성을 줄일 수 있음!

 

fun getNullStr(): String? = null
// null인 경우 앨비스 연산자로 0
fun getLengthIfNotNull(str: String?) = str?.length ?: 0

fun main() {    
    //null처리
    val nullableStr = getNullStr()
    val nullableStrLength = nullableStr?.length ?: "null인경우반환".length;
    
    println(nullableStrLength);
    
    val length = getLengthIfNotNull(null)
    println(length)
    
}

 


예외처리

코틀린의 모든 예외 클래스는 최상위 예외 클래스인 Throwable 을 상속함

Throwable을 크게 Error와 Exception으로 나뉨

 

* Error

시스템에 비정상적 에러. 예측이 어렵고 기본적 복구가 불가 ㅜㅜ

ex)  StackOverflowError, OutOfMemoryError, etc...

 

* Exception

시스템에서 포착 가능하여(try-catch) 복구 가능. 예외 처리 강제

  • IOException, FileNotFoundException, etc.. 
  • @Transactional 에서 해당 예외가 발생하면 기본적으로 롤백은 동작하지 않음.
  • RuntimeException
    런타임시 발생하는 예외. 예외 처리를 강제하지 않음.
    ex) 대표적으로 NullPointerException (NEP)

 

자바에선 checked excetion은 컴파일 에러가 발생하기 때문에 무조건 try-catch로 감싸거나 throws로 예외를 전파해야함.

Thread.sleep(1); // 무조건 Error

try{
	Thread.sleep(1);
}catch(InterruptedException e){
	// 예외처리
}

 

kotlin 예외 처리

 

// kotlin도 finally로 exception 실행 후 finally에서 한 번 실행
try{
	throw Exception()
}catch(Exception e){
	println("에러 발생!")
} finally {
	println("finally 실행")
}
/*
// output
에러 발생!
finally 실행
*/


// try catch도 표현식이라 바로 값으로 할당 가능.
val a = try {
	"1234".toInt()
} catch (e:Exception){
	println("예외 발생!");
}
println(a)

/*
// output
1234
*/


// throw도 표현식이라 바로 값으로 할당 가능
throw Exception("예외 발생!!")


fun failFast(message: String){
	throw IlliegalArgumentException(message)
}

failFast("fail..예외발생")



// throw는 Nothing을 반환
fun failFast(message: String): Nothing{
	throw IllegalArgumentException(message)
}

fun main() {     
    val b:String? = "bb"
    // c는 Str
    val c = b ?: failFast("a is null")
    // 
    //b에 앨비스로 null체크해주고 Nothing을 반환한다고 명시해서 절대 null이 나올수 없음을 컴파일 단에서 체크  
    println(c.length) 
}

 

 

'JAVA Back-End > kotlin' 카테고리의 다른 글

kotlin 문법 정리 (변수 / 함수 / 흐름제어)  (0) 2023.02.01