[Kotlin] Tip2 + 문자열 템플릿
가변 인수
자바 코드로 변환해보면 호출하는 측에서 `` SpreadBuilder``라는 객체에 ``kt *``로 지정된 인자를 모두 풀어서 추가하고, 이를 배열로 만들어 넘기게 된다.
infix(중위) 함수 호출 구문과 딕셔너리( 맵 )
맵 만들 때 쓰면 편하다. * 파이썬의 딕셔너리가 자바에서는 맵이다.
```kt
>>> val numbers = mapOf("zero" to 0, "one" to 1)
>>> println(numbers)
```
삼항 연산자가 없는 대신 if로 처리할 수 있다.
스마트 캐스트 : 코틀린에서는 타입 검사와 캐스트가 한 연산자에 의해 이루어진다.
단, 스마트 캐스트는 변수의 타입을 검사한 다음 변경되지 않음을 보장할 수 있는 경우에만 동작한다.
원래 널이 될 수 있는 타입(``kt bar?``)은 ``kt .``으로 메소드를 호출할 수 없고(널 체크 포함으로 정의된 확장 함수 제외), 널이 될 수 없는 타입의 변수에 대입할 수 없는 등 제약 조건을 가지고 있다.
그러나 스마트 캐스트가 작동할 수 있는 조건을 만족하는 변수에 대해서 널 체크를 수행하고 나면 컴파일러가 그 사실을 기억해두고 ``kt null``이 아님이 확실한 영역에서는 해당 값을 널이 될 수 없는 타입의 값처럼 사용할 수 있다.
한 예로 ``kt if`` 또는 ``kt ?:``에 ``kt return``이 포함되어 있으면 이후의 코드는 실행되지 않는 것이 확실하기 때문에 스마트 캐스트가 동작한다. 그러나 ``kt return``이 포함되어 있지 않으면 프로그래머의 처리에 따라 ``kt null``인 상태로 이후 코드가 실행될 수도 있기 때문에 스마트 캐스트가 동작하지 않는다.
명시적 형변환
try-catch-finally
``kt try``도 식이기 때문에 ``kt try`` 실행 결과를 변수에 대입할 수 있다.
```kt
fun readNumber(reader: BufferedReader) {
val number = try {
Integer.parseInt(reader.readLine())
} catch (e: NumberFormatException) {
// return 여기서 return해버리면 val number 이후 문장이 실행이 안된다.
null
}
println(number)
}
```
문자열 템플릿 ( string template )
expression body : 한 줄 함수
- expression body는 알아서 타입 추론이 들어가기 때문에 리턴 타입을 지정하지 않아도 된다.
- expression body로 작성하는 경우 ``kt return``을 적어서는 안된다.
- expression body 내부에서 다시 `` {}``를 사용하는 경우, 블록의 맨 마지막 식이 반환값이 된다.
Note ) 블록의 마지막 식이 블록의 결과라는 규칙은 블록이 값을 만들어내야 하는 경우 항상 성립한다. - block body로 작성하는 경우 반드시 ``kt return`` 문이 필요하다.
- block body로 작성했는데 ``kt return``을 빼먹는 경우 ``kt kotlin.Unit``을 리턴하게 된다.
비트 연산자
``kt Int, Long`` 타입에만 사용할 수 있다.
```kt
x.shl(y) : <<
x.shr(y) : >>
x.ushr(y) : >>>
x.and(y) : &
x.or(y) : |
x.xor(y) : ~
x.inv() : !
```
'Java Stack > Kotlin' 카테고리의 다른 글
[Kotlin] enum / when / sealed (0) | 2017.12.01 |
---|---|
[Kotlin/Java] Inner Class / Nested Class (0) | 2017.12.01 |
[Regex] Kotlin (0) | 2017.12.01 |
[Kotlin] 확장 함수 / 확장 프로퍼티, 최상위 함수 / 최상위 프로퍼티 (0) | 2017.12.01 |
[Kotlin] Tip (0) | 2017.11.28 |