๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐˜’๐˜ฐ๐˜ต๐˜ญ๐˜ช๐˜ฏ

Kotlin ๊ธฐ๋ณธ ๋ฌธ๋ฒ•

โœ… ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜ ์„ ์–ธ

  • ๋ณ€์ˆ˜ ํƒ€์ž… ๋ณ€์ˆ˜๋ช… : ์ž๋ฃŒํ˜•= ๊ฐ’
    • var : ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
    • val : ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ, ์ฝ๊ธฐ ์ „์šฉ
  • fun ํ•จ์ˆ˜๋ช…(๋งค๊ฐœ๋ณ€์ˆ˜๋ช…: ๋งค๊ฐœ๋ณ€์ˆ˜ํƒ€์ž…): ๋ฐ˜ํ™˜ํƒ€์ž… {๋™์ž‘}
var name: String = "์ด๋ฆ„"
val age: Int = 25
val x = 5
val y = 2

fun sayHello(name:String): String{
    return "Hello, $name"
}

//๊ธฐ๋ณธ ์ถœ๋ ฅ
println("Welcome to $name")
//ํ‘œํ˜„์‹ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
println("ํ•ฉ์€ ${x + y}์ž…๋‹ˆ๋‹ค.")

 

โœ… ์กฐ๊ฑด๋ฌธ  if ์™€ when

fun checkMax( a: Int, b:Int){
 	var max : Int
    if (a>b){
    	max = a
    }else{
    	max = b
    }
    println("max : $max")
}

//์ฝ”ํ‹€๋ฆฐ์€ if๋ฌธ๋„ ํ‘œํ˜„์‹, ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค
fun checkMax(a: Int, b:Int){
 	val max = if (a>b) a else b
    println("max : $max")
}
//when์€ switch์™€ ๋น„์Šทํ•œ ์—ญํ• ์„ ์ˆ˜ํ–‰
//val res = when (๊ฐ’){์กฐ๊ฑด1 -> ๋ฐ˜ํ™˜๊ฐ’1 ์กฐ๊ฑด2 -> ๋ฐ˜ํ™˜๊ฐ’2 else -> ๊ธฐ๋ณธ๋ฐ˜ํ™˜๊ฐ’}
fun getLabel(score:Int){
    val label = when(score){
        100 -> "perfect"
        in 90..99 -> "Excellent"
        in 80..89 -> "Good"
        in 0..79 -> "Needs Imporovement"
        else -> "invlaid"
    }
    println("when์„ ์‚ฌ์šฉํ•œ ์„ฑ์  ๊ตฌ๋ถ„ : $score ์€ $label ์ž…๋‹ˆ๋‹ค")
}

//์กฐ๊ฑด ์—†๋Š” when
fun notCondWhen(x:Int){
    val mess = when{
        x>0 -> "์–‘์ˆ˜"
        x<0 -> "์Œ์ˆ˜"
        else -> "0"
    }
    println(println("์กฐ๊ฑด ์—†๋Š” when : $mess"))
}

// is๋ฅผ ์‚ฌ์šฉํ•œ ๋ถ„๊ธฐ ๊ฐ€๋Šฅ
fun resWhenIs(x:Any){
    val resWhenIs = when(x){
        is String -> "๋ฌธ์ž์—ด , $x"
        is Int -> "์ •์ˆ˜ , $x"
        else -> "์•Œ ์ˆ˜ ์—†์Œ"
    }
    println("is๋ฅผ ์‚ฌ์šฉํ•œ ํƒ€์ž…๋ณ„ ๋ถ„๊ธฐ : $resWhenIs")
}

//ํ•จ์ˆ˜ ๋‚ด๋ถ€ return ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ
fun getColorCode(color: String): String = when (color) {
    "red" -> "#FF0000"
    "green" -> "#00FF00"
    "blue" -> "#0000FF"
    else -> "#000000"
}

 

โœ… ๋ฐ˜๋ณต๋ฌธ for ๊ณผ while

๋ฒ”์œ„ ํ‘œํ˜„ 
for(i in 1..5) 1..5  1 2 3 4 5 
for(i in 0 until 5) until 5 0 1 2 3 4
for(i in 5 downTo 1) downTo 1  5 4 3 2 1 
for (i in 0..5 step 2) step 2 0 2 4
//๋ฆฌ์ŠคํŠธ ๋ฐ˜๋ณต
val items = listOf("a", "b", "c")

for(i in items){
	println(i)
}

