[kotlin] null을 다루는 방법

백현균·2023년 3월 19일
0

0. null 취급 변수 선언 방법

1) 변수의 타입 뒤에 ? 키워드를 붙임

	var num1:Int? = nll

1. null 체크

1) 매개변수가 ? 변수 일 경우

fun startsWithA(str:String?):Boolean{
	if(str == null)
    	throw IllegalArgumentException("str is null")
    return str.startsWith("A")

   -> 코틀린 스타일
   // str이 null일 경우 throw
   // 아닐 경우 값 반환
   return str?.startsWith("A") ?: 
   		throw IllegalArgumentException("str is null")
    
}

2) 매개변수 및 반환형이 ? 일 경우

fun startsWithA2(str:String?):Boolean?{
	if(str == null)
    	return null
    return str.startsWith("A")
    
   -> 코틀린 스타일
   // null일 경우 null을 반환
   return str?.startsWith("A");
}

3) 매개변수가 ? 인데 함수를 호출할 경우

fun startsWuthA3(str:String?):Boolean{
	// 에러 발생
    // 값이 null일 수 있기 때문에 코틀린에서 하는 아예 호출하지 
       못하도록 설계 되어있음
    // str.startsWith("A")
    
    // 코틀린에서는 문맥상 널체크를 한번 해줄 경우
    // 그 다음 경우에 대해서 null이 아닐 것이라고 판단 하기에 
    // return str.startsWith("A")은 에러가 아님
    if(str == null)
    	return false
        
    return str.startsWith("A")
    
   -> 코틀린 스타일
   return str?.startsWith("A") ?: false
}

2. null이 가능한 타입을 위한 기능

1) safe call

var str:String? = "abc";
str.length -> error
str?.length -> 가능
	-> null이면 실행하지 않고 null이 아니면 실행

2) Elvis 연산자

var str:String? = "abc"
str?.length ?: 0
	-> 앞 값이 null일 경우 0이고, 아닐 경우 length 값 출력 

3) !!키워드

var str:String? = "abc"
// 타입은 ? 인데, 절대 null이 아님을 의미하는 키워드
// 해당 방식으로 사용 후 str이 null일 경우 NPE발생
str!!.startsWith("A")

4) 플랫폼타입

코틀린이 null 관련 정보를 알 수 없는 타입을 의미
	-> 이런 타입은 런타임 에러가 발생할 수 있음(NPE)

자바와 코틀린을 같이 쓸 경우
자바 객체 클래스
public class person{
	private final String name;
    public person(String name){
    	this.name = name;
    }
    
    @Nullable
    public String getName(){return name;}
}

코틀린에서 호출
val person = Person("개발자")
// 자바의 nullable 어노테이션으로 인해 오류 발생
// 즉, 코틀린은 자바의 어노테이션값들을 인식
// 자바에서 nullable이 없을 경우 코틀린단에선 해당 값이 null여부를
   확인 할 수 없음 -> 플랫폼타입
startsWith(person.name)

fun startsWith(str:String):Boolean{
	return str.startsWith("A")
}

0개의 댓글