본문 바로가기

개발 코딩 정보 공유/안드로이드 자바 코틀린

코틀린 기초 공부해보기 2

 1. 조건문의 사용

 

1
2
3
4
5
6
7
8
fun maxOf(a: Int, b: Int): Int {
    if (a > b) {
        return a
    } else {
        return b
    }
 
}
cs

 

 

if문은 뭐. 그냥 보셔도 아시겠죠? 

: Int 이건 리턴형이 int라는 말입니다.

 

 다음은 when 입니다. 자바에서 switch case 라고 생각하시면 좋을것같네요.

 

 

1
2
3
4
5
6
7
8
9
10
fun describe(obj: Any): String =
    when (obj) {
    
    1          -> "One"
    "Hello"    -> "Greeting"
    is Long    -> "Long"
    !is String -> "Not a string"
    else       -> "Unknown"
 
}
cs

 

 

 어때요? 좀더 명확하고 간결한 느낌이네요.

 코틀린에서 하나 특이한게 있는데요. 바로 nullable에 대한 표현식입니다.

 

1
2
3
4
fun parseInt(str: String): Int? {
    // ...
 
}
cs

 

Int 옆에 ? 는 리턴값이 null 일수도 있다는 표현식이 되겠습니다.

이걸 null-safety 라고 부릅니다... 아래와 같은 문법들은 NPE 를 예방하기 위한 코드라고 코틀린에서 설명하고 있습니다. (https://kotlinlang.org/docs/reference/null-safety.html)

 

  

1
2
3
4
fun main(args: Array<String>) {
    var a: String = "abc"
    a = null // compilation error
}
cs

 

 오... 변수 a는 null로 초기화 할수 없습니다.

 

  

1
2
3
4
5
6
fun main(args: Array<String>) {
 
    var b: String= "abc"
    b = null // ok
    print(b)
}
cs

 

 이렇게 해줘야 null 대입이 가능하죠.

그렇다면 과연 어떤식으로 null 체크를 해야할까요?

 

1. 명시적으로 null을 체크한다.

1
val l = if (b != null) b.length else -1
cs

 

2. call할때 안전하게 해라.

1
2
3
4
5
6
7
val a = "Kotlin"
 
val b: String= null
 
println(b?.length)
 
println(a?.length)
cs

 

 

이렇게 하면 콜 시점에서 safe 하게 처리가 가능합니다.

이런 문법은 체인식의 문장에서 유용하게 쓰입니다.

 

1
bob?.department?.head?.name
cs

 

null이 아닌경우의 name 을 불러오게 되겠죠.

 

 

2. 타입체크와 자동 캐스팅

 

1
2
3
4
5
6
7
8
9
fun getStringLength(obj: Any): Int? {
        if (obj is String) {
        // `obj` is automatically cast to `String` in this branch
        return obj.length
    }
 
// `obj` is still of type `Any` outside of the type-checked branch
return null
}
cs

 

  obj: Any 보이시죠? Any 는 자바에서 Object 같은 느낌으로 쓴다고 보면 될것 같습니다.

  그리하여 if (obj is String) { 이렇게 타입을 골라내고 return obj.length 를 하게됩니다.

  이때 obj는 자동으로 string 으로 캐스팅 되게 됩니다.(형검사후)

 

 

헷갈리는 부분이 많네요^^; 기초 이니 몇번이고 다시 보면서 공부 해야겠습니다.

 

https://kotlinlang.org/docs/reference/