//์ธ๋ฑ์Šค์™€ ๊ฐ’ ๋™์‹œ ์ ‘๊ทผ
for ((index, item) in items.withIndex()) {
    println("[$index] $item")
}

//๋žŒ๋‹ค์‹
items.forEach {item -> println("Item: $item")}
//ํŒ๋‹จ ํ›„ ์ถœ๋ ฅ - ์•„๋ฌด๊ฒƒ๋„ ์ถœ๋ ฅ๋˜์ง€ ์•Š์Œ
fun countDown() {
    var i = 5
    while (i > 5) {
        println("i = $i")
        i--
    }
}

//์‹คํ–‰ ํ›„ ํŒ๋‹จ = i=5 ์ถœ๋ ฅ ํ›„ ์ค‘์ง€
fun countDownDo() {
    var i = 5
    do {
        println("i = $i")
        i--
    } while (i > 5)
}

 

โœ… ์•ˆ์ „ ์—ฐ์‚ฐ์ž

  • ?๋ฅผ ์‚ฌ์šฉํ•œ nullable ํƒ€์ž… ์ฒ˜๋ฆฌ
fun printLeng(str:String?){
    println(str?.length) // null ์ผ ๊ฒฝ์šฐ null, ์•„๋‹ˆ๋ฉด ๊ธธ์ด ์ถœ๋ ฅ
    
    // ?: ์—˜๋น„์Šค ์—ฐ์‚ฐ์ž
    // null ์ผ ๊ฒฝ์šฐ ์„ธํŒ…ํ•  ๊ธฐ๋ณธ ๊ฐ’ ์ œ๊ณต
    val ifNull = str?.length ?: 0
    println("์—˜๋น„์Šค ์—ฐ์‚ฐ์ฒ˜๋ฆฌ ์™„๋ฃŒ ํ›„ ๊ฐ’ : $ifNull") // null ์ผ ๊ฒฝ์šฐ 0 ์ถœ๋ ฅ
    
    // !!์„ ์‚ฌ์šฉํ•œ ๊ฐ•์ œ ์–ธ๋ž˜ํ•‘
    //nullPointerEx ๋ฐœ์ƒ
    // str!!.length
    
    // ?.let์„ ์‚ฌ์šฉํ•œ ์•ˆ์ „ํ•œ ์ฝ”๋“œ ์‹คํ–‰
    //nul ์ฒดํฌ ํ›„ ์ฝ”๋“œ ๋ธ”๋Ÿญ ์‹คํ–‰
    str?.let{println("๊ธธ์ด : {it.length}")} //null ์•„๋‹ˆ๋ฉด ์‹คํ–‰
}

 

โœ… Collection Types - ๊ฐ’์€ ํƒ€์ž…์˜ ๋ชจ์Œ List, Set, Map

  • List - ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ์ปฌ๋ ‰์…˜, ์ค‘๋ณต๋œ ๊ฐ’ ํ—ˆ์šฉ, ์ฝ๊ธฐ ์ „์šฉ
fun printFruits(){
    val fruits = listOf("Apple","Banana","Cherry","Apple") //๋ถˆ๋ณ€ ๋ฆฌ์ŠคํŠธ
    println(fruits) //[Apple, Banana, Cherry, Apple]
    println(fruits[1])
    
    for(f in fruits){
        println(f)
    }
}

fun modifyFruits(){
    val mutable = mutableListOf("Apple","Banana","Cherry") //์ˆ˜์ • ๊ฐ€๋Šฅํ•œ ๋ฆฌ์ŠคํŠธ
    mutable.add("Grape")
    mutable[0] = "Orange"
    println(mutable) //[Orange, Banana, Cherry, Grape]
}

 

 

  • set - ์ˆœ์„œ ์—†๋Š” ์ปฌ๋ ‰์…˜, ์ค‘๋ณต ํ—ˆ์šฉ ์•ˆํ•จ
fun setFruits(){
    val fruits = setOf("Apple","Banana","Cherry","Apple") //์ค‘๋ณต ๋น„ํ—ˆ์šฉ
    println(fruits) // [Apple, Banana, Cherry]
    for(f in fruits){
        println(f)
    }
}

