๊ด€๋ฆฌ ๋ฉ”๋‰ด

Welcome! Everything is fine.

[TIL] 220130 ๋ณธ๋ฌธ

TIL

[TIL] 220130

๊ฐœ๋ฐœ๊ณฐ๋ฐœ 2022. 1. 30.
728x90

๐Ÿ’ป Today I Leaned...

๐Ÿ“Œ ์ฝ”ํ‹€๋ฆฐ 3๊ฐ•์œผ๋กœ ๋๋‚ด๊ธฐ - 2ํŽธ ๊ณ ๊ธ‰๋ฌธ๋ฒ•

1. ๋žŒ๋‹ค

1) ๋žŒ๋‹ค์‹์ด๋ž€?

๋žŒ๋‹ค์‹์€ ์šฐ๋ฆฌ๊ฐ€ ๋งˆ์น˜ value์ฒ˜๋Ÿผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ์ต๋ช…ํ•จ์ˆ˜์ด๋‹ค.

  • ๋ฉ”์†Œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ๋‹ค.
  • return ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋žŒ๋‹ค์˜ ๊ธฐ๋ณธ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

val lambdaName : Type = {argumentList -> codeBody}

๊ฐ„๋‹จํ•œ ์˜ˆ๋กœ, Int๋ฅผ ๋„ฃ์–ด ๊ทธ๊ฒƒ์˜ ์ œ๊ณฑ์„ ๋ฆฌํ„ดํ•˜๋Š” ๋žŒ๋‹ค์‹์„ ์ ์–ด๋ณด์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. square๋ผ๋Š” ์ด๋ฆ„์„ ์ •ํ•˜๊ณ , Int๋ฅผ ๋„ฃ๊ณ  Int๊ฐ€ ๋‚˜์˜ฌ ๊ฒƒ์ด๋ผ๊ณ  ์ ๊ณ , number๋ฅผ ๋„ฃ๊ณ  number์˜ ์ œ๊ณฑ์„ ๋ฆฌํ„ด๋ฐ›์„ ๊ฒƒ์ด๋ผ๊ณ  ์ ๋Š”๋‹ค. number๋ฅผ Int๋ผ๊ณ  ์„ ์–ธํ•˜์ง€ ์•Š์•„๋„ ์•ž์—์„œ ์ธํ’‹/์•„์›ƒํ’ˆ์ด Int๋ผ๊ณ  ์ •์˜ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ž…์„ ์ถ”๋ก ํ•œ๋‹ค.

val square :(Int) -> (Int) = {number -> number*number}

fun main(){

    println(square(12))
}

์ด๋ ‡๊ฒŒ ์ถœ๋ ฅํ•ด๋ณด๋ฉด 12์˜ ์ œ๊ณฑ์ธ 144๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‘ ๋ฒˆ์งธ๋Š” ์ด๋ฆ„๊ณผ ๋‚˜์ด๊ฐ€ ๊ฐ™์ด ์ถœ๋ ฅ๋˜๋Š” ์˜ˆ์‹œ์ธ๋ฐ, ์ด๋ฆ„๊ณผ ๋‚˜์ด๋ฅผ ๊ฐ๊ฐ String๊ณผ Int๋กœ ๋ฐ›๊ณ  String์œผ๋กœ ๋ฆฌํ„ดํ•˜๋Š” ๋žŒ๋‹ค์‹์ด๋‹ค. ๋žŒ๋‹ค์‹์—์„œ๋Š” ํ•ญ์ƒ ๋งˆ์ง€๋ง‰์— ์žˆ๋Š” ์ฝ”๋“œ ์ค„์ด ๋ฆฌํ„ด๊ฐ’์ด๋‹ค.

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

    println(nameAge("gom",2))
}

์ถœ๋ ฅํ•ด๋ณด๋ฉด ์ •์ƒ์ ์œผ๋กœ my name is gom I'm 2 ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

2) ๋žŒ๋‹ค์‹๊ณผ ํ™•์žฅํ•จ์ˆ˜

ํ™•์žฅํ•จ์ˆ˜๋ž€ "์ด ํด๋ž˜์Šค๋Š” ์ฐธ ์ข‹์€๋ฐ, ๋ช‡ ๊ฐœ๋งŒ ํ™•์žฅํ•˜๊ณ ์‹ถ๋‹ค!" ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ๋‹ค์Œ ์˜ˆ์‹œ๋Š” String ํด๋ž˜์Šค์— ํ™•์žฅํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ๋ชจ์Šต์ด๋‹ค.

