Kotlin 관련 조금더 심화된 사용법 정리
Lamda
람다식 -> Value 처럼 다룰 수 있는 익명 함수
- 형식 : val lamdaName: Type = {argumentList -> codebody} 사용 예
val square: (Int) -> (Int) = {number -> number * number} //Int 받아서 제곱
val nameAge = {name: String, age:Int ->
"my name is ${name}, I'm ${age}"
}
람다의 리턴
val calculateGrade : (Int) -> (String) = {
when (it) {
in 0..40 -> "fail"
}
}
람다를 표현하는 방법
fun invokeLamda(lamda : (double) -> Boolean) : Boolean {
return lamda(5.2343)
}
val lamda = {number: Double ->
number == 4.3213
}
println(invokeLamda(lamda)) // 결과는 false, lamda 를 인자로 받고 lamda 에 5.2343을 인자로 넘긴다
println(invokeLamda({})) // invokeLamda 에서 lamda 호출되고 it 에 값이 5.2343으로 넘어온다, 값은 true
invokeLamda() {it > 3.22} // 이 두개가 똑같다
invokeLamda {it > 3.22} // function 의 마지막 파라미터가 람다인경우, 생략 가능
익명 내부 함수
button.setOnClickListener(object : View.OnClickListener {
override fun onClick(p0: View?) {
}
})
//kotlin interace 가 아닌 자바 인터페이스여야 한다
// 그 인터페이스는 딱 하나의 메소드만 가져야 한다
// 예를 들면 아래처럼 setOnClickListener 를 사용 가능
button.setOnClickListener{ //it: View
// to do..
}
확장함수
val addEndString : String.() -> String = {
this + "END"
}
val a = "Start "
println(a.addEndString()) // 결과는 "START END"
------------------------------------------------------
fun extendString(name: String, age: Int) : String {
val introduceMyself : String.(Int) -> String = {
"I'm ${this} and ${it} years old"
}
return name.introduceMyself(age)
}
println(extendString("Kim", 20)) // I'm Kim and 20 years old
Data Class
data class Ticket(val company: String, val name: String, var date: String, var seat : Int)
val ticketA = Ticket("CompanyA", "Kim", "2020-12-12", 12)
Data class 의 선언 및 사용은 위와 같으며, toString(), hashCode(), equals(), copy() 메소드를 만들어줘 보일러플레이트 줄이는 데 유용하다.
Companion object
class Book private constructor(val id:Int, val name:String) { //다른곳에서는 객체를 생성하지 못함
companion object BookFactory { // private property, object 를 읽어올 수 있게 해준다
override fun getId(): Int {
return 444
}
val myBook = "name"
fun create() = Book(0, myBook)
}
}
fun main(){
val book = Book.Companion.create() //객체 생성 된다 (Companion 생략 가능)
val bookId = Book.BookFactory.getId() // BookFactory 생략 가능
}
Object class
Object class 의 객체는 한번만 만들어진다(Singleton Pattern)
아래처럼 사용 가능
object CarFactory{
val cars = mutableListOf<Car>()
fun makeCar(hp: Int): Car {
val car = Car(hp)
cars.add(car)
return car
}
}
data class Car(val hp: Int)
fun main() {
val car = CarFactor.makeCar(10)
val car2 = CarFactor.makeCar(100)
println(car)
println(car2) //dataclass 이기 때문에 toString() 값이 출력
println(CarFactory.cars.size.toString()) // 2 출력
}