fun modifySetFruits(){
    val mutable = mutableSetOf("Apple","Banana","Cherry") //์ค‘๋ณต ์ž๋™ ์ œ๊ฑฐ ๋ฐ ์…‹ ์ˆ˜์ • ๊ฐ€๋Šฅ
    mutable.add("Grape")
    mutable.add("Apple") //์ค‘๋ณต ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ ์•ˆ๋จ
    println(mutable) //[Orange, Banana, Cherry, Grape]
}

 

  • Map<key,value> : ๊ณ ์œ  ํ‚ค๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ํƒ์ƒ‰ํ•˜๋Š” ์ปฌ๋ ‰์…˜ ํƒ€์ž…</key,value>
    • Map<String,(Int, Int)->Int> : String ํƒ€์ž…์˜ ํ‚ค๋ฅผ ํ†ตํ•ด ์ •์ˆ˜ํ˜• ๋ณ€์ˆ˜ ๋‘๊ฐœ๋ฅผ ๋ฐ›์•„ ์ •์ˆ˜ํ˜•์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ ๊ฐ’์„ ์ฐพ๋Š” ๋ณ€์ˆ˜
    • mapOf :  Map ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜
    • ํ‚ค ์ƒ์„ฑ ์กฐ๊ฑด
      1. ๊ธฐ๋ณธ ํƒ€์ž… ์ „๋ถ€ ๊ฐ€๋Šฅ ex) String, Int, Boolean ...
      2. ๊ฐ์ฒด ํƒ€์ž…์ผ ์ •์šฐ equals() ํ˜น์€ hashCode()๊ฐ€ ์ •์˜ ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค
        • data class ์‚ฌ์šฉ ์‹œ ์ž๋™์œผ๋กœ equals, hashCode ์ƒ์„ฑ
      3. null ์‚ฌ์šฉ ๋ถˆ๊ฐ€
// Map<key,value> = mapOf(
// ์‹ค์ œ ๊ตฌํ˜„ ๋ถ€
// "๊ณ ์œ ํ‚ค" to ํ• ๋‹น ๊ฐ’
// )
 
 fun main() {
    val fruits = mapOf("apple" to 3, "banana" to 2, "cherry" to 5)
    println(fruits)  // {apple=3, banana=2, cherry=5}
    println(fruits["banana"])  // ์ถœ๋ ฅ: 2
}

fun main() {
    val mutableFruits = mutableMapOf("apple" to 3, "banana" to 2) //์ˆ˜์ • ๊ฐ€๋Šฅ
    mutableFruits["cherry"] = 5  // ์ƒˆ๋กœ์šด ํ‚ค-๊ฐ’ ์Œ ์ถ”๊ฐ€
    mutableFruits["apple"] = 4   // ๊ธฐ์กด ๊ฐ’ ์ˆ˜์ •

    println(mutableFruits)  //{apple=4, banana=2, cherry=5}
}
fun main() {
   
    val add = operate(4,2){x,y -> x+y}
    val sub = operate(4,2){x,y -> x-y}
    val mul = operate(4,2){x,y -> x*y}
    println(add)
    println(sub)
    println(mul)
    
    //Map ์‚ฌ์šฉ
    val op = operatorMap["add"] ?: { _, _ -> 0 }
    // {_,_->0} : ๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ 0์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋žŒ๋‹ค์‹
    println(op(10, 3))  // 13
}

fun operate(a: Int, b:Int, op:(Int, Int)->Int):Int{
    return op(a,b)
}

//๋™์ž‘์„ ํ•จ์ˆ˜ ์™ธ๋ถ€๋กœ ์œ„์ž„ํ•ด์„œ ์œ ์—ฐํ•œ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ
val operatorMap:Map<String, (Int, Int)->Int> = mapOf(
	"add" to {x,y -> x+y},
    "sub" to {x,y -> x-y},
    "mul" to {x,y -> x*y}
)

 

โœ… ๋žŒ๋‹ค ํ•จ์ˆ˜ Lambda

์ด๋ฆ„ ์—†๋Š” ํ•จ์ˆ˜๋กœ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌ

fun main() {
    val sum = { x: Int, y: Int -> x + y }  // ๋‘ ๊ฐ’์„ ๋”ํ•˜๋Š” ๋žŒ๋‹ค ํ•จ์ˆ˜
    println(sum(3, 5))  // 8
    
    val greet = { name: String -> "Hello, $name!" }
    println(greet("Kotlin"))  // Hello, Kotlin!
    
    var result = operate(5, 3) { a, b -> a + b }  
    println(result)  // 8
    
    result = operate(5, 3) { a, b -> a - b }
    println(result)  // 2
}

//๊ณ ์ฐจ ํ•จ์ˆ˜ - ๋žŒ๋‹คํ•จ์ˆ˜๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜์ธ ๊ฒฝ์šฐ
fun operate(x: Int, y: Int, op: (Int, Int) -> Int): Int {
    return op(x, y)  // ๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
}