기타기능
확장 함수 - 원래 있던 클래스에 기능을 추가하는 함수
형변환 - 숫자형 자료형끼리 쉽게 형변환 가능
형 체크 - 변수의 형이 무엇인지 검사하는 기능
고차 함수 - 인자로 함수를 전달하는 기능
동반 객체 - 클래스의 인스턴스 생성 없이 사용할 수 있는 객체
let() 함수 - 블록에 자기 자신을 전달하고 수행된 결과를 반환하는 함수
with() 함수 - 인자로 객체를 받고 블록에서 수행된 결과를 반환하는 함수
apply() 함수 - 블록에 자기 자신을 전달하고 이 객체를 반환하는 함수
run() 함수 - 익명함수처럼 사용하거나, 블록에 자기 자신을 전달하고 수행된 결과를 반환하는 함수
확장 함수
- 기존 클래스에 함수를 추가할 수 있다. 확장 함수를 추가할 클래스에 점을 찍고 함수 이름을 작성한다. 확장 함수 내부에서는 이 객체를 this로 접근할 수 있고 이러한 객체를 리시버 객체라고 한다.
// Int 자료형에 짝수인지 아닌지를 알 수 있도록 isEver() 확장 함수를 추가한 예
fun Int.isEver() = this % 2 == 0
val a = 5
val b = 6
println( a.isEven() ) // false
println( b.isEver() ) // true
형변환
- 숫자형 자료형끼리는 to자료형() 메서드를 사용하여 형변환이 가능하다.
val a = 10L
val b = 20
val c = a.toInt() // Long을 Int로
val d = b.toDouble() // Int를 Double로
val e = a.toString() // Long을 String으로
// 숫자 형태의 문자열을 숫자로 바꿀 때는 자바와 마찬가지로 Integer.parseInt() 메서드를 사용한다.
val intStr = "10"
val str = Integer.parseInt( intStr )
// 일반 클래스 간에 형변환을 하려면 as 키워드를 사용한다.
open class Animal
class Dog : Animal()
val doa = Dog()
val animal = dog as Animal // dog를 Animal 형으로 변환
형체크
- is 키워드를 사용하여 형을 체크할 수 있다. 자바의 instanceOf에 대응된다.
val str = "hello"
if (str is String) { // str이 String형 이라면
println( str.toUpperCase() )
}
고차 함수
- 코틀린에서는 함수의 인수로 함수를 전달하거나 함수를 반환할 수 있다.
// 인수 : 숫자, 숫자, 하나의 숫자를 인수로 하는 반환값이 없는 함수
fun add ( x : Int, y : Int, callback : (sum : Int) -> Unit ) {
callback( x + y )
}
// 함수는 { } 로 감싸고 내부에서는 반환값을 it로 접근할 수 있음
add ( 5, 3, { println(it) } ) // 8
동반 객체
- 프래그먼트는 특수한 제약 때문에 팩토리 메서드를 정의하여 인스턴스를 생성해야 한다. 팩토리 메서드는 생성자가 아닌 메서드를 사용해 객체를 생성하는 코딩 패턴을 말하는데 클래스와 별개로 보면 포함 관계도 아니다. 코틀린에서는 자바의 static과 같은 정적인 메서드를 만들 수 있는 키워드를 제공하지 않는다. 대신 동반 객체로 이를 구현한다.
// newInstance() 정적 메서드를 사용해서 Fragment 객체를 생성하는 팩토리 패턴을 구현 및 사용한 예
class Fragment {
companion object {
fun newInstance() : Fragment {
println ("생성됨")
}
}
}
val fragment = Fragment.newInstance()
let() 함수
- 코틀린 기본 라이브러리는 몇 가지 유용한 함수를 제공한다. let() 함수는 블록에 자기 자신을 인수로 전달하고 수행된 결과를 반환한다. 인수로 전달한 객체는 it으로 참조한다. let()함수는 안전한 호출 연산자 ?. 와 함께 사용하면 null 값이 아닐 때만 실행하는 코드를 나타낼 수 있다.
// fun <T, R> T.let(block : (T) -> R) : R
val result = str?.let { // Int
Integer.parseInt ( it )
}
// str 이 null 이 아닐 때만 정수로 변경하여 출력하는 코드
with() 함수
- with() 함수는 인수로 객체를 받고 블록에 리시버 객체로 전달한다. 그리고 수행된 결과를 반환한다. 리시버 객체로 전달된 객체는 this로 접근할 수 있다. this는 생략이 가능하므로 다음과 같이 작성할 수 있다. 안전한 호출이 불가능하여 str이 null값이 아닌 경우에만 사용해야 한다.
// fun <T, R> with (receiver : T, block T.() -> R) : R
with (str) {
println( toUpperCase() )
}
apply() 함수
- 블록에 객체 자신이 리시버 객체로 전달되고 이 객체가 반환된다. 객체 상태를 변화시키고 그 객체를 다시 반환할 때 주로 사용한다.
// fun <T> T.apply(block : T.() -> Unit) : T
var result = car?.apply {
car.setColor( Color.RED )
car.setPrice ( 1000 )
}
run() 함수
- 익명 함수 처럼 사용하는 방법과, 객체에서 호출하는 방법을 모두 제공. 익명 함수처럼 사용할 때는 블록의 결과를 반환한다. 블록안에 선언된 변수는 모두 임시로 사용되는 변수이다. 이렇게 복잡한 계산에 임시변수가 많이 필요할 때 유용하다.
// fun <R> run (block : () -> R) : R
val avg = run {
val korean = 100
val english = 80
val math = 50
(korean + english + math) / 3.0
}
객체에서 호출하는 방법은 객체를 블록의 리시버 객체로 전달하고 블록의 결과를 반환한다. 안전한 호출을 사용할 수 있어서 with() 함수보다는 더 유용하다.
// fun <T, R> T.run(block : T.() -> R) : R
str?.run {
println( toUpperCase() )
}
'# 02 > 코틀린' 카테고리의 다른 글
[Kotlin] android extentions (0) | 2019.07.09 |
---|---|
[Kotlin] 코드 예제 MainActivity.kt (0) | 2019.07.08 |
[Kotlin] 안드로이드 코딩 2 (0) | 2019.07.07 |
[Kotlin] 안드로이드 코딩 1 (0) | 2019.07.07 |
[Kotlin] 코틀린의 다양한 함수들 2 (0) | 2019.07.07 |