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")
}