/*
1. Lamda
람다식은 value 처럼 다룰 수 있는 익명함수이다.
1) 메소드의 파라미터로 넘겨줄수가 있다. fun maxBy(a :Int)
2) return 값으로 사용할 수 있다.
람다의 기본정의
val lamdaName : Type = {argumentList -> codeBody}
*/
val square : (Int) -> (Int) = {number -> number*number}
// val square = {number : Int -> number*number} 한곳에는 자료형 선언해줘야 타입추론 가능
val nameAge = {name : String , age : Int ->
"my name is ${name} I'm ${age}."
}
fun main() {
println(square(12))
println(nameAge("Yeop",22))
val a = "yeop said "
println(a.pizzaIsGreat()) // 확장함수 사용
// a의 문자열 내용과 확장함수의 내용이 합쳐짐
println(extendString("john",32))
println(calculateGrade(90))
val lamda = {number :Double -> number == 4.3213}
println(invokeLamda(lamda))
println(invokeLamda({it>3.22}))
//println(invokeLamda{it>3.22}) 마지막 파라미터가 람다식이면 ()생략가능
}
// 확장함수
val pizzaIsGreat : String .() -> String = {
this + "Pizza is the best!"
} // String 함수를 확장, this는 String오브젝트를 가르킴
fun extendString(name : String, age : Int) : String{
val introduceMyself : String.(Int) -> String = {"I am ${this} and ${it} years old."}
// this -> 확장함수 부르는 오브젝트, it -> 파라미터 1개 일 때
return name.introduceMyself(age) // 확장함수 사용
}
// 람다의 Return
val calculateGrade : (Int) -> String = {
when(it){
in 0..40 -> "fail"
in 41..70 -> "pass"
in 71..100 -> "perfect"
else -> "Error"
}
}
// 람다를 표현하는 여러가지 방법
fun invokeLamda(lamda : (Double) -> Boolean) : Boolean{
return lamda(5.2343)
}
button.setOnClickListener(object : View.OnClickListener {
override fun onClick(p0: View?) {
TODO("Not yet implemented")
}
})
// 1. Kotlin interface가 아닌 자바 인터페이스여야함
// 2. 그 인터페이스는 딱 하나의 메소드만 가져야함
button.setOnClickListener {
} // 둘은 같은 함수이다.
Data Class
data class Ticket(val companyName : String, val name : String, var date: String, var seatNumber : Int)
// toString(), hashCode(), equals(), copy() 만들어짐
class Ticketnormal(val companyName : String, val name : String, var date: String, var seatNumber : Int)
fun main(){
val ticketA = Ticket("koreanAir","han","2020-01-01",14)
val ticketB = Ticketnormal("koreanAir","han","2020-01-01",14)
println(ticketA)
println(ticketB)
}
data class는 보기쉽게 출력된 것을 확인할 수 있음, 관리 용이
Companion Object ( Java의 Static과 유사 )
class Book private constructor(val id : Int , val name : String){
// 다른 곳에서 사용불가..(private)
companion object BookFactory : IdProvider{
override fun getId(): Int {
return 444
}
val myBook = "new book"
fun create() = Book(getId(), myBook)
}
// private 메소드나 인자 사용가능, 이름 지정안하면 Companion
}
interface IdProvider {
fun getId() : Int
}
fun main(){
val book = Book.BookFactory.create()
// 객체를 생성하지 않아도 사용가능..(스태틱과 유사)
// Companion 생략가능 (이름 미지정)
println("${book.id} ${book.name}")
}
object
object CarFactory{
val cars = mutableListOf<Car>()
fun makeCar(horsePower : Int) : Car{
val car = Car(horsePower)
cars.add(car)
return car
}
} // 싱글톤 패턴 (객체가 한번만 만들어짐)
data class Car(val horsePower : Int)
fun main(){
val car = CarFactory.makeCar(10)
val car2 = CarFactory.makeCar(200)
// 하나의 객체를 이용
println(car)
println(car2)
println(CarFactory.cars.size.toString())
}