val pizzaIsGreat : String.() -> String = {this + "Pizza is the best."}

fun main(){

    val a = "gom said "
    val b = "joice said "

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

์ถœ๋ ฅ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

gom said Pizza is the best.
joice said Pizza is the best.

introduveMyself์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ ์–ด์ค˜์•ผํ•˜๋Š”๋ฐ, ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ Int๋กœ ๋”ฑ ํ•œ ๊ฐœ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ํ•œ ๊ฐœ ์ผ ๋•Œ๋Š” it์ด๋ผ๋Š” ์˜ˆ์•ฝ์–ด๋กœ ์ƒ๋žต์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

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

    val introduceMySelf : String.(Int) -> String = {"I'm ${this} and ${it} years old."}
    return name.introduceMySelf(age)
}

fun main(){

    println(extendString("min", 27))
    
}

 

3) ๋žŒ๋‹ค์™€ ๋ฆฌํ„ด

๋žŒ๋‹ค๋Š” ๋งˆ์ง€๋ง‰ ํ‘œํ˜„์‹์ด ๋ฆฌํ„ด๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค.

 

๋‹ค์Œ์€ ์„ฑ์ ์„ ์‚ฐ์ถœํ•˜๋Š” ๋žŒ๋‹ค์‹์ด๋‹ค. ์ธํ’‹ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•ญ์ƒ ์†Œ๊ด„ํ˜ธ๋ฅผ ์จ์ค˜์•ผํ•˜๊ณ , ๋ฆฌํ„ดํ•˜๋Š” ๊ฐ’์€ ํƒ€์ž…์ด ํ•œ๊ฐœ๋ผ์„œ ์†Œ๊ด„ํ˜ธ๊ฐ€ ํ•„์š”์—†๋‹ค.

val calculateGrade : (Int) -> String = {
    when(it){
        in 0..40 -> "fail"
        in 41..70 -> "pass"
        in 71..100 -> "perfect"
        else -> "Error"
    }
}

fun main(){

    println(calculateGrade(97))
    
}

 

4) ๋žŒ๋‹ค๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•

์•„๋ž˜ ์ฝ”๋“œ์—์„œ invokeLambda๋ผ๋Š” ํ•จ์ˆ˜๋Š” Boolean์„ ๋ฆฌํ„ดํ•œ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„ฃ๋Š” ๋žŒ๋‹ค์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ ๋žŒ๋‹ค์— 5.234๋ฅผ ๋„ฃ์–ด์„œ ๋ฆฌํ„ด์ด ๋˜๋Š” Boolean๊ฐ’์„ invokeLambda์˜ ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ์‚ผ๊ฒ ๋‹ค๋Š” ๋œป์ด๋‹ค.

fun invokeLambda(lambda : (Double) -> Boolean) : Boolean {
    return lambda(5.234)
}

fun main(){

       val lambda = {number : Double ->
        number == 4.3213
    }

    println(invokeLambda(lambda))
    println(invokeLambda({it > 3.22}))
    println(invokeLambda{it > 3.22})
}

2. ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค

  • pojo ํด๋ž˜์Šค : ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์–ด์„œ ํŠน์ • ํ–‰๋™์„ ํ•˜๋Š” ํด๋ž˜์Šค๋ผ๊ธฐ ๋ณด๋‹จ ๋น„์–ด์žˆ๋Š” ํ‹€ ์—ญํ• ์„ ํ•˜๋Š” ํด๋ž˜์Šค.
  • ์ด pojo ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ž๋ฐ”์—์„  ์ง์ ‘ ์ผ์ผํžˆ ์จ์ค˜์•ผ ํ–ˆ์ง€๋งŒ ์ฝ”ํ‹€๋ฆฐ์—์„  ์“ธ๋ฐ์—†๋Š” ์ฝ”๋“œ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๋ฅผ ์“ด๋‹ค. ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๋ž€ ๋ง ๊ทธ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ํด๋ž˜์Šค์ด๋‹ค.

๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋กœ ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๋ฅผ ์ดํ•ดํ•ด๋ณด์ž!

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

๋น„ํ–‰๊ธฐ ํ‹ฐ์ผ“์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๋Š” ํ•ญ๊ณต์‚ฌ, ์ด๋ฆ„, ๋‚ ์งœ, ์ขŒ์„ ๋ฒˆํ˜ธ๋ฅผ ๋‹ด์•„ ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ๋ณ€์ˆ˜๋Š” ๋งˆ์น˜ ํด๋ž˜์Šค์˜ property์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , constructor๋„ ๋งŒ๋“ค์–ด์กŒ๋‹ค. ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜๋ฉด  toString(), hashCode(), equals(), copy() ๋“ฑ์ด ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ง„๋‹ค.

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

