[Kotlin] 코틀린 고급 문법 연습

yuuuzzzinzzzang·2021년 6월 29일
1

🔵 Kotlin 🟠

목록 보기
2/3
post-thumbnail

[Code with Joyce] 코틀린 3강으로 끝내기 - 2편 고급 문법

  1. 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})
}
  1. 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를 몇 개고 만들 수 있음.

  1. 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}")
}
  1. 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())
}
profile
yuuuzzzin의 개발 블로그

0개의 댓글