ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kotlin] 커니의 코틀린-(8) 코틀린 안드로이드 익스텐션
    Client/Android 2020. 3. 11. 22:04

    차세대 안드로이드 개발자를 위한 커니의 코틀린

    ch8 코틀린 안드로이드 익스텐션

    🍓목차

    1. 코틀린 안드로이드 익스텐션 소개

    2. 컬렉션 생성 함수

    3. 스트림 함수

    4. 범위 지정 함수

    5. 리사이클러뷰에서 사용하기

     

     


    🍓 1. 코틀린 안드로이드 익스텐션 소개

    특정 값의 일치 여부 확인 : check, require 

    [ 사용목적 ]

    findVIewById() 메서드 없이 

     

    findVIewById() 메서드는 액티비티나 프래그먼트 등 레이아웃 파일에 선언된 여러개의 뷰로 구성된 화면에서 특정 뷰의 인스턴스를 얻기 위해 사용한다.

    -> 반환한 뷰 객체를 잘못된 타입의 뷰로 캐스팅하거나 다른 레이아웃에 선언된 ID를 잘못 사용하면 널 값을 반환한다.

    -> 

     

    값 확인 OR 조건 일치하지 않았을 경우 수행할 작업 지정가능.

    • check() - IllegalStateException 발생시킴

    • require() - IllegalArgumentException 발생시킴

    • checkNotNull() 함수와 requireNotNull() 함수로 특정 값의 null 여부를 확인하고 nul이 아닌 값을 반환 받을 수 있다.

     

     

    명시적으로 실행 중단하기 : error, TODO

    [ 사용목적 ] 호출될 가능성이 없는 영역에 진입하게 되는 경우 임의로 예외를 발생시켜 프로그램의 실행을 막기 위해

    정상적으로 프로그램이 실행될 경우 호출될 가능성이 없는 영역 존재. 

    이 경우, 부작용 예측이 어렵다. 

    따라서, 예외를 발생시켜 프로그램의 실행을 막을 수 있다.

     

    • fun error(message: String) : Nothing - 인자로 받은 message와 함께 IllegalStateException을 발생시킴

    • fun TODO(): Nothing - NotImplementedError 예외를 발생시켜 이 부분이 완성되지 않았음을 알려줌

    • fun TODO(reason: String): Nothing - 에러 메시지에 표시될 상세 내용을 reason 매개변수를 통해 전달

     


    🍓 2. 컬렉션 생성 함수

    배열

    • fun <T> arrayOf(vararg elements: T): Array<T> - 함수의 인자로 받은 값으로 구성된 배열 반환

    • fun <T> emptyArray(): Array<T> - 특정 타입을 갖는 빈 배열 반환
    • fun <T> arrayOfNulls(size: Int): Array<T?> - 배열 내 각 값들이 모두 null 값으로 초기화

     

    리스트

    • fun <T> listOf(vararg elements: T): List<T> - 수정할 수 없는 리스트

    • fun <T : Any> listOfNotNull(vararg elements: T?): List<T>

    • fun <T> mutableListOf(vararg elements: T): MutableList<T>

    • fun <T> arrayListOf(vararg elements: T): ArrayList<T>

     

     

     

    포함하는 요소를 읽을 수만 있고 수정할 수 없는 맵은 다음과 같이 생성할 수 있다.

    • fun <K, V> mapOf(vararg pairs: Pair<K, V>): Map<K, V>

    포함하고 있는 요소를 수정할 수 있는 맵은 mutableMapOf() 함수를 사용하여 생성할 수 있다.

    • fun <K, V> mutableMapOf(vararg pairs: Pair<K, V>): MutableMap<K, V>

    보다 명시적인 타입의 맵을 생성해야 하는 경우 hashMapOf(), linkedMapOf(), sortedMapOf() 함수를 사용할 수 있다.

    • fun hashMapOf(vararg pairs: Pair<K, V>) : HashMap<K, V>

    • fun linkeMapOf(vararg pairs : Pair<K, V>) : LinkedHashMap<K, V>

    • fun sortedMapOf(vararg pairs : Pair<K, V>) : SortedMap<K, V>

     

     

    집합

    집합(set)은 중복되지 않는 요소들로 구성된 자료구조

     

    포함하는 요소를 읽을 수만 있고 수정할 수 없는 집합은 다음과 같이 생성한다.

    • fun <T> setOf(vararg elements: T): Set<T>

    집합에 포함된 요소를 수정할 수 있는 집합은 mutableSetOf() 함수를 사용하여 생성한다.

    • fun <T> mutableSetOf(vararg elements: T): MutableSet<T>

    보다 명시적인 타입의 집합을 생성해야 하는 경우 hashSetOf(), linkedSetOf(), sortedSetOf() 함수를 사용할 수 있다.

    • fun <T> hashSetOf(vararg elements: T) : HashSet<T>

    • fun <T> linkedSetOf(vararg elements: T) : LinkedHashSet<T>

    • fun <T> sortedSetOf(vararg elements: T) : TreeSet<T>

     


    🍓 3. 스트림 함수

    변환

    • map(): 컬렉션 내 인자를 다른 값 혹은 타입으로 변환할 때 사용한다.

    • mapIndexed(): 사용하면 컬렉션 내 포함된 인자의 인덱스 값을 변환 함수 내에서 사용할 수 있다.

    • mapNotNull(): 컬렉션 내 각 인자를 변환함과 동시에, 변환한 결과가 null 값인 경우 이를 무시한다.

    • flayMap(): map()과 달리 변환 함수의 반환형이 Interable. 따라서 하나의 인자에서 여러 개의 인자로 매핑이 필요한 경우 사용한다.

    • groupBy(): 컬렉션 내 인자들을 지정한 기준에 따라 분류하며, 각 인자들의 리스트를 포함하는 맵 형태로 결과를 반환한다.

     @Test
        fun MapTest(){
    
            // map ()
            val cities = listOf("Seoul, Tokyo, Moutain View")
            cities.map{
                city -> city.toUpperCase()
            }.forEach{ println(it) }
    
            //mapIndexed()
            val numbers = 0..10
            numbers.mapIndexed{
                idx, number -> idx * number
            }.forEach { print("$it ")}
    
    
            //mapNotNull() : 값이 Null이면 무시
            cities.mapNotNull{
                    city -> if (city.length <= 5) city else null
            }.forEach{ println(it) }
    
    
            //groupBy()
            cities.groupBy { city -> if(city.length <= 5) "A" else "B"}
                .forEach { key, cities -> println("key = $key cities = $cities") }
        }

    필터

    filter() 함수는 컬렉션 내 인자들 중 주어진 조건과 일치하는 인자만 걸러주는 역할을 한다.

    take() 함수는 컬렉션 내 인자들 중 앞에서 take() 함수의 인자로 받은 개수만큼만을 인자로 갖는 리스트를 반환한다.

    drop() 함수는 take()함수의 반대 역할. 조건을 만족하는 항목ㅇ르 컬렉션에서 제외한 결과를 반환한다.

    first() 함수는 컬렉션 내 첫번재 인자를 반환한다. 

    last() 함수는 first() 함수와 반대 역할. 컬렉션 내 마지막 인자를 반환한다.

    distinct() 함수는 컬렉션 내에 포함된 항목 중 중복된 항목을 걸러낸 결과를 반환한다. 

     

     

    조합 및 합계

    zip() 함수는 두 컬렉션 내의 자료들을 조합하여 새로운 자료를 만들 때 사용한다.

    count() 함수는 컬렉션 내 포함된 자료의 개수 반환한다.

    reduce() 함수는 컬렉션 내 자료들을 모두 합쳐 하나의 값으로 만들어주는 역할을 한다.

    fold() 함수는 reduce()와 유사하지만 초깃값 지정 가능하다.

     

    기타

    any() 함수는 컬렉션 내 단 하나의 자료라도 존재하면 true를, 그렇지 않으면 false를 반환한다.

    none() 함수는 any()함수의 반대.

    max() : 최댓값

    min() : 최솟값

    average() : 평균

     

     


    🍓 4. 범위 지정 함수

    특정 객체에 있는 함수를 연속해서 사용 OR 다른 함수의 인자로 전달하기 위해 변수를 선언하고 다른 곳에서 사용하지 않는 등의 경우가 있다.

    이때 유용하게 사용할 수 있는 함수를 표준 라이브러리를 통해 제공한다.

     

     

    let() 함수 

    해당 함수를 호출한 객체를 이어지는 함수 블록의 인자로 전달한다

     

    [ 사용목적 ]

     불필요한 변수 선언을 방지

    ✔  null 값이 아닌 경우를 체크한 후 특정 작업을 수행하는 코드에 사용

     

    • fun <T, R> T.let ( block : (T) -> R ) : R

    fun doSomething(message : String?){
                message?.let{
                    println("message : $message")
                }
            }
            doSomething("let함수 예제입니당")

     

    apply() 함수

    해당 함수를 호출한 객체를, 이어지는 함수 블록의 리시버(receiver)로 전달한다.

     

    [ 사용목적 ]

    ✔ 객체 이름 없이 직접 해당 객체 내부에 속성에 접근 가능

     

    • fun <T> T.apply ( block : T.() -> Unit ) : T

     

     

     

    with() 함수

    인자로 받은 객체를 이어지는 함수 블록의 리시버로 전달한다.

     

    [ 사용목적 ]

    ✔ 함수의 인자로 전달 받은 객체 내부에 속성에 접근 가능

     

    • fun <T, R> with (receiver : T, block : T.() -> R ) : R

    fun doSomething(messageView : TextView){
                with(messageView){
                    text = "Hello, world" 
                    gravity = Gravity.CENTER_HORIZONTAL 
                }
            }

     

    run() 함수

    인자가 없는 익명 함수처럼 사용하는 형태와, 객체에서 호출하는 형태를 제공

     

    [ 사용목적 ]

    ✔ 인자가 없는 익명 함수처럼 사용하는 경우, 복잡한 계산을 위해 여러 임시 변수가 필요할 때 유용하게 사용

    run() 함수 내부에서 선언되는 변수들은 블록 외부에 노출되지 않으므로 변수 선언 영역을 확실히 분리

     객체에서 run() 함수를 호출하는 경우 with() 함수와 유사한 목적으로 사용.

     

      run() 함수는 안전한 호출을 사용할 수 있으므로 null 값일 수 있는 객체의 속성이나 함수에 연속적으로 접근해야 할 때 유용

     

     

    • fun <R> run ( block : () -> R) : R

    • fun <T, R> run ( block : T.() -> R ) : R

     


     

    참고

    반응형
Designed by Tistory.