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

Study/Android

[์•ˆ๋“œ๋กœ์ด๋“œ ์ฝ”ํ‹€๋ฆฐ] 3. ๊ธฐ๋ณธ ๋ฌธ๋ฒ•(2) - ํ•จ์ˆ˜/๋ฉ”์†Œ๋“œ, ์ „์—ญ๋ณ€์ˆ˜, ์ง€์—ญ๋ณ€์ˆ˜/ํด๋ž˜์Šค, ์ธ์Šคํ„ด์Šค/์ถ”๊ฐ€์ ์ธ ๋ฌธ๋ฒ•

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

 

ํ•จ์ˆ˜

fun ํ•จ์ˆ˜ ์ด๋ฆ„([๋ณ€์ˆ˜ ์ด๋ฆ„: ์ž๋ฃŒํ˜•, ๋ณ€์ˆ˜ ์ด๋ฆ„: ์ž๋ฃŒํ˜•..]): [๋ฐ˜ํ™˜ ๊ฐ’ ์ž๋ฃŒํ˜•]{	// fun: ํ•จ์ˆ˜ ์˜ˆ์•ฝ์–ด
    ํ‘œํ˜„์‹...
    [return ๋ฐ˜ํ™˜๊ฐ’]
}

// ex
fun sum(a: Int, b: Int): Int{
    var sum = a + b
    return sum
}

 

1. ์ฝ”ํ‹€๋ฆฐ์€ ๋‹ค์ค‘ ํŒจ๋Ÿฌ๋‹ค์ž„ ์–ธ์–ด

- ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ(FP: Funtional Programming)

- ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP: Object-Oriented Programming)

 

2. ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

- ์ฝ”๋“œ ๊ฐ„๋žต, ํ…Œ์ŠคํŠธ๋‚˜ ์žฌ์‚ฌ์šฉ์„ฑ ์ฆ๊ฐ€

- ์ˆœ์ˆ˜ ํ•จ์ˆ˜, ๋žŒ๋‹ค์‹, ๊ณ ์ฐจ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๊ตฌ์„ฑ

→ ex) main(), sum(), max() ํ•จ์ˆ˜

 

3. ์ผ๋ฐ˜์  ์„ ์–ธ

fun sum(a: Int, b: Int): Int {
    return a + b
}

 

4. ๊ฐ„๋žตํ•œ ์„ ์–ธ

fun sum(a: Int, b: Int): Int = a + b
fun sum(a: Int, b: Int) = a + b

 

์˜ˆ์ œ

fun sum(a: Int, b: Int): Int{
    var sum = a + b
    return sum
}

fun main() {
    val result1: Int
    val result2: Int

    result1 = sum(3, 2) // IntelliJ IDEA์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜(a: 3, b: 2)๋ฅผ ๋ณด์—ฌ์คŒ
    result2 = sum(6, 7) // IntelliJ IDEA์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜(a: 6, b: 7)๋ฅผ ๋ณด์—ฌ์คŒ

    println(result1)
    println(result2)
}

 

fun main() {    // ์ตœ์ดˆ์˜ ์Šคํƒ ํ”„๋ ˆ์ž„
    val num1 = 10   // ์ž„์‹œ ๋ณ€์ˆ˜ ํ˜น์€ ์ง€์—ญ ๋ณ€์ˆ˜
    val num2 = 3    // ์ž„์‹œ ๋ณ€์ˆ˜ ํ˜น์€ ์ง€์—ญ ๋ณ€์ˆ˜
    val result: Int

    result = max(num1, num2) // ๋‘ ๋ฒˆ์งธ ์Šคํƒ ํ”„๋ ˆ์ž„
    println(result)
}

fun max(a: Int, b: Int) = if (a > b) a else b // a์™€ b๋Š” max์˜ ์ž„์‹œ ๋ณ€์ˆ˜

 

// ๋‘๊ฐœ์˜ ์ˆซ์ž๋ฅผ ์ž…๋ ฅ ๋ฐ›์•„์„œ ๋ง์…ˆ, ๋บ„์…ˆ, ๊ณฑ์…ˆ์„ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ถœ๋ ฅํ•˜์‹œ์˜ค

fun sum(a: Int, b: Int) = a + b
fun sub(a: Int, b: Int): Int = a - b
fun mul(a: Int, b: Int): Int{
    return a * b
}

fun main() {
    var num1: Int
    var num2: Int

    print("number1 = ")
    num1 = readLine()!!.toInt()     // !! : ๋ฐ˜๋“œ์‹œ ์ž…๋ ฅ๋ฐ›์•„๋ผ -> ์ฝ”ํ‹€๋ฆฐ์˜ ๊ฒฝ์šฐ .๋งŒ์“ฐ๋ฉด ์˜ค๋ฅ˜๋‚˜๋ฏ€๋กœ !!์จ์ค˜์•ผํ•จ
    print("number2 = ")
    num2 = readLine()!!.toInt()

    println("number1+number2 = ${sum(num1, num2)}")
    println("number1-number2 = ${sub(num1, num2)}")
    println("number1*number2 = ${mul(num1, num2)}")
}

โ€ป ๋งŒ์•ฝ ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ sum()์„ ์จ์„œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ๋˜์—ˆ๋‹ค๋ฉด, ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”๋ผ

 

 

์ˆœ์ˆ˜ ํ•จ์ˆ˜(pure function) (→ ์ผ๋ฐ˜์ ์œผ๋กœ ์•Œ๊ณ  ์žˆ๋Š” ํ•จ์ˆ˜)

- ๋ถ€์ž‘์šฉ(side-effect)์ด ์—†๋Š” ํ•จ์ˆ˜

    - ๋™์ผํ•œ ์ž…๋ ฅ ์ธ์ž์— ๋Œ€ํ•ด์„œ๋Š” ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅ ํ˜น์€ ๋ฐ˜ํ™˜ํ•จ

    - ๊ฐ’์ด ์˜ˆ์ธก์ด ๊ฐ€๋Šฅํ•ด ๊ฒฐ์ •์ ์ž„

fun sum(a: Int, b: Int): Int{
    return a + b	// ๋™์ผํ•œ ์ธ์ž์ธ a, b๋ฅผ ์ž…๋ ฅ ๋ฐ›์•„ ํ•ญ์ƒ a + b๋ฅผ ์ถœ๋ ฅ(๋ถ€์ž‘์šฉ์ด ์—†์Œ)
}

