본문 바로가기
프로그래밍 놀이터/Kotlin

[도서 정리] Android Development with Kotlin - Laying a Foundation

by 돼지왕왕돼지 2018. 12. 11.

Android Development with Kotlin - Laying a Foundation


이 정리글은 Kotlin in Action 책을 보고 실무에 Kotlin 을 사용하던 사람이 몰랐던 내용이나 remind 하고 싶은 내용을 위주로 정리한 글입니다.

제대로 내용을 파악하시려면 책을 구매해서 읽어보세욤~


android with kotlin, array init, const, const limitation, Control statement, custom getter with const, do while, downto, empty type, expression, expression type, for return with label, kotlin boxed primitive, kotlin primitive, kotlin type inference, Label, laying a foundation, nothing type, nothing?, object member, platform type, primitive type const, RANGE, range step, short type inference, smart cast, statement, string iterable, string type const, top level, type inference, withindex, 암시적 cast, 암시적 변환


-

Kotlin type inference 가 생기면서 가끔 무슨 type 으로 inference 가 되었는지 확인하고 싶을 수 있다.

"expression type” 기능을 사용하면 된다.

[View] - [Expression Type] 을 사용하면 된다. ( 혹은 이 녀석을 지정한 단축키 )


이는 generic type 에 대해서도 잘 작동한다.



-

var age: Short = 18 과 같이 적절한 기본 type inference 로 해결하지 못하는 경우도 있다.



-

Nothing type 은 empty type 이라고 불리며 instance 를 가질 수 없다.

Nothing? 은 모든 것의 subtype 이며 Nothing 은 Nothing? 의 subtype 이다.



-

Type! 과 같이 type 뒤에 ! 가 붙은 것은 platform type 이라고 부른다.

이는 Java 와 연동할 때 쓰이는데, Nullable 이 될수도 Nonnull 이 될 수도 있다.



-

nullable type 을 param 으로 받아서, null 인 경우 return 하고 싶다면 다음과 같이 하면 편하다.

fun verifyView(view: View?){ 
    view ?: return // 혹은 view ?: throw RuntimeException(“view is empty”) 
    view.isShown() // view 가 nonnull 로 smart cast 됨
}


-

primitive type 에 대해서 Int 와 같은 nonnull type 은 일반적으로 java 의 실제 primitive 와 매칭되고,

Int? 와 같은 nullable type 은 boxed primitive type 에 매칭된다.


위에서 Int nonnull type 이 “일반적으로” primitive 와 매칭된다고 한 이유는

Generic 에 사용되는 Int 의 경우는 boxed primitive type 으로 사용되기 때문이다.


IntArray 등과 같은 녀석을 사용한다면 primitive type 을 그대로 사용할 수 있다.



-

Kotlin 에서 smaller type 이 bigger type 으로 암시적 변환이 불가능하다.

bigger type 에서 smaller type 으로의 변환은 원래 그릇이 다르니 당연히 불가능하다.


단, 다음과 같은 계산식에서는 type inference 가 작동한다.

val a:Int = 1
val b = a + 1 // b 는 Int 로 type inference
val c = a + 1L // c 는 Long 으로 type inference



-

array 초기화는 다음과 같은 여러 방법이 있다.

val array = arrayOf(1,2,3) // Array<Int>
val array = intArrayOf(1,2,3) // IntArray
val array = arrayOfNulls(3) // [null, null, null]
val array = Array(5) { it * 2 } // [0, 2, 4, 6, 8], it 은 index 가 들어오며 return 값이 해당 index 의 값이 된다.



-

string 은 기본 Java 의 string 보다 많은 것이 향상되었다.

val str = “abcd”
str[1] // b
str.reversed() // dcba
str.takeLast(2) // cd
“hello@test.com”.substringBefore(“@“) // hello



-

Range 는 주로 for 문 등에 쓰인다.

val intRange = 1..4 // IntRange, 1과 4 모두 포함
val charRange = ‘b’..’g’ // CharRange, ‘b’ 와 ‘g’ 포함

for( i in 1..5 ) print(i)


조건 문에서도 쓰인다.

if ( aChar in charRange ) doSomething()


-

Range 는 기본적으로 incremental 이다.

for( i in 5..1 ) print(i) // print nothing


5부터 1로 print 하고 싶다면 다음과 같이 써야 한다.

for( i in 5 downTo 1 ) print(i)



-

Range 는 기본 한 step 씩 increase 되는데 여러 step 을 뛰고 싶다면..

for ( i in 3..6 step 2 ) print(i) // 3, 5
for ( i in 9 downTo 1 step 3 ) print(i) // 9, 6, 3



-

Expression 은 value 를 만들어 내는 구문이다.

Statement 는 class, interface, variable, function 정의, loop login 등과 같이 value 생산하지 않는 구문이다.


Java 에서는 control statement 를 statement 로 보지만, Kotlin 은 expression 으로 본다.



-

when 이 expression 으로 사용될 때는 else 구문은 필수이다.



-

Kotlin 에서는 string 도 extension 으로 iterable 로 만들었다.



-

index 가 필요한 Array iterate 는 다음과 같이 잘 쓰인다.

for ((index, value) in array.withIndex()){
    ...
}


-

Kotlin 의 do while 은 Java 와는 달리 do while 안에 있는 variable 을 사용할 수 있다. ( 이얏호! )



-

다음과 같이 outer loop 를 break 해서 나갈 수 있다.

outer@ for(value in 1..6){
    for(char in ‘A’..’B’){
        if(char == ‘B’) break@outer
        ...
    }
}

outer 는 label 이름으로 바뀔 수 있다.



-

Compile time 에 알아야 하는 constant 들은 const 로 지정해주면 된다.

compile time 에 알아야 하는 케이스의 대표적인 케이스는 annotation 에 사용되는 constant 들.


const 사용 limitation 이 있는데

    1. primitive type 이나 string type 만 정의할 수 있고

    2. top level 이나 object 의 member 로 정의되어야 한다는 것.

    3. custom getter 를 가질 수 없다는 것.




댓글0