hmk run dev

kotlin basic2( 코틀린 기본 문법2 ) 본문

android

kotlin basic2( 코틀린 기본 문법2 )

hmk run dev 2022. 2. 5. 18:04

LAMDA ( 개인적으로 코틀린 문법중 제일 어렵다. )

package com.example.kotlin_prac

class sample3 {
}

fun main () {

    println(square(12))
    println(nameAge("형민", 28))
    
    // 확장함수 사용법
    val a = "hmk good!"
    val b = "android"

    println(a.pizzaIsGreat())
    println(b.pizzaIsGreat())

    extendsString("hmk", 28)
    println(calcGrade(91))



    // 람다식을 파라미터로 넘겨보기

    val lamda : (Double) -> Boolean = { number : Double ->
        number == 4.341
    }

    println("람다 넘겨보자 : "+invokeLamda(lamda))
    println(invokeLamda({it > 3.22})) // 이렇게 표현도 가능

    invokeLamda { it > 3.22 } // 함수의 마지막 파라미터가 람다일땐 괄호 생략가능
    
    // 익명 내부 함수

}

//// lamda
// 람다식은 우리가 마지 value 처럼 다룰 수 있는 익명함수!
// 1) 메소드의 파라미터로 넘겨줄 수 가 있다. ) fun maxBt( lamdaFunc )
// 2) 리턴 값으로 사용가능

// 람다의 기본정의
// val lamdaName : Type = {argumentList -> codeBody}

val square = {number : Int -> number*number} // println(square(12)) => 144

val nameAge = {name: String, age: Int ->
    "my name is ${name} I'm ${age}"
}

// 확장함수

val pizzaIsGreat : String.() -> String = { // this는 확장함수를 사용하는 인스턴스
    this + "Pizza is the best!"
}

fun extendsString (name: String, age : Int) : String {

    val introduceMyself : String.(Int) -> String = { // 확장함수사용객체(this).파라미터타입(it) 파라미터가 1개 일땐 it 사용
        "I'm ${this} and ${it} years old" // this는 확장함수가 부른 object it은 int
    }

    return name.introduceMyself(age)
}

// 람다의 Return

val calcGrade : (Int) -> (String) = {
    when(it){
        in 0..40 -> "fail"
        in 41..70 -> "pass"
        in 71..100 -> "pood"
        else -> "error?"
    }
}

// 람다를 표현하는 방법
// 람다를 파라미터로 받는 함수
fun invokeLamda (lamda : (Double) -> Boolean) : Boolean {
    return lamda(5.2344)
}

 

DATA (JAVA LOMBOK 상위버전?)

package com.example.kotlin_prac


//// Data
// pojo class 모델이 되는 클래스 > 메서드가 없고 틀 역할을 하는 클래스 jpa 모델같은? lombok을 이용한?
// 이게 끝...! getter setter @Data 어노테이션 다 필요없다 대박!
data class Ticket(val companyName : String , val name : String , var date : String, val seatNumber : Int)

class TicketNormal(val companyName : String , val name : String , var date : String, val seatNumber : Int)

fun main () {
    val ticketA = Ticket(  "asiana", "hmk", "2022-02-28", 7  )
    val ticketB = TicketNormal("asiana", "hmk", "2022-02-28", 7 )

    println(ticketA) // 객체 내용 확인가능
    println(ticketB)
}

 

정적메소드 & object class(singletone pattern)

package com.example.kotlin_prac

// 정적 메소드
// private constructor 다른곳에서 사용불가
class Book private constructor (val id : Int, val name : String)  {

    companion object BookFactory :IdProvider { // interface 상속문법

        override fun getId() :Int { // 인터페이스 상속 함수 구현
            return 777
        }

        val myBook = "new book"

        fun create() = Book(0, myBook)
    }
}


fun main () {

    // private 프로퍼티나 메소드를 읽어 올 수 있게함 자바의 static
    val book = Book.create() // BookFactory 생략가능

    val bookId = Book.BookFactory.getId()

    println("${book.id} ${book.name}")

    // object class
    val car: Car = CarFactory.makeCar(10)
    var car2 : Car = CarFactory.makeCar(200)
    var cars : List<Car> = CarFactory.cars

    println(car)
    println(car2)
    println(cars)

}

interface IdProvider {
    fun getId () : Int
}

//// object class
// CarFactory라는 객체는 앱실행시 딱 한번만 만들어진다 > 싱글톤 패턴 > 메모리 누수 방지
object CarFactory { // class 대신 object
    val cars = mutableListOf<Car>()
    fun makeCar (horsePower: Int) : Car {
        val car = Car(horsePower)
        cars.add(car)
        return car
    }
}

data class Car (val horsePower : Int)

'android' 카테고리의 다른 글

안드로이드 앱 Constraint Layout  (0) 2022.02.06
kotlin basic3(간단한 앱 만들기)  (0) 2022.02.06
kotlin basic(코틀린 기본 문법)  (0) 2022.02.05
앱 관리  (0) 2022.02.05
어플 배포 팁  (0) 2022.02.05
Comments