- ์ˆœ์ˆ˜ ํ•จ์ˆ˜์˜ ์กฐ๊ฑด

    - ๊ฐ™์€ ์ธ์ž์— ๋Œ€ํ•˜์—ฌ ํ•ญ์ƒ ๊ฐ™์€ ๊ฐ’์„ ๋ฐ˜ํ™˜

    - ํ•จ์ˆ˜ ์™ธ๋ถ€์˜ ์–ด๋–ค ์ƒํƒœ๋„ ๋ฐ”๊พธ์ง€ ์•Š์Œ

 

 

๋žŒ๋‹ค์‹(Lambda Expression)

- ์ต๋ช… ํ•จ์ˆ˜์˜ ํ•˜๋‚˜์˜ ํ˜•ํƒœ๋กœ ์ด๋ฆ„์ด ์—†์ด ์‚ฌ์šฉ ๋ฐ ์‹คํ–‰์ด ๊ฐ€๋Šฅ

- ๋žŒ๋‹ค ๋Œ€์ˆ˜(Lambda calculus)๋กœ ๋ถ€ํ„ฐ ์œ ๋ž˜

(x, y -> x + y)

 

- ๋žŒ๋‹ค์‹์˜ ์ด์šฉ

    - ๋žŒ๋‹ค์‹์€ ๊ณ ์ฐจ ํ•จ์ˆ˜์—์„œ ์ธ์ž๋กœ ๋„˜๊ธฐ๊ฑฐ๋‚˜ ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ ๋“ฑ์„ ํ•  ์ˆ˜ ์žˆ์Œ

    - ๋ณ€์ˆ˜์— ๋žŒ๋‹ค์‹ ์ ์šฉ

fun main(){
    var result: Int
    val multi = {x: Int, y: Int -> x * y}	// ์ผ๋ฐ˜ ๋ณ€์ˆ˜์— ๋žŒ๋‹ค์‹ ํ• ๋‹น
    
    result = multi(10, 20)	// ๋žŒ๋‹ค์‹์ด ํ• ๋‹น๋œ ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    println(result)
}

 

- ๋žŒ๋‹ค์‹

// ํ”ผ๋ผ๋ฏธํ„ฐ 2๊ฐœ๋ฅผ ๋ฐ›์•„์„œ ํ•จ๊ณ„๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฉ”์†Œ๋“œ ํ˜•์‹
fun addNumber(n1: Int, n2: Int): Int{
    return n1 + n2
}
// ๋žŒ๋‹ค์‹์œผ๋กœ ํ‘œํ˜„
val addNumbe = {n1: Int, n2: Int -> n1 + n2}

 

- ํŠน์ง•

1. ๋žŒ๋‹ค์‹์€ { }๋กœ ๊ฐ์‹ธ๋ฉฐ fun ์˜ˆ์•ฝ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ

2. { } ์•ˆ ->์˜ ์™ผ์ชฝ์€ ํŒŒ๋ผ๋ฏธํ„ฐ, ์˜ค๋ฅธ์ชฝ์€ ํ•จ์ˆ˜์˜ ๋‚ด์šฉ

3. -> ์˜ค๋ฅธ์ชฝ ๋ฌธ์žฅ์ด ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋ฉด ์„ธ๋ฏธ์ฝœ๋ก (;)์œผ๋กœ ๊ตฌ๋ถ„

4. ๋‚ด์šฉ ์ค‘ ๋งˆ์ง€๋ง‰ ๋ฌธ์žฅ์„ ๋ฐ˜ํ™˜ ๊ฐ’(return)์ž„

// ex) ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ์‹คํ–‰๋˜๋Š” ๋žŒ๋‹ค์‹
๋ฒ„ํŠผ๋ณ€์ˆ˜.SetOnClickListener{
    // ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์‹คํ–‰๋  ๋‚ด์šฉ
}

 

 

๊ณ ์ฐจ ํ•จ์ˆ˜(high-order function)

- ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋‚˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์‚ฌ์šฉ

fun main(){
    println(highFunc({x, y -> x + y}, 10, 20))	// ๋žŒ๋‹ค์‹ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋„˜๊น€
}

fun highFunc(sum: (Int, Int) -> Int, a: Int, b: Int): Int = sum(a, b)	// sum ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•จ์ˆ˜

 


๋ฉ”์†Œ๋“œ์™€ ์ „์—ญ๋ณ€์ˆ˜, ์ง€์—ญ๋ณ€์ˆ˜

๋ฉ”์†Œ๋“œ

- ๊ธฐ๋ณธ ๋ฉ”์†Œ๋“œ์ธ main( ) ํ•จ์ˆ˜ ์™ธ์— ์‚ฌ์šฉ์ž๊ฐ€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ

- ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„˜๊ธธ ์ˆ˜ ์žˆ์Œ

- ๋ฉ”์†Œ๋“œ์—์„œ ์‚ฌ์šฉ๋œ ๊ฒฐ๊ณผ๋ฅผ return ๋ฌธ์œผ๋กœ ๋Œ๋ ค์ค„ ์ˆ˜๋„ ์žˆ์Œ

 

๋ณ€์ˆ˜

- ์ „์—ญ๋ณ€์ˆ˜(global variable)

    - ์ „์—ญ๋ณ€์ˆ˜๋Š” ๋ชจ๋“  ๋ฉ”์†Œ๋“œ์—์„œ ์‚ฌ์šฉ๋จ

 

- ์ง€์—ญ๋ณ€์ˆ˜(local variable)

    - ๋ฉ”์†Œ๋“œ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋จ

var myVar: Int = 100    // ์ „์—ญ๋ณ€์ˆ˜
fun main() {
    var myVar: Int = 0     // ์ง€์—ญ๋ณ€์ˆ˜
    println(myVar)

    var sum: Int = addFunction(10, 20)
    println(sum)
}

fun addFunction(num1: Int, num2: Int): Int{
    var hap: Int
    hap = num1 + num2 + myVar
    return  hap
}

// ๊ฒฐ๊ณผ
// 0
// 130

 


ํด๋ž˜์Šค์™€ ์ธ์Šคํ„ด์Šค

ํด๋ž˜์Šค(class)

- ๋ณ€์ˆ˜(ํ•„๋“œ)์™€ ๋ฉ”์†Œ๋“œ๋กœ ๊ตฌ์„ฑ

- ๊ฐ์ฒด์ง€ํ–ฅ ๊ด€์ ์—์„œ์˜ ํด๋ž˜์Šค : ์‹ค์„ธ๊ณ„์˜ ๊ฐ์ฒด๋“ค์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ(๋ณ€์ˆ˜)์™€ ํ–‰๋™(๋ฉ”์†Œ๋“œ)

 