๊ทธ๋ƒฅ ํด๋ž˜์Šค๋Š” ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค์™€ ๊ทธ๋ƒฅ ํด๋ž˜์Šค์— ๋˜‘๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ์ถœ๋ ฅํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

fun main(){
    val ticketA = Ticket("KoreanAir", "gom", "2022-01-31", 3)
    val ticketB = TicketNomal("KoreanAir", "gom", "2022-01-31", 3)

    println(ticketA)
    println(ticketB)
}

์ถœ๋ ฅ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๊ฐ์ฒด์˜ ๋‚ด์šฉ์ด ๋‹ˆ์˜ค๊ณ , ๊ทธ๋ƒฅ ํด๋ž˜์Šค๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ’์ด ๋‚˜์˜จ๋‹ค. ์ด์ฒ˜๋Ÿผ ๊ฐ์ฒด๋ฅผ ๋„ฃ์œผ๋ฉด ๋ฐ”๋กœ ์ถœ๋ ฅํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํŽธ๋ฆฌํ•˜๋‹ค.

Ticket(companyName=KoreanAir, name=gom, date=2022-01-31, seatNumber=3)
com.example.kotlin_1.TicketNomal@6fadae5d

3. ๋™๋ฐ˜์ž ๊ฐ์ฒด

  • Companion object ๊ฐ€ ํ•˜๋Š” ๊ฒƒ์€ ์ž๋ฐ”์˜ static ๋Œ€์‹ ์— ์‚ฌ์šฉ๋˜๋Š”๊ฒƒ์œผ๋กœ, ์ •์  ๋ฉ”์†Œ๋“œ๋‚˜ ์ •์  ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์“ด๋‹ค.
  •  private property๋‚˜ method๋ฅผ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์ฑ…์˜ ์ผ๋ จ๋ฒˆํ˜ธ์™€ ์ œ๋ชฉ์„ ๊ฐ€์ง„ Book ํ•จ์ˆ˜๋ฅผ private๋กœ ๋งŒ๋“ค์—ˆ๋‹ค. ๋งŒ์•ฝ ๊ทธ๋ƒฅ val book = Book()์œผ๋กœ ์ ‘๊ทผํ•œ๋‹ค๋ฉด Cannot access '<init>': it is private in 'Book' ์ด๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋œจ๊ณ , ์—๋Ÿฌ๊ฐ€ ์ƒ๊ธด๋‹ค. ์•ˆ์— companion object๋ฅผ ๋งŒ๋“ค๋ฉด ์ •์ƒ์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์ž๋ฐ”์˜ static ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

class Book private constructor(val id : Int, val name : String){ 
    companion object{
    
        fun create() = Book(0, " animal farm")
    }

}

fun main(){

    val book = Book.create()
    
    println("${book.id} ${book.name}")
}

Companion object๋Š” ์ด๋ฆ„์„ ์ง€์„ ์ˆ˜์žˆ๊ณ , ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ๊ฒƒ ์—ญ์‹œ ๊ฐ€๋Šฅํ•˜๋‹ค.

class Book private constructor(val id : Int, val name : String){ 
    companion object 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.create()

    val bookId = Book.BookFactory.getId()

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

4. ๋ชฉ์ ์–ด

object์™€ ๋‹ค๋ฅธ ํด๋ž˜์Šค์™€์˜ ๋‹ค๋ฅธ ์ ์€ ๋”ฑ ํ•œ ๋ฒˆ ๋งŒ๋“ค์–ด์ง„๋‹ค๋Š” ์ ์ด๋‹ค. ์ฆ‰, Singleton Pattern์„ ์ ์šฉํ•œ ๊ฒƒ์ด๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ์—์„œ CarFactory๋Š” ํ•œ ๋ฒˆ ์‹คํ–‰๋  ๋•Œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋‹ค์‹œ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค. 

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())
}

์ถœ๋ ฅ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Car(horsePower=10)
Car(horsePower=200)
2

'TIL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[TIL] 220204  (0) 2022.02.04
[TIL] 220203  (0) 2022.02.03
[TIL] 220128  (0) 2022.01.28
[TIL] 220127  (0) 2022.01.27
[TIL] 220125  (0) 2022.01.25