2강. [코틀린 고급 문법]

728x90

[2강. 코틀린 고급 문법]

1. 람다함수 

[람다함수]

val a : (Int, Int) -> Int = {x:Int, y:Int -> x + y}
    함수 타입 변수    = 타입에 일치하는 람다식 저장


<타입별칭 : typealias 선언 키워드>
 
typealias MyType = (Int, Int) -> Boolean

val a : MyType = {no1: Int, no2: Int -> no1 > no2 } 
//1. Lamda 람다 함수 : 익명 함수
//람다식 그 자체를 값(value) 처럼 다룰 수 있는 함수
//코틀린에서는 고차함수 개념 존재
//고차함수 : 람다식(함수) 형태를 값 처럼 매개변수, 반환 타입에 적용해놓은 함수

//람다의 기본 정의
//val lamdaName : Type = {argumentList -> codeBody}
val square : (Int) -> (Int) = {number : Int -> number + number}
            //이 타입에 맞춰서 람다함수 대입 가능
val nameAge : (String, Int) -> String = {name :String, age : Int ->
                "My name is ${name} I'm ${age}"
            }
fun main(){
    println(square(12))
    println(nameAge("joyce", 99))

    val lamda:(Double) -> Boolean = {number : Double ->
        number == 4.3213
    }
}
//확장 함수(= 고차함수 ) 함수타입으로 변수 선언하면 해당 변수 타입에 맞는 람다식을 대입함
val pizzaIsGreat : String.() -> String = {
this + "Pizza is the best "}

//매개변수가 1개인 람다함수의 경우 'it 키워드'가 알아서 매개변수 이용함
fun extendString(name:String, age:Int) :String {
    val introduceMyself : String.(Int) -> String = {"I am ${it} years old"}
}
//람다의 리턴 - 람다는 {} 마지막 실행문을 자동 리턴값으로 반환
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)

2. 데이터 클래스 

//2. 데이터 클래스 Data Class : 자주 사용하는 데이터를 객체로 묶음
data class Ticket(val companyName:String, val name :String, var date : String, var seatNumber : Int)
//data클래스로 만든 데이터들에 대해서 toString(), hashConde(), equals(), copy() 를 자동 갖고 있음
fun main() {
    val ticketA = Ticket("KoreanAir", "joyceHong", "2020-02-05", 14)

3. 컴패니언 클래스

( = static 정적 멤버 사용을 위함). 클래스를 객체 생성 없이 이름으로 바로 접근하고자 함.

//3. 컴패니언 클래스 : 정적 변수, 객체 사용하기 위함
class Book private constructor(val id :Int, val name : String) {
    companion object BookFactory:IdProvider{ //companion object{} 안에 선언한 내부 멤버에 대해 클래스 이름으로 접근 가능
        override fun getId(): Int {
            TODO("Not yet implemented")
            return 444
        }
        val myBook = "new book"

        fun create() = Book(0, "animal farm")
    }
    interface IdProvider {
        fun getId() : Int
    }
    fun main() {
        val book:Book = Book.create()
        val bookId = Book.BookFactory.getId()
        println("${book.id} ${book.name}")
    }

}

4. 오브젝트 클래스 : object class

//4. object 오브젝트 클래스 : 익명 클래스
object CarFactory {
    val cars:MutableList<Car> = 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:Car = CarFactory.makeCar(10)
    val car2: Car = CarFactory.makeCar(11)
}

 

[참고] : Joyce - 코틀린 3강으로 끝내기

 

728x90