class Car{
    var color: String = ""
    var speed: Int = 0

    fun upSpeed(value: Int){
        if(speed+value >= 200)
            speed = 200
        else
            speed = speed + value
    }
    fun downSpeed(value: Int){
        if(speed-value <= 0)
            speed = 0
        else
            speed = speed - value
    }
}

fun main() {
    var myCar1: Car = Car()
    myCar1.color = "๋นจ๊ฐ•"
    myCar1.speed = 0

    var myCar2: Car = Car()
    myCar2.color = "ํŒŒ๋ž‘"
    myCar2.speed = 0

    var myCar3: Car = Car()
    myCar3.color = "์ดˆ๋ก"
    myCar3.speed = 0

    myCar1.upSpeed(50)
    println("์ž๋™์ฐจ1์˜ ์ƒ‰์ƒ์€ " + myCar1.color + "์ด๋ฉฐ, ์†๋„๋Š” " + myCar1.speed + "km์ž…๋‹ˆ๋‹ค.")

    myCar2.upSpeed(20)
    println("์ž๋™์ฐจ2์˜ ์ƒ‰์ƒ์€ " + myCar2.color + "์ด๋ฉฐ, ์†๋„๋Š” " + myCar2.speed + "km์ž…๋‹ˆ๋‹ค.")

    myCar3.upSpeed(250)
    println("์ž๋™์ฐจ3์˜ ์ƒ‰์ƒ์€ " + myCar3.color + "์ด๋ฉฐ, ์†๋„๋Š” " + myCar3.speed + "km์ž…๋‹ˆ๋‹ค.")
}

 

- ์ƒ์„ฑ์ž ์ฝ”๋“œ ์ถ”๊ฐ€ → ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ (์•„๋ž˜ ์ฝ”๋“œ)

class Car{
    var color: String = ""
    var speed: Int = 0
    
    constructor(color: String, speed: Int){		// ์ƒ์„ฑ์ž ์ฝ”๋“œ ์ถ”๊ฐ€
        this.color = color
        this.speed = speed
    }

    fun upSpeed(value: Int){
        if(speed+value >= 200)
            speed = 200
        else
            speed = speed + value
    }
    fun downSpeed(value: Int){
        if(speed-value <= 0)
            speed = 0
        else
            speed = speed - value
    }
}

fun main() {   
    var myCar1:Car = Car("๋นจ๊ฐ•", 0)
    var myCar2:Car = Car("ํŒŒ๋ž‘", 0)
    var myCar3:Car = Car("์ดˆ๋ก", 0)

    myCar1.upSpeed(50)
    println("์ž๋™์ฐจ1์˜ ์ƒ‰์ƒ์€ " + myCar1.color + "์ด๋ฉฐ, ์†๋„๋Š” " + myCar1.speed + "km์ž…๋‹ˆ๋‹ค.")

    myCar2.upSpeed(20)
    println("์ž๋™์ฐจ2์˜ ์ƒ‰์ƒ์€ " + myCar2.color + "์ด๋ฉฐ, ์†๋„๋Š” " + myCar2.speed + "km์ž…๋‹ˆ๋‹ค.")

    myCar3.upSpeed(250)
    println("์ž๋™์ฐจ3์˜ ์ƒ‰์ƒ์€ " + myCar3.color + "์ด๋ฉฐ, ์†๋„๋Š” " + myCar3.speed + "km์ž…๋‹ˆ๋‹ค.")
}

 

- ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ

    - ํ•œ ํด๋ž˜์Šค ๋‚ด์—์„œ ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„์ด ๊ฐ™์•„๋„ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐœ์ˆ˜๋‚˜ ๋ฐ์ดํ„ฐ ํ˜•์‹๋งŒ ๋‹ค๋ฅด๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Œ

 

class Car{
    var color: String = ""
    var speed: Int = 0

    constructor(color: String, speed: Int){     // ์ƒ์„ฑ์ž ์ฝ”๋“œ ์ถ”๊ฐ€
        this.color = color
        this.speed = speed
    }

    constructor(color: String){     // ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ
        this.color = color
    }

    constructor(speed: Int){     // ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ
        this.speed = speed
    }

    constructor(){     // ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ
        
    }

    fun upSpeed(value: Int){
        if(speed+value >= 200)
            speed = 200
        else
            speed = speed + value
    }
    fun downSpeed(value: Int){
        if(speed-value <= 0)
            speed = 0
        else
            speed = speed - value
    }
}

fun main() {
//    ์ƒ๋žต
}

 

์ •์  ํ•„๋“œ, ์ •์  ๋ฉ”์†Œ๋“œ, ์ƒ์ˆ˜ ํ•„๋“œ

- ์ •์  ํ•„๋“œ(static field)

    - ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ํด๋ž˜์Šค ์ž์ฒด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜

    - companion object { } ์•ˆ์— ์ž‘์„ฑํ•˜์—ฌ ์ •์  ํ•„๋“œ๋ฅผ ๋งŒ๋“ฆ

 

- ์ •์  ๋ฉ”์†Œ๋“œ(static method)

    - ๋ฉ”์†Œ๋“œ ๋˜ํ•œ companion object { } ์•ˆ์— ์ž‘์„ฑํ•˜๋ฉด ๋จ

    - ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ‘ํด๋ž˜์Šค๋ช….๋ฉ”์†Œ๋“œ๋ช…( )’์œผ๋กœ ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

 

- ์ƒ์ˆ˜ ํ•„๋“œ

    - ์ •์  ํ•„๋“œ์— ์ดˆ๊นƒ๊ฐ’์„ ์ž…๋ ฅํ•˜๊ณ  const val๋กœ ์„ ์–ธ

    - ์„ ์–ธํ•œ ํ›„์—๋Š” ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Œ

    - ์ƒ์ˆ˜ ํ•„๋“œ๋Š” ๋Œ€๋ฌธ์ž๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž„

    - ํด๋ž˜์Šค ์•ˆ์— ์ƒ์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉ

 

class Car{
    var color: String = ""
    var speed: Int = 0

    companion object{
        var carCount: Int = 0           // ์ •์  ํ•„๋“œ
        const val MAXSPEED: Int = 200   // ์ƒ์ˆ˜ ํ•„๋“œ
        const val MINSPEED: Int = 0     // ์ƒ์ˆ˜ ํ•„๋“œ
        fun currentCarCount(): Int{     // ์ •์  ๋ฉ”์†Œ๋“œ
            return carCount
        }
    }

    constructor(color: String, speed: Int){     // ์ƒ์„ฑ์ž ์ฝ”๋“œ ์ถ”๊ฐ€
        this.color = color
        this.speed = speed
    }

    constructor(color: String){     // ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ
        this.color = color
    }

    constructor(speed: Int){     // ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ
        this.speed = speed
    }

    constructor(){     // ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ

    }

    fun upSpeed(value: Int){
        if(speed+value >= 200)
            speed = 200
        else
            speed = speed + value
    }
    fun downSpeed(value: Int){
        if(speed-value <= 0)
            speed = 0
        else
            speed = speed - value
    }
}

fun main() { 
    var myCar1:Car = Car("๋นจ๊ฐ•", 0)
    var myCar2:Car = Car("ํŒŒ๋ž‘", 0)
    var myCar3:Car = Car("์ดˆ๋ก", 0)

    println("์ƒ์‚ฐ๋œ ์ฐจ์˜ ๋Œ€์ˆ˜(์ •์  ํ•„๋“œ) ==> " + Car.carCount)
    println("์ƒ์‚ฐ๋œ ์ฐจ์˜ ๋Œ€์ˆ˜(์ •์  ๋ฉ”์†Œ๋“œ) ==> " + Car.currentCarCount())
    println("์ฐจ์˜ ์ตœ๊ณ  ์ œํ•œ ์†๋„ ==> " + Car.MAXSPEED)

    println("PI์˜ ๊ฐ’ ==> " + Math.PI)
    println("3์˜ 5์ œ๊ณฑ ==> " + Math.pow(3.0, 5.0))
}

// ๊ฒฐ๊ณผ
// ์ƒ์‚ฐ๋œ ์ฐจ์˜ ๋Œ€์ˆ˜(์ •์  ํ•„๋“œ) ==> 0
// ์ƒ์‚ฐ๋œ ์ฐจ์˜ ๋Œ€์ˆ˜(์ •์  ๋ฉ”์†Œ๋“œ) ==> 0
// ์ฐจ์˜ ์ตœ๊ณ  ์ œํ•œ ์†๋„ ==> 200
// PI์˜ ๊ฐ’ ==> 3.141592653589793
// 3์˜ 5์ œ๊ณฑ ==> 243.0

 

ํด๋ž˜์Šค ์ƒ์†(inheritance)

- ๊ธฐ์กด์˜ ํด๋ž˜์Šค๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๊ทธ๋Œ€๋กœ ๋ฌผ๋ ค๋ฐ›์œผ๋ฉด์„œ ํ•„์š”ํ•œ ํ•„ ๋“œ๋‚˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€๋กœ ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•จ

 

open class Car{
    var color: String = ""
    var speed: Int = 0

    companion object{
        var carCount: Int = 0           // ์ •์  ํ•„๋“œ
        const val MAXSPEED: Int = 200   // ์ƒ์ˆ˜ ํ•„๋“œ
        const val MINSPEED: Int = 0     // ์ƒ์ˆ˜ ํ•„๋“œ
        fun currentCarCount(): Int{     // ์ •์  ๋ฉ”์†Œ๋“œ
            return carCount
        }
    }

    constructor(color: String, speed: Int){     // ์ƒ์„ฑ์ž ์ฝ”๋“œ ์ถ”๊ฐ€
        this.color = color
        this.speed = speed
    }

    constructor(color: String){     // ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ
        this.color = color
    }

    constructor(speed: Int){     // ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ
        this.speed = speed
    }

    constructor(){     // ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ

    }

    open fun upSpeed(value: Int){
        if(speed+value >= 200)
            speed = 200
        else
            speed = speed + value
    }
    fun downSpeed(value: Int){
        if(speed-value <= 0)
            speed = 0
        else
            speed = speed - value
    }
}

class Automobile: Car{
    var seatNum: Int = 0

    constructor(){

    }
    fun conutSeatNum(): Int{
        return seatNum
    }

    override fun upSpeed(value: Int){
        if (speed + value >= 300)
            speed = 300
        else
            speed = speed + value
    }
}

fun main() {
    var auto: Automobile = Automobile()
    auto.upSpeed(250)
    println("์Šน์šฉ์ฐจ์˜ ์†๋„๋Š” " + auto.speed + "km์ž…๋‹ˆ๋‹ค.")
}

// ๊ฒฐ๊ณผ
// ์Šน์šฉ์ฐจ์˜ ์†๋„๋Š” 250km์ž…๋‹ˆ๋‹ค.

 

ํด๋ž˜์Šค ์ƒ์† - ์ถ”์ƒํด๋ž˜์Šค์™€ ๋ฉ”์†Œ๋“œ

- ์ถ”์ƒ(abstract) ํด๋ž˜์Šค

    - ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ถˆ๊ฐ€

    - ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ํด๋ž˜์Šค ์•ž์— abstract ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์„œ ์ง€์ •ํ•จ

    - ์ธ์Šคํ„ด์Šคํ™”๋ž€

var myCar1: Car = Car("๋นจ๊ฐ•", 0)
var myCar2: Car = Car("์ดˆ๋ก", 0)
var myCar3: Car = Car("ํŒŒ๋ž‘", 0)

var auto: Automobile = Automobile()

 

- ์ถ”์ƒ ๋ฉ”์†Œ๋“œ

    - ๋ณธ์ฒด๊ฐ€ ์—†๋Š” ๋ฉ”์†Œ๋“œ

    - ๋ฉ”์†Œ๋“œ ์•ž์— abstract ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์„œ ์ง€์ •

        - ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ํด๋ž˜์Šค๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ์ง€์ •ํ•ด์•ผ ํ•จ

 

- ์ถ”์ƒ ํด๋ž˜์Šค์™€ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์ 

    - ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋กœ ์„ ์–ธ ํ•ด๋†“๊ณ , ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ํ›„์— ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•จ

    - ‘๊ตฌํ˜„ํ•œ๋‹ค(implement)’ : ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•จ

    - ๋™๋ฌผ ํด๋ž˜์Šค๋ฅผ ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค๊ณ  ์ถ”์ƒ ๋ฉ”์†Œ๋“œ์ธ ‘์ด๋™ํ•œ๋‹ค( )’๋ฅผ ํฌํ•จํ•จ

abstract class Animal {
    var name: String = ""
    abstract fun move()
}

class Tiger: Animal(){
    var age: Int = 0
    override fun move(){
        println("๋„ค ๋ฐœ๋กœ ์ด๋™ํ•œ๋‹ค.")
    }
}

class Eagle: Animal(){
    var home: String = ""
    override fun move(){
        println("๋‚ ๊ฐœ๋กœ ๋‚ ์•„๊ฐ„๋‹ค.")
    }
}

fun main() {
    var tiger1 = Tiger()    // var tiger1 = Animal()์€ ๋ถˆ๊ฐ€, ์ถ”์ƒ ํด๋ž˜์Šค์ด๋ฏ€๋กœ 
    var eagle1 = Eagle()

    tiger1.move()
    eagle1.move()
}

 

ํด๋ž˜์Šค ์ƒ์† - ํด๋ž˜์Šค ๋ณ€์ˆ˜์˜ ๋‹คํ˜•์„ฑ

- ๋‹คํ˜•์„ฑ(polymorphism)

    - ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ์ƒ์„ฑํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ž์‹ ์˜ ํด๋ž˜์Šค ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•จ

    - ํ•˜๋‚˜์˜ ๋ณ€์ˆ˜์— ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋Œ€์ž…ํ•  ์ˆ˜ ์žˆ์Œ

// ์œ„ ์ฝ”๋“œ์˜ Animal, Tiger, Eagle ํด๋ž˜์Šค์™€ ๋™์ผ

fun main() {
    var animal: Animal  // animal: ํด๋ž˜์Šค ๋ณ€์ˆ˜

    animal = Tiger()
    animal.move()

    animal = Eagle()
    animal.move()
}

 

ํด๋ž˜์Šค ์ƒ์† - ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋‹ค์ค‘ ์ƒ์†

- ์ธํ„ฐํŽ˜์ด์Šค(interface)

    - ์ถ”์ƒ ํด๋ž˜์Šค์™€ ์„ฑ๊ฒฉ์ด ๋น„์Šทํ•จ

    - interface ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•˜๊ณ  ๋‚ด๋ถ€์—๋Š” ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ์–ธํ•จ

    - ํด๋ž˜์Šค์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐ›์•„ ์™„์„ฑํ•  ๋•Œ ์ƒ์†๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ‘ : ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„ ํ˜•์‹์„ ์‚ฌ์šฉํ•จ

    - ์ธํ„ฐํŽ˜์ด์Šค๋Š” ‘์ƒ์†๋ฐ›๋Š”๋‹ค’๊ณ  ํ•˜์ง€ ์•Š๊ณ  ‘๊ตฌํ˜„ํ•œ๋‹ค’๊ณ  ํ•จ

    - Kotlin์€ ๋‹ค์ค‘ ์ƒ์†์„ ์ง€์›ํ•˜์ง€ ์•Š์Œ

        - ๋Œ€์‹  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์ค‘ ์ƒ์†๊ณผ ๋น„์Šทํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Œ

abstract class Animal {
    var name: String = ""
    abstract fun move()
}

interface iAnimal{
    abstract fun eat()
}

class iCat: iAnimal{
    override fun eat(){
        println("์ƒ์„ ์„ ์ข‹์•„ํ•œ๋‹ค.")
    }
}

class iTiger: Animal(), iAnimal{
    override fun move() {
        println("๋„ค ๋ฐœ๋กœ ์ด๋™ํ•œ๋‹ค.")
    }

    override fun eat() {
        println("๋ฉง๋ผ์ง€๋ฅผ ์žก์•„๋จน๋Š”๋‹ค.")
    }
}

class Eagle: Animal(){
    var home: String = ""
    override fun move(){
        println("๋‚ ๊ฐœ๋กœ ๋‚ ์•„๊ฐ„๋‹ค.")
    }
}

fun main() {
    var cat = iCat()
    cat.eat()

    var tiger = iTiger()
    tiger.move()
    tiger.eat()
}

// ๊ฒฐ๊ณผ
// ์ƒ์„ ์„ ์ข‹์•„ํ•œ๋‹ค.
// ๋„ค ๋ฐœ๋กœ ์ด๋™ํ•œ๋‹ค.
// ๋ฉง๋ผ์ง€๋ฅผ ์žก์•„๋จน๋Š”๋‹ค.

 


์ถ”๊ฐ€์ ์ธ ๋ฌธ๋ฒ•

ํ”„๋กœ์ ํŠธ, ๋ชจ๋“ˆ, ํŒจํ‚ค์ง€

ํ”„๋กœ์ ํŠธ, ๋ชจ๋“ˆ, ํŒจํ‚ค์ง€, ํŒŒ์ผ์˜ ๊ด€๊ณ„

๋ชจ๋“ˆ: ํŒจํ‚ค์ง€๋“ค์˜ ๋ฌถ์Œ

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํŒจํ‚ค์ง€: default, ์•„๋ฌด๊ฒƒ๋„ ์“ฐ์ง€ ์•Š์•„๋„ ๊ธฐ๋ณธ ์ƒ์„ฑ๋จ

 

ํŒจํ‚ค์ง€

- ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋งŽ์•„์ง€๋ฉด ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ํŒจํ‚ค์ง€ ๋‹จ์œ„๋กœ ๋ฌถ์–ด์„œ ๊ด€๋ฆฌํ•จ

- ์‚ฌ์šฉ์ž๊ฐ€ ์ƒ์„ฑํ•œ ํด๋ž˜์Šค๊ฐ€ ํฌํ•จ๋  ํŒจํ‚ค์ง€๋Š” *.kt ํŒŒ์ผ ์ฒซ ํ–‰์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ง€์ •

package ํŒจํ‚ค์ง€๋ช…

- ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์ œ๊ณตํ•˜๋Š” ํŒจํ‚ค์ง€ ๋ชฉ๋ก ํ™•์ธ ๋งํฌ: https://developer.android.com/reference/kotlin/packages

- ์ž๋ฐ” ํ”„๋กœ์ ํŠธ์ฒ˜๋Ÿผ ๋””๋ ‰ํ„ฐ๋ฆฌ์™€ ๋งค์น˜ ๋˜์–ด์•ผ ํ•˜์ง€๋Š” ์•Š์Œ

package com.example.edu

class Person(val name: String, val age: Int)
...

- ํŒจํ‚ค์ง€๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ด๋ฆ„์ด ์—†๋Š” ๊ธฐ๋ณธ(default) ํŒจํ‚ค์ง€ ํฌํ•จ

