[kotlin] null-safety / 예외처리
2023. 2. 2. 01:24ㆍJAVA 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 |
---|