[Code with Joyce] 코틀린 3강으로 끝내기 - 2편 고급 문법
- Lamda식
/* 1. Lamda
* 람다식은 우리가 마치 value처럼 다룰 수 있는 익명함수이다.
* 1) 메소드의 파라미터로 넘겨줄 수 있다.
* 2) return 값으로 사용할 수가 있다.
*
* 람다의 기본 정의?
* val lamdaName : Type = {argumentList -> codeBody}
* */
val square1 : (Int) -> (Int) = {number -> number * number}
val square2 = {number : Int -> number * number}
val nameAge = {name : String, age : Int ->
"My name is ${name} I'm ${age}"
}
// 확장함수
val pizzaIsGreat : String.() -> String = {
this + "Pizza is the best!"
}
fun extendString(name : String, age : Int) : String {
val introduceMyself : String.(Int) -> String = {"I am ${this} and ${it} years old"}
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)
}
fun main() {
val lamda = {number : Double ->
number == 4.3213
}
println(invokeLamda(lamda))
println(invokeLamda{it > 3.22})
}
- data class
data class Ticket(val companyName : String, val name : String, var date : String, var seatNjmber : Int)
// toString(), hashCode(), equals(), copy()가 자동으로 만들어짐
class TicketNormal(val companyName : String, val name : String, var date : String, var seatNjmber : Int)
fun main() {
val ticketA = Ticket("koreanAir", "yuuuzzzin", "2020-02-15", 13)
val ticketB = TicketNormal("koreanAir", "yuuuzzzin", "2020-02-15", 12)
println(ticketA)
println(ticketB)
}
각각 출력되는 값이 다름.
dataclass를 이용해 객체를 print하면 객체의 내용이 출력.
그냥 class를 이용해 객체를 print하면 주소를 출력.
한 파일 안에 연관된 data class를 몇 개고 만들 수 있음.
- Companion Object
// 다른 곳에서는 생성 불가
class Book private constructor(val id : Int, val name : String) {
// 자바의 static과 비슷
// 정적인 메소드. 정적인 변수 선언할 때 사용
companion object BookFactory : IdProvider {
override fun getId() : Int {
return 333
}
val myBook = "new book"
fun create() = Book(0, myBook)
}
}
interface IdProvider {
fun getId() : Int
}
fun main() {
val book = Book.create()
val bookId = Book.getId()
println("${book.id} ${book.name}")
}
- Object
// Singleton Pattern
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())
}