- import์˜ ์ด๋ฆ„์ด ์ถฉ๋Œํ•˜๋ฉด as ํ‚ค์›Œ๋“œ๋กœ ๋กœ์ปฌ์—์„œ ์‚ฌ์šฉํ•  ์ด๋ฆ„์„ ๋ณ€๊ฒฝ ํ›„ ์‚ฌ์šฉ

import com.example.edu.Person
import com.example.edu.Person as User 
// com.example.edu.Person์„ User๋กœ ์ง€์ •

- import๋Š” ํด๋ž˜์Šค ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๊ฒƒ๋„ ์ž„ํฌํŠธ ํ•  ์ˆ˜ ์žˆ์Œ

    - ์ตœ์ƒ์œ„๋ ˆ๋ฒจ ํ•จ์ˆ˜์™€ ํ”„๋กœํผํ‹ฐ, ์˜ค๋ธŒ์ ํŠธ ์„ ์–ธ์˜ ํ•จ์ˆ˜์™€ ํ”„๋กœํผํ‹ฐ, ์—ด๊ฑฐํ˜• ์ƒ์ˆ˜

 

- ํŒจํ‚ค์ง€ ์ •์˜

ํŒจํ‚ค์ง€ ์ด๋ฆ„ ์„ค๋ช…
kotlin.*  Any, Int, Double ๋“ฑ ์ฝ”์–ด ํ•จ์ˆ˜์™€ ์ž๋ฃŒํ˜•
kotlin.text.* ๋ฌธ์ž์™€ ๊ด€๋ จ๋œ API
kotlin.sequences.* ์ปฌ๋ ‰์…˜ ์ž๋ฃŒํ˜•์˜ ํ•˜๋‚˜๋กœ ๋ฐ˜๋ณต์ด ํ—ˆ์šฉ๋˜๋Š” ๊ฐœ์ฒด๋ฅผ ์—ด๊ฑฐ
kotlin.ranges.* If๋ฌธ์ด๋‚˜ for๋ฌธ์—์„œ ์‚ฌ์šฉํ•  ๋ฒ”์œ„ ๊ด€๋ จ ์š”์†Œ
kotlin.io.* ์ž…์ถœ๋ ฅ ๊ด€๋ จ API
kotlin.collections.* List, Set, Map ๋“ฑ์˜ ์ปฌ๋ ‰์…˜
kotlin.annotation.* ์• ๋…ธํ…Œ์ด์…˜ ๊ด€๋ จ API

 

์ œ๋„ค๋ฆญ์Šค(Generics)

: ๋ฐ์ดํ„ฐ ํ˜•์‹์˜ ์•ˆ์ „์„ฑ์„ ๋ณด์žฅ

- ์ œ๋„ค๋ฆญ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ strList์— ๋ฌธ์ž์—ด๋งŒ ๋“ค์–ด๊ฐ€๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ

    - ๋‹ค์Œ ์ฝ”๋“œ์˜ ๋งˆ์ง€๋ง‰ ํ–‰์€ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ

var strList = ArrayList<String>(4)
strList.add("์ฒซ ๋ฒˆ์งธ")
strList.add("๋‘ ๋ฒˆ์งธ")
strList.add(3)

    - ์ œ๋„ค๋ฆญ์Šค๋Š” <String>๋ฟ ์•„๋‹ˆ๋ผ <Int>, <Double> ๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

    - ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ํด๋ž˜์Šค ํ˜•์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

 

try ~ catch

- ์˜ˆ์™ธ(exception)

: Kotlin ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘์— ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋กœ ์‹คํ–‰ ๋„์ค‘์˜ ์ž ์žฌ์ ์ธ ์˜ค๋ฅ˜๊นŒ์ง€ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰์ด ๋˜๋‹ค๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜๋Š” ๊ฒฝ์šฐ

    - ์šด์˜์ฒด์ œ์˜ ๋ฌธ์ œ (์ž˜๋ชป๋œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์˜ ๋ฌธ์ œ)

    - ์ž…๋ ฅ๊ฐ’์˜ ๋ฌธ์ œ (์กด์žฌํ•˜์ง€ ์•Š๋Š” ํŒŒ์ผ ํ˜น์€, ์ˆซ์ž ์ž…๋ ฅ๋ž€์— ๋ฌธ์ž ์ž…๋ ฅ ๋“ฑ)

    - ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์—†๋Š” ์—ฐ์‚ฐ (0์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ ๋“ฑ)

    - ๋ฉ”๋ชจ๋ฆฌ์˜ ํ• ๋‹น ์‹คํŒจ ๋ฐ ๋ถ€์กฑ

    - ์ปดํ“จํ„ฐ ๊ธฐ๊ณ„ ์ž์ฒด์˜ ๋ฌธ์ œ (์ „์› ๋ฌธ์ œ, ๋ง๊ฐ€์ง„ ๊ธฐ์–ต ์žฅ์น˜ ๋“ฑ)

try {
	// ์˜ˆ์™ธ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ ์žˆ๋Š” ๋ฌธ์žฅ
} catch (e: ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํด๋ž˜์Šค๋ช…) {
	// ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ์žฅ
} finally {
	// ๋ฐ˜๋“œ์‹œ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๋ฌธ์žฅ
}

 

fun main() {
    var num1: Int = 1000
    var num2: Int = 0
    try {
        println(num1/num2)
    } catch (e: ArithmeticException){
        println("๊ณ„์‚ฐ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค")
    }
}

 

fun main() {
    val a = 6
    val b = 0
    val c: Int

    try {
        c = a/b
    } catch (e: Exception){
        println("Exception is handled")
    } finally {
        println("finally ๋ธ”๋ก์€ ๋ฐ˜๋“œ์‹œ ํ•ญ์ƒ ์‹คํ–‰๋จ")
    }
}

// ๊ฒฐ๊ณผ
// Exception is handled
// finally ๋ธ”๋ก์€ ๋ฐ˜๋“œ์‹œ ํ•ญ์ƒ ์‹คํ–‰๋จ

// b๊ฐ€ 0์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์ •์ˆ˜์ผ ๊ฒฝ์šฐ try๋ฌธ๊ณผ finally ๋ฌธ์ด ์‹คํ–‰๋จ

 

๋‚ ์งœ ํ˜•์‹

- DateFormat ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์€ SimpleDate Format ์‚ฌ์šฉ

    - ‘์—ฐ์›”์ผ’์ด๋‚˜ ‘์‹œ๋ถ„์ดˆ’์™€ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•จ

