[Kotlin]값을 리턴하는 if문(변수에 직접 if문 사용) / ?, ?., ?:, as?, delegates, !!, let

dada·2021년 8월 23일
1

Kotlin

목록 보기
2/14
post-thumbnail

✅결과를 변수에 저장

  • if문 같은 경우 Java와 동일
  • [~ else if ~ else] 의 구조
  • 단, 기존의 if문과 다르게 조건에 따른 결과를 변수에 저장가능
  • 삼항연산자X

[기본]

val max2 = if (a > b) {
        val c = 4
        a
    } else {
        b
    }

[간단히]

 val max2=if(a>b) a else b
 //val max2=if(a>b) val c=4,a else b  =>불가능!

[if문 쓸 때 return 주의]

 val max2 = if (a > b) {
        val c = 4
        a
    } else if(a==b){
        println("같음")
    } else{...} // =>return 경우의 수 코드 모두 작성 필수! else없으면 에러

[null타입 프로퍼티]

 val max2:Int? = if (a > b) {
        val c = 4
        a
    } else if(a==b){
        println("같음")
    } else null 

❌코틀린과 Null Safety

  • null 가능성: 코틀린은 자바에서 흔히 볼 수 있는 NullPointerException 오류를 피할 수있게 돕는 널 가능성이라는 코틀린 타입 시스템 특성존재
    • 타입 시스템?
      타입 시스템에 널이 될 수 있는지 여부를 추가함으로써 컴파일러가 여러가지 오류를 컴파일 시 미리 감지해서 실행 시점에 발생 할 수 있는 예외의 가능성을 줄임
    • 어떤 변수가 null을 허용한다는 건?
      이 변수는 NullPointerException이 발생할 수 있다는 의미. 코틀린은 이런 null이 될 수있는 호출을 금지함으로서 NullPointerExeption에 대한 오류를 많이 방지함
      *그럼 코틀린에선 null을 못쓰나? no

❓null값 허용하기: ?

✔1.변수에 null 허용 설정

  • 코틀린에서 지정하는 기본 변수는 모두 null이 입력되지 않음
  • null을 입력하기 위해서는 변수를 선언할 때 타입 뒤에 ?(Nullable,물음표)를 붙여야함
class Nullable {
    var nullable: String? =null
   // var notNullable:String=null
}

✔2.함수 파라미터에에 null 허용 설정

  • 함수 파라미터가 null을 허용하려면 해당 파라미터에 대해서 null체크를 먼저 해야 사용 가능 즉, if문으로 null인지 체크

int strLen(String s){ return s.length(); }

위의 자바코드는 s에 null 값이 들어오면 NullPointerException이 발생하지만 컴파일 오류 발생 X


fun strLen(s:String) : Int = s.length

위의 코틀린 코드는 s에는 null이 될 수 없는 변수인데 s.length는 null가능성 있는 메서드라 컴파일시 오류 발생 O


fun strLen(s:String?) : Int = s.length

함수 파라미터를 null타입으로 바꿔줘도, 위 코드는 오류 발생함 s가 null을 인자로 받을 수 있는 상태에서 변수 s에 대한 메서드 length를 직접 호출 X


fun strLen(s:String?) : Int = if(s !== null) s.length else 0

결과적으로 위처럼 null일때를 구분해서 코드 작성 필요!

✔3.함수 리턴타입에 null허용 설정

  • 함수 리턴 타입에 Nullable이 지정되어 있지 않으면 null리턴 불가
fun nullReturn():String?{
    return null
}

❓안전한 호출연산자 ?.

  • 변수를 Nullable로 만들기 위해 물음표를 사용했다면 ?.는 null체크를 간결하게 하기 위해 사용
  • 변수 다음에 ?.을 사용하면 해당 변수가 null일 경우?.다음의 메서드나 프로퍼티 호출 안하고 null을 반환(프로그램이 다운되지 않고 아무것도 출력안됨)
  • 안전한 호출 연산자를 사용하지 않으면 str이 null일때 프로그램 다운
fun test(str:String?):Int?{  //리턴값이 null일수도 있어서 Int?
   var resultNull:Int?=str?.length
    return resultNull
} //str변수가 null일경우 
  //length를 호출하지 않고 null을 리턴함

❓엘비스 연산자 ?:

  • 안전한 호출을 위해 ?. 을 사용했다면 원본 변수가 null일때 넘겨줄 기본값 설정하는 것
  • 안전한 호출 연산자 다음에 호출되는 프로퍼티 뒤에 다시 ?: 를 붙이면, str이 null일 경우 ?:뒤에 표시한 값이 반환됨
fun test(str:String?):Int?{
   var resultNull:Int?=str?.length ?:0
    return resultNull
} 

    val number1:Int?=null
    val number2:Int=5
    val sum=number1?.plus(number2) ?:10  
   // val sum=number1+number2 ?:10 
   //null이 될 수 있는 타입은 일반 연산식으로 하면 안되지 
   //?.로null 아닌지 체크 후 연산해야지!! 
null값 허용하기안전한 호출 연산자엘비스 연산자
표기선언하는 변수 타입 뒤에 ?선언된 변수 이름 뒤에 ?.선언된 변수 이름 뒤에 ?:
목적null입력 받기 위해null일때 ?.다음에 나오는 명령어 처리 Xnull일때 ?: 뒤에 오는 값을 기본값으로 사용
var nullable:String?var result:Int?=str?.lengthvar result:Int?=str?.length ?:0

✅안전한 캐스트 연산자 is

  • 자료형을 검사하기 위함
  • 자바의 instanceof()와 동일한 기능
val num=14
if(num is Int){
println(num)
}else if(num !is Int){
println("안돼")}

✅형변환 연산자 as

  • 대상 값을 as로 지정한 타입으로 캐스트 하며, 해당 타입으로 바꿀 수 없으면 ClassCastException이 발생
  • 이럴 경우 is 연산자를 통해 대상 값이 해당 타입으로 변환 가능한 타입인지 체크해야 하지만 코틀린에서는 훨씬 더 간결한 기능으로 as? 연산자를 제공합니다.
  • as? 연산자는 어떤 값을 지정한 타입으로 캐스트를 하고, 만약 대상 타입으로 캐스트 할 수 없으면 null을 반환
val x="kotlin"
val y:Int?=x as? Int 
//Int형으로 캐스팅 실해시 null로 초기화 하므로 exception발생 안함

참고: https://jeongupark-study-house.tistory.com/156#recentEntries

profile
'왜?'라는 물음을 해결하며 마지막 개념까지 공부합니다✍

0개의 댓글