val square : (Int) -> (Int) = {number -> number * number}
//이름과 나이 동시 출력
val nameAge : = { name : String, age : Int -> "my name is ${name} I'm ${age}" }
fun main(){
println(square(12))
println(nameAge("joyce",99))
}
Output
144
my name is joyce I'm 99
val pizzaIsGreat : String.() -> String = {
this + "Pizza is the best!"
}
fun extendString(name : String, age : Int) : String {
//파라미터를 it이라는 예약어를 통해 사용
//${this}가 가리키는것은 확장함수를 불러줄 오브젝트.
val introduceMyself : String.(Int) -> String = { "I am ${this} and ${it} years old"}
return name.introduceMyself(age)
}
fun main(){
val a = "ky said"
val b = "mac said"
println(a.pizzaIsGreat())
println(a.pizzaIsGreat())
println(extendString("ariana", 27))
}
Output
ky saidPizza is the best!
mac saidPizza is the best!
val calculateGrade : (Int) -> String = {
when(it) {
in 0..40 -> "fail"
in 41..70 -> "pass"
in 71..100 -> "perfect"
else -> "Error"
}
}
fun main(){
println(calcaulateGrade(97))
println(calcaulateGrade(971))
}
perfect
Error
람다식을 활용하는 2가지 조건
fun invokeLambda(lambda : (Double) -> Boolean) : Boolean {
return lambda(5.2343)
}
fun main(){
//number가 4.3213과 같으면 true 반환.
val lambda : (Double) -> Boolean = { number : Double ->
number == 4.3212
}
//Output false가 나올것. 같지않으니까.
println(invokeLambda(lambda))
//it은 넣는 파라미터가 하나일때 가르키는것.
println(invokeLambda({ it > 3.22}))
//위와 같음.
println(invokeLambda { it > 3.22 })
}
//각각은 class의 프로퍼티처럼 사용가능
data class Ticket(val companyName : String, val name : String, var date : String, val seatNumber : Int)
//toString(), hashCode(), equals(), copy() 자동으로 컴파일러가 만들어줌
class TicketNormal(val companyName : String, val name : String, var date : String, val seatNumber : Int)
fun main(){
val ticketA = Ticket("koreanAir","kyLee","2022-02-15",14)
val ticketB = TicketNormal("koreanAir","kyLee","2022-02-15",14)
println(ticketA) //바로 print를 해줌 //Ticket(companyName=koreanAir, name=kyLee, date=2022-02-15, seatNumber=14)
println(ticketB) //com.ky.kotlinpractice.TicketNormal@2d6e8792
}
package com.ky.kotlinpractice
//static 대신에 사용되는 것 : Compaion Object
//다른곳에서는 객체생성하지 못하게 : private constructor
class Book private constructor(val id : Int, val name : String){
// companion object{
// fun create() = Book(0,"animal farm")
// }
}
fun main(){
val book = Book() //companion object가 주석인경우 사용할 수 없음.
}
package com.ky.kotlinpractice
//static 대신에 사용되는 것 : Compaion Object
//다른곳에서는 객체생성하지 못하게 : private constructor
class Book private constructor(val id : Int, val name : String){
// companion object{
// fun create() = Book(0,"animal farm")
// }
//private property나 메소드를 읽어올 수 있게 함
companion object BookFactory : IdProvider { //BookFactory에서 IdProvider를 상속함.
//인터페이스를 오버라이드 한뒤에
override fun getId(): Int {
return 444
}
val myBook = "new book"
fun create() = Book(getId(),myBook)
}
}
interface IdProvider{
fun getId() : Int
}
fun main(){
// val book = Book() //companion object가 주석인경우 사용할 수 없음.
val book = Book.create() //Companion 생략가능.
val bookId=Book.BookFactory.getId();
println("${bookId} ${book.name}") //444 new book
}
package com.ky.kotlinpractice
//Singleton Pattern : 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())
}
Output
Car(horsePower=10)
Car(horsePower=200)
2