import java.text.DateFormat
import java.text.SimpleDateFormat
import java.util*

fun main(){
	var now = Date()
    var sFormat: SimpleDateFormat
    
    sFormat = SimpleDateFormat("yyyyMMdd")
    sFormat = SimpleDateFormat("HH:mm:ss")
    println(sFormat.format(now)) 	 // 23:15:21 ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅ 
}

 

๊ธฐํƒ€ ํ•จ์ˆ˜

๋ฌธ์ž์—ด ๋น„๊ต

- String ํด๋ž˜์Šค์˜ equals( ) ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ

var str: String = "์•ˆ๋…•ํ•˜์„ธ์š”"
if (str.equals("์•ˆ๋…•ํ•˜์„ธ์š”)) {
    // ๋ฌธ์ž์—ด์ด ๊ฐ™์œผ๋ฉด ์ด๊ณณ์„ ์ˆ˜ํ–‰
}

 

 

๋ฌธ์ž์—ด ๋น„๊ต

- String ํด๋ž˜์Šค์˜ equals( ) ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ

// fun <T, R> T.let(block: (T) -> R): R
val result = str?.let {		// Int
    Integer.parseInt(it)
}

 

with( ) ํ•จ์ˆ˜

- ์ธ์ž๋กœ ๊ฐ์ฒด๋ฅผ ๋ฐ›๊ณ  ๋ธ”๋ก์—์„œ ์ˆ˜ํ–‰๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜

// fun <T, R> with(receiver:T, block T.() -> R): R
with(str) {
    println(toUpperCase())
}

 

apply( ) ํ•จ์ˆ˜

- ๋ธ”๋ก์— ์ž๊ธฐ ์ž์‹ ์„ ์ „๋‹ฌํ•˜๊ณ  ์ด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜

// fun <T> T.apply(block: T.() -> Unit): T
val result = car?.apply {
    car.setColor(Color.RED)
    car.setPrice(1000)
}

 

run( ) ํ•จ์ˆ˜

- ์ต๋ช…ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ๋ธ”๋ก์— ์ž๊ธฐ ์ž์‹ ์„ ์ „๋‹ฌํ•˜๊ณ  ์ˆ˜ํ–‰๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜

// fun <R> run(block: () -> R): R
val avg = run {
    val korean = 100
    val english = 80
    val math = 50
    
    (korean + english + math) / 3.0
}

- ๊ฐ์ฒด์—์„œ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ์ฒด๋ฅผ ๋ธ”๋ก์˜ ๋ฆฌ์‹œ๋ฒ„ ๊ฐ์ฒด๋กœ ์ „๋‹ฌํ•˜๊ณ  ๋ธ”๋ก์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•จ

- ์•ˆ์ „ํ•œ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ with ( ) ํ•จ์ˆ˜๋ณด๋‹ค๋Š” ๋” ์œ ์šฉํ•จ

// fun <T, R> T.run(block: T.() -> R): R
str?.run {
    println(toUpperCase())
}

 

์ปฌ๋ ‰์…˜

๋ฆฌ์ŠคํŠธ

- ๋ฐฐ์—ด๊ฐ™์€ ์ž๋ฃŒํ˜•์˜ ๋ฐ์ดํ„ฐ๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ

- ์ค‘๋ณต๋œ์•„์ดํ…œ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ  ์ถ”๊ฐ€, ์‚ญ์ œ, ๊ต์ฒด ๋“ฑ์ด ์‰ฌ์›€

// ์š”์†Œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ์ฝ๊ธฐ ์ „์šฉ ๋ฆฌ์ŠคํŠธ๋Š” listOf() ๋ฉ”์„œ๋“œ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Œ
val foods: List<String> = listOf("๋ผ๋ฉด", "๊ฐˆ๋น„", "๋ฐฅ")

// ํ˜•์ถ”๋ก ์œผ๋กœ ์ž๋ฃŒํ˜•์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Œ
val foods = listOf("๋ผ๋ฉด", "๊ฐˆ๋น„", "๋ฐฅ")

// ์š”์†Œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๋Š” mutableListOf ( ) ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•จ
val foods = mutableListOf("๋ผ๋ฉด", "๊ฐˆ๋น„", "๋ฐฅ")

foods.add("์ดˆ๋ฐฅ")       // ์ดˆ๋ฐฅ์„ ๋งจ ๋’ค์— ์ถ”๊ฐ€
foods.removeAt(0)      // ๋งจ ์•ž์˜ ์•„์ดํ…œ ์‚ญ์ œ
foods[1] = "๋ถ€๋Œ€์ฐŒ๊ฐœ"   // foods.set(1, "๋ถ€๋Œ€์ฐŒ๊ฐœ") (1๋ฒˆ์งธ ์•„์ดํ…œ์„ ๋ถ€๋Œ€์ฐŒ๊ฐœ๋กœ ๋ณ€๊ฒฝ)

println(foods)  	// [๊ฐˆ๋น„, ๋ถ€๋Œ€์ฐŒ๊ฐœ, ์ดˆ๋ฐฅ]
println(foods[0])   // ๊ฐˆ๋น„
println(foods[1])   // ๋ถ€๋Œ€์ฐŒ๊ฐœ
println(foods[2])   // ์ดˆ๋ฐฅ

 

๋งต

- ํ‚คkey์™€ ๊ฐ’value์˜ ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํ‚ค๊ฐ€ ์ค‘๋ณต๋  ์ˆ˜ ์—†๋Š” ์ž๋ฃŒ๊ตฌ์กฐ

// ๋งต์˜ ์š”์†Œ์— ์ ‘๊ทผํ•  ๋•Œ๋Š” ๋Œ€๊ด„ํ˜ธ ์•ˆ์— ํ‚คkey๋ฅผ ์š”์†Œ๋ช…์œผ๋กœ ์ž‘์„ฑํ•˜์—ฌ ์ ‘๊ทผ
// ์ฝ๊ธฐ ์ „์šฉ ๋งต
val map = mapOf("a" to 1, "b" to 2, "c" to 3)

// ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋งต
val citiesMap = mutableMapOf("ํ•œ๊ตญ" to "์„œ์šธ". "์ผ๋ณธ" to "๋™๊ฒฝ", "์ค‘๊ตญ" to "๋ถ๊ฒฝ")

// ์š”์†Œ์— ๋ฎ์–ด์“ฐ๊ธฐ
citiesMap["ํ•œ๊ตญ"] = "์„œ์šธํŠน๋ณ„์‹œ"
// ์ถ”๊ฐ€
citiesMap["๋ฏธ๊ตญ"] = "์›Œ์‹ฑํ„ด"
        
        
// ๋งต ์ „์ฒด์˜ ํ‚ค์™€ ๊ฐ’์„ ํƒ์ƒ‰ํ•  ๋•Œ๋Š” ๊ฐ„๋‹จํžˆ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Œ
// ๋งต์˜ ํ‚ค์™€ ๊ฐ’์„ ํƒ์ƒ‰
for((k, v) in map){
    println("$k -> $v")
}

 

์ง‘ํ•ฉ

- ์ง‘ํ•ฉset์€ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ์š”์†Œ๋“ค๋กœ ๊ตฌ์„ฑ๋œ ์ž๋ฃŒ๊ตฌ์กฐ

- setOf ( ) ๋ฉ”์„œ๋“œ๋กœ ์ฝ๊ธฐ ์ „์šฉ ์ง‘ํ•ฉ์„ mutableSetOf( ) ๋ฉ”์„œ๋“œ๋กœ ์ˆ˜์ • ๊ฐ€๋Šฅํ•œ ์ง‘ํ•ฉ ์ƒ์„ฑ

// ์ฝ๊ธฐ ์ „์šฉ ์ง‘ํ•ฉ
val citySet = setOf("์„œ์šธ", "์ˆ˜์›", "๋ถ€์‚ฐ")

// ์ˆ˜์ • ๊ฐ€๋Šฅํ•œ ์ง‘ํ•ฉ
val citySet2 = mutableSetOf("์„œ์šธ", "์ˆ˜์›", "๋ถ€์‚ฐ")
citySet2.add("์•ˆ์–‘")      // [์„œ์šธ, ์ˆ˜์›, ๋ถ€์‚ฐ, ์•ˆ์–‘]
citySet2.add("์•ˆ์–‘")      // [์„œ์šธ, ๋ถ€์‚ฐ, ์•ˆ์–‘]

// ์ง‘ํ•ฉ์˜ ํฌ๊ธฐ
println(citySet2.size)  // 3
// '์„œ์šธ'์ด ์ง‘ํ•ฉ์— ํฌํ•จ๋˜์–ด์žˆ๋Š”์ง€
println(citySet2.contains("์„œ์šธ"))    // true

 

์—ฐ์‚ฐ์ž ์ •๋ฆฌ

์—ฐ์‚ฐ์ž ์„ค๋ช…
+, -, *, /, % ์‚ฌ์น™ ์—ฐ์‚ฐ์ž๋กœ %๋Š” ๋‚˜๋จธ์ง€๊ฐ’์„ ๊ณ„์‚ฐํ•œ๋‹ค.
+, - ๋ถ€ํ˜ธ ์—ฐ์‚ฐ์ž๋กœ ๋ณ€์ˆ˜, ์ˆ˜, ์‹, ์•ž์— ๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค.
= ๋Œ€์ž… ์—ฐ์‚ฐ์ž๋กœ ์˜ค๋ฅธ์ชฝ์„ ์™ผ์ชฝ์— ๋Œ€์ž…ํ•œ๋‹ค.
++, -- 1์”ฉ ์ฆ๊ฐ€ ๋˜๋Š” ๊ฐ์†Œ์‹œํ‚จ๋‹ค.
==, ===, !=, !==, <, >, <=, >= ๋น„๊ต ์—ฐ์‚ฐ์ž๋กœ ๊ฒฐ๊ณผ๋Š” true ๋˜๋Š” false์ด๋ฉฐ, if ๋ฌธ์ด๋‚˜ ๋ฐ˜๋ณต๋ฌธ์˜ ์กฐ๊ฑด์‹์— ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
&&, ||, ! ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž๋กœ and, or, not์„ ์˜๋ฏธํ•œ๋‹ค.
and, or, xor, inv() ๋น„ํŠธ ์—ฐ์‚ฐ์ž๋กœ, ๋น„ํŠธ ๋‹จ์œ„๋กœ  and, or, exclusive or, not ์—ฐ์‚ฐ์„ ํ•œ๋‹ค.
shr, shi ์‹œํ”„ํŠธ ์—ฐ์‚ฐ์ž๋กœ, ๋น„ํŠธ ๋‹จ์œ„๋กœ ์™ผ์ชฝ ๋˜๋Š” ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ํ•œ๋‹ค.
+=, -=, *=, /= ๋ณตํ•ฉ ๋Œ€์ž… ์—ฐ์‚ฐ์ž๋กœ, 'a += b'๋Š” 'a = a+b'์™€ ๋™์ผํ•˜๋‹ค. 
toByte(), toShort(), toInt(), toLong(), toFloat(), toDouble(), toChar() ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ๊ฐ•์ œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 'var a: Int = (3.14).toInt()'๋Š” Doubleํ˜•์ธ 3.14 ๊ฐ’์„ intํ˜•์œผ๋กœ ๊ฐ•์ œ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ a์— ๋Œ€์ž…ํ•œ๋‹ค. ์ฆ‰ a์— 3์ด ๋Œ€์ž…๋œ๋‹ค.

 

ํ˜•๋ณ€ํ™˜

// ์ˆซ์žํ˜• ์ž๋ฃŒํ˜•๋ผ๋ฆฌ๋Š” to์ž๋ฃŒํ˜•() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜•๋ณ€ํ™˜์ด ๊ฐ€๋Šฅ
val a = 10L
val b = 20

val c = a.toInt()       // Long์„ Int๋กœ
val d = b.toDouble()    // Int๋ฅผ Double๋กœ
val e = a.toString()    // Long์„ String์œผ๋กœ

// ์ˆซ์žํ˜• ๋ฌธ์ž์—ด์„ ์ˆซ์ž๋กœ ๋ฐ”๊ฟ€ ๋•Œ๋Š” Integer.parseInt() ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ
val intStr = "10"
val str = Integer.parseInt(intStr)

// ์ผ๋ฐ˜ ํด๋ž˜์Šค ๊ฐ„์— ํ˜•๋ณ€ํ™˜์„ ํ•˜๋ ค๋ฉด as ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•จ.
open class Animal

class Dog: Animal()

val dog = Dog()

val animal = dog as Animal  // dog๋ฅผ Animalํ˜•์œผ๋กœ ๋ณ€ํ™˜

//
val str = "hello"

if (str is String) {    // str์ด Stringํ˜•์ด๋ผ๋ฉด
    println(str.toUpperCase())
}