-
[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
참고
반응형'Client > Android' 카테고리의 다른 글
코틀린 퀴즈 -3 확장함수,제네릭, 고차함수, 람다 (0) 2020.03.12 코틀린 퀴즈 -2 제네릭, 주생성자, 확장함수, 익명함수, 엘비스 연산자 (0) 2020.03.12 코틀린 퀴즈 -1 컬렉션, 생성자, 추상클래스, 인터페이스 (0) 2020.03.12 [Kotlin] 커니의 코틀린-(4) 코틀린 표준 라이브러리 (0) 2020.03.11 커니의 코틀린-(2) 자바와 비교해보는 코틀린 컬렉션, 클래스, 인터페이스, 싱글톤, 제네릭, 널 안전성 (0) 2020.02.28 -