๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์–ธ์–ด/Kotlin

[Kotlin ๋ฌธ๋ฒ• ์ข…ํ•ฉ] - ์ƒ์„ฑ์ž, ๊ฐ์ฒด (#๋น„๊ต ์ถ”๊ฐ€ํ•˜๊ธฐ) @@ ์งˆ๋ฌธํ•˜๊ธฐ!

by ์ ผ์ ผ39 2024. 3. 5.

 

 

 

 

1. ์ƒ์„ฑ์ž

    : ํด๋ž˜์Šค๋ฅผ ์‹ค์ฒดํ™”ํ•  ๋•Œ ์ตœ์ดˆ๋กœ ์‹คํ–‰ํ•  ๋กœ์ง ์ž‘์„ฑ
        (์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •st... ๋ถ•์–ด๋นต ํ‹€์„ ๊ฐ€์ง€๊ณ  ๋ถ•์–ด๋นต ์ฐ์–ด๋‚ด๋Š”)

    1) ๊ธฐ๋ณธ ์ƒ์„ฑ์ž
        : ํด๋ž˜์Šค ์ด๋ฆ„ ์˜†์— ์ƒ์„ฑ์ž๋ฅผ ์œ„ํ•œ ์ธ์ž๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ์ดˆ๊ธฐํ™” (ํ•จ์ˆ˜์™€ ์œ ์‚ฌ)

class ํด๋ž˜์Šค์ด๋ฆ„1(temp:String){
    var myTemp = temp
}

fun main(){
    val ex1 = ํด๋ž˜์Šค์ด๋ฆ„1("๊ฐ€")
}

    2) ๋ช…์‹œ์  ์ƒ์„ฑ์ž

           (1) ์ฃผ ์ƒ์„ฑ์ž Init
                : { } ์ดˆ๊ธฐํ™” ๋ธ”๋ก ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด ์‹คํ–‰๊ณผ ํ•จ๊ป˜ ์ž๋™์‹คํ–‰๋จ

                - ํ•œ ๊ฐ€์ง€์˜ ํ˜•ํƒœ๋กœ ํด๋ž˜์Šค๋ฅผ ์‹ค์ฒดํ™”ํ•  ๋•Œ 

                - ํด๋ž˜์Šค ์„ ์–ธ๋ถ€์— ์ƒ์„ฑ์ž๋ฅผ ๋ช…์‹œํ•จ
                - ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง์ ‘ ๋„˜๊ธฐ์ง€ ์•Š์Œ

@@@ ํด๋ž˜์Šค ์ด๋ฆ„์˜† ()์— ์ ๋Š” ์ˆœ์„œ๋Œ€๋กœ ํ•„๋“œ์˜ ๋ณ€์ˆ˜๊ฐ€ ์ฑ„์›Œ์ง€๋Š”๊ฑฐ ๋งž๋‚˜?? ->> ์ด๊ฑด ๋‹ค๋ฅธ๊ฑฐ... ์ฝ”๋“œ ์ •๋ฆฌํ•˜๊ธฐ 

// ํด๋ž˜์Šค ์„ ์–ธ๋ถ€์— ์ƒ์„ฑ์ž๋ฅผ ๋ช…์‹œํ•จ
class Character(_name:String, _hairColor:String, _height:Double) {
		//_ ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์ž„์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•œ ํ‘œ์‹œ. this.์ฒ˜๋Ÿผ ๊ตฌ๋ณ„ํ•˜๋Š” ๋„๊ตฌ
    var name:String = ""
    var hairColor:String = ""
    var height:Double = 0.0

		// ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง์ ‘ ๋„˜๊ธฐ์ง€์•Š์Œ
    init {
        println("๋งค๊ฐœ๋ณ€์ˆ˜์—†๋Š” ์ƒ์„ฑ์ž ์‹คํ–‰ ์™„๋ฃŒ!")
    }

    fun fireBall() {
        println("ํŒŒ์ด์–ด๋ณผ!")
    }
    fun compositing(device1:String, device2:String): String {
        var device3 = device1 + device2
        println("์ƒˆ๋กœ์šด ๋ฌด๊ธฐ์ธ ${device3}์ž…๋‹ˆ๋‹ค")
        return device3
    }
}
class ํด๋ž˜์Šค์ด๋ฆ„2(_temp:String){
    var myTemp:String
    
    init{
        myTemp = _temp
    }
}

fun main(){
    val ex2 = ํด๋ž˜์Šค์ด๋ฆ„2("๋‚˜")
}
class Birt(var name:String, var wing:Int, var color:String){
    //๋งค๊ฐœ๋ณ€์ˆ˜ ์•ˆ์— var์„ ์‚ฌ์šฉ, ์„ ์–ธ๋จ!!
    
    fun fly() = println("$wing")
    
}

fun main(){
    val sparrow = Birt("mySparrow", 2, "red")
    sparrow.color = "blue"
    
    println("${sparrow.color}")
    sparrow.fly()
}

 

           (2) ๋ถ€ ์ƒ์„ฑ์ž Constructor             //java๋ž‘ ํ—ท๊ฐˆ๋ฆผ... ๊ฐœ๋… ๋น„๊ตํ•˜๊ธฐ..

                (+) ์ž…๋ ฅ ์ธ์ž ๋”ฐ๋ผ ์—ฌ๋Ÿฌ๊ฐœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ 

class ํด๋ž˜์Šค์ด๋ฆ„3 { 			//ํด๋ž˜์Šค ์ด๋ฆ„ ์˜†์ด ์•„๋‹˜!!
    var myTemp : String
    
    constructor(_temp:String){
        myTemp = _temp
    }
}

fun main(){
    var ex3 = ํด๋ž˜์Šค์ด๋ฆ„3("๋‹ค")
}

 

 

2. ๊ฐ์ฒด

    : ํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ ์‹ค์ฒดํ™”๋œ, ์„ ์–ธ๋œ ๊ฒƒ๋“ค. ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋ฅผ ํฌํ•จ

    - ํด๋ž˜์Šค๋ฅผ ์‹ค์ฒดํ™”ํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌ
    - ์ •๋ณด, ํ–‰์œ„๊ฐ€ ๊ทธ๋Œ€๋กœ ๋กœ๋”ฉ๋˜๋Š” ๊ฒŒ ์•„๋‹˜. ์œ„์น˜์ •๋ณด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋”ฉํ•จ
    - ๊ฐ์ฒด์˜ ์œ„์น˜์ •๋ณด๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅํ•œ ๋’ค, ์ฐธ์กฐํ•จ  

open class Person{
   constructor(firstName: String){ 	
       println("[Person] firstname: $firstName")
   }
   constructor(firstName: String, age: Int){ 			//5๋ฒˆ์งธ
       println("[Person] firstName: $firstName, $age") 		//6๋ฒˆ์งธ
   }
}

class Developer : Person{
    constructor(firstName: String) : this(firstName, 10){ 	//1๋ฒˆ์งธ : 2๋ฒˆ์งธ
        println("[Developer] $firstName") 			//8๋ฒˆ์งธ
    }
    constructor(firstName: String, age: Int) : super(firstName, age){ 	//3๋ฒˆ์งธ : 4๋ฒˆ์งธ
        println("[Developer] $firstName, $age") 			//7๋ฒˆ์งธ
    }
}

fun main(){
    val choi = Developer("Choi") 		// 9๋ฒˆ์งธ = 0๋ฒˆ์งธ
}

//[Person] firstName: Choi, 10
//[Developer] Choi, 10
//[Developer] Choi

//๋งŒ์•ฝ ์ฃผ์ƒ์„ฑ์ž๊ฐ€ ์žˆ๋‹ค๋ฉด this()

class Person(firstName: String, out: Unit = println("[Primary Constructor] Parameter")) {
    val fName = println("[Property] Person fName: $firstName") 	//ํ”„๋กœํผํ‹ฐ์— ์ถœ๋ ฅ๋ฌธ ํ• ๋‹น
    init{
        println("[init] Person init block")
    }
    //๊ทธ๋Ÿผ, ์—ฌ๊ธฐ์„œ ์ฒ ์ด, 20์ด firstName, age์—๋Š” ๋“ค์–ด์™€ ์žˆ๋Š”๊ฑด๊ฐ€?@@ ์ด ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์งˆ ๋ชปํ•˜๋‹ˆ๊นŒ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์•„์„œ ์“ฐ๋Š”๊ฑฐ...?
    constructor(firstName: String, age: Int, out: Unit = println("[Secondary Constructor] Parameter")): this(firstName){
        println("[Secondary Constructor] Body: $firstName, $age")
    }
}

fun main(){
    val p1 = Person("์ฒ ์ด", 20)
    println()
    val p2 = Person("๋ฏธ์• ")
    
}

//[Secondary Constructor] Parameter
//[Primary Constructor] Parameter
//[Property] Person fName: ์ฒ ์ด
//[init] Person init block
//[Secondary Constructor] Body: ์ฒ ์ด, 20

//[Primary Constructor] Parameter
//[Property] Person fName: ๋ฏธ์• 
//[init] Person init block

//out์€ ํ‚ค์›Œ๋“œ ์ธ์ž. ์ธ์ž์— ์ ‘๊ทผํ•  ๋•Œ, ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •๋œ println()์ด ๋™์ž‘ํ•˜๊ฒŒ ๋จ

 

    * ์ต๋ช… ๊ฐ์ฒด

interface Switcher{
    fun on(): String
}

class Smartphone(val model: String){
    
    fun powerOn(): String{
        class Led(Val color: String){
            fun blink(): Stirng = "Blinking $color on $model"
        }
        val powerStatus = Led("Red")
        val powerSwitch = object : Switcher{ 	//์ต๋ช… ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด switcher์˜ on() ๊ตฌํ˜„
            override fun on(): String{
                return powerStatus.blink()
            }
        }//์ต๋ช…(object)๊ฐ์ฒด ๋ธ”๋ก์˜ ๋
    }
}

    - ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„์„ ์ต๋ช… ๊ฐ์ฒด ์•ˆ์—์„œ ํ•ด๋„ ๋จ (๋ฐ–์— ๋”ฐ๋กœ ๋งŒ๋“  ๊ฑธ ๋ฐ›์•„์™€๋„ ใ„ฑใ…Š)