티스토리 뷰
자바로 프로그램 개발을 하다보면 널 포인터 예외(Null Pointer Exception) 이 빈번히 발생한 것을 확인 할 수 있습니다.
자바로 구성된 안드로이드에서는 안드로이드 서포트 라이버러리의 @Nullable, @NonNull 어노테이션을 사용하여 객체의 널 허용 여부를 표시하였습니다. 하지만 정적 분석 도구에서만 지원하므로, 컴파일 단계에서는 여전히 널 포인터 예외가 발생할 소지가 있습니다.
널 허용 여부 표기
코틀린은 별도의 표기가 없는 경우 널 값 허용을 하지 않습니다.
val nullableString : String? = nullval nonNullString: String = "Foo"val errorNullString : String //Error 발생. 코틀린은 널 값 허용 하지 않음
널 허용하지 않는 대신 다양한 연산자를 제공하여 Null에서 자유롭게 제공하고 있습니다.
엘비스(?:) 연산자
널 값을 허용하지 않는 값 혹은 변수에 널 값을 반환할 수 있는 함수의 결과를 대입해야 하는 경우
// value가 null이 아닌 경우는 value, null 이라면 default 을 반환 합니다.value ?: default
안전한 호출(?.) 연산자
안전한 호출(safe call) 연산자를 사용하여 널 값 확인과 값 접근/함수 호출을 한번에 할 수 있습니다.
// france가 null 이 아닐 경우에만 해당 값을 대입 가능, 그렇지 않은 경우 null을 source에 대입val source = france?.tomatosource?.france()// 주소가 없거나 line2가 없을 경우 "No address" 반환val line : String = contack.address?.line2 ?: "No address"
안전환 자료형 변환(as?) 연산자
안전한 변환 연산자는 자료형 변환이 실패할 경우 예외를 발생시키는 대신 널 값을 반환합니다. 엘비스 연산자를 함께 사용하면 변환에 실패했을 때 기본 값으로 지정할 수 있습니다.
val foo: String = "foo"// 자료형 변환에 실패 했을 경우 기본값을 0으로 지정하게 됩니다.val bar : Int = foo as? Int ? 0
널 값이 아님을 명시하기: 널 값 아님 보증 (!!)
상황에 따라 널 값을 포함할 수 있는 타입에 널 값이 아닌 값만 포함되는 경우가 생길 수 있습니다. 널 값이 아님을 보증하려는 항목 뒤에 !! 을 붙여 사용합니다. 이 방식은 널 포인터 예외가 발생하므로 유의 해야 합니다.
// user 의 address 가 널이 아님을 보증합니다.val address = user.address!!
나중에 초기화되는 변수를 위한 lateinit 키워드
설계상의 이유로 클래스를 생성한 후 나중에 따로 초기화 하는 경우가 있습니다. lateinit 키워드를 사용하면 초기화 없이 변수만 선언 가능합니다. 초기화 하지 않은 상태로 사용하며 널 포인터 예외가 발생하므로 초기화 작업을 필수로 하셔야합니다.
class MainActivity: Activity(){ // lateinit을 활용하여 나중에 초기화를 수행할 객체를 표시하였습니다. lateinit var user: User}
참고
'프로그래밍 > Kotlin' 카테고리의 다른 글
Inline함수에 대해서 알아보자 (0) | 2023.08.27 |
---|
- Android Studio
- Kotlin
- 임용고시
- MCC
- flutter
- missioon
- 안드로이드
- 패턴
- 고시문
- 알고리즘
- 스코어헬퍼
- 디자인패턴
- IOS
- 미션차이나센터
- DI
- swift
- IT
- RXjava
- 선교
- missionchina
- issue
- 고시문헬퍼
- 점수판
- java
- 코틀린
- 탁구
- view
- push
- Android
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |