코틀린 3강으로 끝내기 - 2편 고급문법

이경영·2023년 2월 15일
0

코틀린

목록 보기
2/2
  1. lambda
    람다식은 우리가 마치 value처럼 다룰 수 있는 익명함수이다.
    1) 메소드의 파라미터로 넘겨줄 수가 있다. fun maxBy(a :Int)
    2) return 값으로 사용할 수가 있다.
  • 람다의 기본 정의
  • val lambdaName : Type = {argumentList -> codeBody}
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
  1. 확장함수
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!
  1. 람다의 Return
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
  1. 람다를 표현하는 2가지 방법
    -invokeLamdba는 Boolean을 리턴.

람다식을 활용하는 2가지 조건

  • Kotlin 인터페이스가 아닌 자바인터페이스여야 합니다.
  • 그 인터페이스는 딱 하나의 메소드만 가져야 합니다.


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 })
}
  1. Data class
  • 데이터를 담는 그릇


//각각은 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
}
  1. 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")
//    }
}

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
}
  1. object를 이용한 싱글톤 패턴
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
profile
꾸준히

0개의 댓글