프로그램

[코틀린] Kotlin : Null / 세이프콜연산자 / 엘비스연산자 / 확정연산자 / 늦은초기화(lateinit, lazy)

오디세이99 2022. 12. 30. 14:25
728x90
반응형
/**
Null
- 함수등에서 null 리턴시 null 체크 필요한데, NPE(NullPointerException)가 발생.
- 코틀린은 기본적으로 객체는 null 이 될 수 없다. 모든 객체는 생성과 동시에 초기화해야 함
- 코틀린은 컴파일시 null 가능성을 체크해 줌
 */
fun main() {
    println("*** Null ***")
	println("*** Nullable / Non-Nullable ***")
    //var sData : String			// 초기화 하지 않아서 에러
    //var sData : String = null		// non-nullable 자료형에 null을 넣어서 에러
    var sData : String? = null		// ? 를 붙여서 null 가능
    
    
    println("*** Null return ***")
    var vData : String? = null
    //vData = "abcdefg"
    //println(vData.reversed())		//Error
    println(vData?.reversed())
    
    println("*** 세이프콜(안전 호출) 연산자(?) ***")
    fun func(arg : String?) : String? {		// 인수, 반환값 모두 null 가능
        return arg?.reversed()				// arg가 null이라면 null을 반환
    }
    println(func("abcde"))					// 출력 : edcba
    println(func(null))						// 출력 : null
    
    
    println("*** 앨비스 연산자(?) ***")		   // null일때 기본값 지정
    fun func2(arg : String?) : String {			// 인수 null 가능, 반환값 null 불가
        return arg?.reversed()?:"데이터 확인"	// null일때 기본값 리턴 (엘비스 연산자)
    }
    println(func2("abcde"))						// 출력 : edcba
    println(func2(null))						// 출력 : 데이터 확인
    
    println("*** 확정 연산자(!!) ***")
    fun func3(arg : String?) : String {			// 인수 null 가능, 반환값 null 불가
        return arg!!.reversed()					// 절대 null이 아님을 보증
    }
    println(func3("abcde"))						// edcba
    //println(func3(null))						// 실행시 에러 발생
    
    println("*** lateinit / lazy ***")			// lateinit : var 변수 늦은 초기화, lazy : val 변수 늦은 초기화
    lateinit var vData1 : String
    vData1 = "lateinit"
    println(vData1)

    val vData2 : String by lazy{"lazy"}			// 생성될때 초기화되지 않고 처음 호출시 초기화됨. 선언시에는 메모리에 로드되지 않음
    println(vData2)
}

728x90
반응형