λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μ–Έμ–΄/Kotlin

[Kotlin 문법 μ’…ν•©] - μ˜€λ²„λΌμ΄λ”©, μ˜€λ²„λ‘œλ”© # μˆ˜μ •ν•˜κΈ°

by μ Όμ Ό39 2024. 3. 5.

 

 

1. μ˜€λ²„λΌμ΄λ”©

    : 상속받은 λΆ€λͺ¨ν΄λž˜μŠ€μ˜ 정보(ν”„λ‘œνΌν‹°)λ‚˜ ν–‰μœ„(λ©”μ†Œλ“œ) μž¬μ„€κ³„
    = λ¦¬λ””νŒŒμΈ...?

    - λ°›λŠ” 인자의 개수, νƒ€μž… κ°™μŒ
    - λΆ€λͺ¨ 클래슀의 λ©”μ†Œλ“œμ™€ 같은 이름을 κ°€μ§„ ν•˜λ‚˜μ˜ ν•¨μˆ˜λ§Œμ„ 가짐
          = λΆ€λͺ¨ 클래슀의 λ©”μ†Œλ“œμ™€λŠ” λ‹€λ₯Έ λ©”μ†Œλ“œκ°€ 된 것  

    (+) μžμ‹ 클래슀만의 정보, λ™μž‘μ„ λ§Œλ“€ 수 있음
    (+) μž¬μ‚¬μš©μ„±, 일관성 λ“±μ˜ μž₯점 μœ μ§€

    *μ˜€λ²„λΌμ΄λ”© 단좕킀
        Control + O

fun main() {
    var bird = Bird("μƒˆ")
    var chicken = Chicken("λ‹­", 2)

    bird.fly()
    chicken.fly()
}

open class Bird(name:String) { 		//open μž‘μ„±
    var name: String = ""

    init {
        this.name = name
    }

    open fun fly() { 		//λ©”μ†Œλ“œμ—μ„œλ„ open을 μ¨μ•Όν•˜λŠ”λ“―
        println("${name}은 λ‚ μ•„μš”~")
    }
}

class Chicken(name: String, age: Int) : Bird(name) {
    var age:Int = 0

    init { 		//λΆ€λͺ¨ν΄λž˜μŠ€μ— init μžˆμœΌλ‹ˆ 여기도..?
        this.age = age
    }

    override fun fly() {
//        λΆ€λͺ¨κ°μ²΄μ˜ flyλ©”μ†Œλ“œλ₯Ό λΆ€λ₯΄λŠ” ν–‰μœ„μž„. 이걸 ν¬ν•¨ν•˜λ €λ©΄ μž‘μ„±ν•˜κΈ°
//        super.fly() 		
        println("${age}μ‚΄μ˜ ${name}κ°€ λ‚ μ•„λ΄…λ‹ˆλ‹€~ 꼬끼였!")
    }
}

   

*super μ•ˆ μ“°λŠ” 이유λ₯Ό 더 μ°Ύμ•„λ΄€λŠ”λ°

        // super.λ©”μ„œλ“œμ΄λ¦„() --> λ‚΄λΆ€μ μœΌλ‘œ μƒμ†λ°›μœΌλ©΄ μžλ™μœΌλ‘œ λ§Œλ“€μ–΄μ§€λŠ” λΆ€λͺ¨κ°μ²΄. = λΆ€λͺ¨κ°μ²΄μ˜ λ©”μ„œλ“œλ₯Ό 뢈러라
        //그럼 μ˜€λ²„λ‘œλ”© ν›„μ—λŠ” super μ“°λ‚˜? ν™•μΈν•˜κΈ°@@@ --> λ”±νžˆ μ“°μ§€ μ•Šμ•„λ„... λ‹€λ₯Έ λ©”μ†Œλ“œκ°€ μžˆλ”λΌ. μžλ°”λ‘œ λ°”κΎΈλ©΄ λ‚˜νƒ€λ‚˜λ˜λ°

μ½”ν‹€λ¦°μ—μ„œλŠ” `super` ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λΆ€λͺ¨ ν΄λž˜μŠ€μ˜ μƒμ„±μžλ‚˜ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  ν•„μš”κ°€ μ—†λŠ” κ²½μš°κ°€ μžˆλŠ”λ°, 
κ·Έ μ΄μœ λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

1. **κΈ°λ³Έ μƒμ„±μž ν˜ΈμΆœ**: 
  μžμ‹ ν΄λž˜μŠ€κ°€ λΆ€λͺ¨ 클래슀λ₯Ό 상속받을 λ•Œ, λΆ€λͺ¨ 클래슀의 κΈ°λ³Έ μƒμ„±μžκ°€ ν˜ΈμΆœλ©λ‹ˆλ‹€.
  μ΄λŠ” μ½”ν‹€λ¦°μ—μ„œ 기본적으둜 μ œκ³΅λ˜λŠ” λ™μž‘μž…λ‹ˆλ‹€.
  λ”°λΌμ„œ λŒ€λΆ€λΆ„μ˜ κ²½μš°μ—λŠ” λͺ…μ‹œμ μœΌλ‘œ `super` ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€.

2. **λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©**:
  λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ“œν•  λ•Œμ—λ„ `super` ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€.
  λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ €λ©΄ `super`λ₯Ό μ‚¬μš©ν•  수 μžˆμ§€λ§Œ,
  κ·Έλ ‡μ§€ μ•Šμ€ κ²½μš°μ—λŠ” μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ“œλœ λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ©λ‹ˆλ‹€.

3. **λΆ€λͺ¨ 클래슀 μƒμ„±μž 호좜**:
  λ§Œμ•½ μžμ‹ ν΄λž˜μŠ€κ°€ λΆ€λͺ¨ 클래슀의 μƒμ„±μžλ₯Ό μ˜€λ²„λΌμ΄λ“œν•˜κ±°λ‚˜ 좔가적인 μƒμ„±μžλ₯Ό μ •μ˜ν•  λ•Œμ—λŠ”
  `super` ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λΆ€λͺ¨ 클래슀의 μƒμ„±μžλ₯Ό λͺ…μ‹œμ μœΌλ‘œ ν˜ΈμΆœν•΄μ•Ό ν•©λ‹ˆλ‹€.
  ν•˜μ§€λ§Œ μ½”ν‹€λ¦°μ—μ„œλŠ” μƒμ„±μž ν˜ΈμΆœμ„ κ°„λ‹¨νžˆ μ²˜λ¦¬ν•˜κΈ° λ•Œλ¬Έμ—,
  `super` ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³ λ„ λΆ€λͺ¨ 클래슀의 μƒμ„±μžκ°€ μžλ™μœΌλ‘œ ν˜ΈμΆœλ©λ‹ˆλ‹€.

결둠적으둜, 코틀린은 λͺ…μ‹œμ μΈ `super` ν˜ΈμΆœμ„ μ΅œμ†Œν™”ν•˜μ—¬ μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ²Œ λ§Œλ“€ 수 μžˆλ„λ‘ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
λ”°λΌμ„œ λŒ€λΆ€λΆ„μ˜ κ²½μš°μ—λŠ” `super`λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€.

       (...λΌλŠ”λ° 이건 쑰금 더 λΉ„κ΅ν•΄μ„œ 정리해야할 λ“―. μžλ°”λž‘ c++μ΄λž‘ λ‹€ μ„žμ—¬μ„œ 뒀죽박죽이넀)

 

    - object ν‘œν˜„μ‹μ„ μ‚¬μš©ν•΄ ν•˜μœ„ 클래슀 λ§Œλ“€μ§€ μ•Šκ³  클래슀의 νŠΉμ • λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©ν•˜κΈ°

        //읡λͺ… 객체 : 이름이 μ—†λŠ” 클래슀 μΈμŠ€ν„΄μŠ€ λ§Œλ“€κΈ°.

open class Hero(){
    fun work() = println("working")
    open fun fly() = println("flying")
}

fun main(){
    val person = object: Hero(){ 	//object ν‘œν˜„μ‹μœΌλ‘œ fly() κ΅¬ν˜„μ˜ μž¬μ •μ˜
        override fun fly() = println("not flying")
    }
    person.work()
    person.fly()    
}

//working
//not flying

        (1) ν™œμš©μ‚¬λ‘€ 1

window.addMouseListener(object: MouseAdapter){
    override fun mouseClicked(e: MouseEvent){
        ...	
    }
    override fun mouseEntered(e: MouseEvent){
        ...
    }
}


    - object: MouseAdapterλΌλŠ” ꡬ문은 MouseAdapter 클래슀λ₯Ό μƒμ†ν•˜λŠ” 읡λͺ… 객체λ₯Ό 생성.
                (MouseAdapter ν΄λž˜μŠ€λŠ” MouseListener μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„μ„ μ œκ³΅ν•˜λŠ” 좔상 클래슀)

읡λͺ… 객체λ₯Ό μƒμ„±ν•¨μœΌλ‘œμ¨, ν•„μš”ν•œ λ©”μ„œλ“œλ§Œ μ˜€λ²„λΌμ΄λ“œν•˜μ—¬ ν•΄λ‹Ή 이벀트λ₯Ό μ²˜λ¦¬ν•  수 있음.
(μœ„μ˜ μ½”λ“œμ—μ„œλŠ” mouseClicked와 mouseEntered λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œν•˜μ—¬ 각각 마우슀 클릭 및 μ§„μž… 이벀트λ₯Ό μ²˜λ¦¬ν•¨)

MouseListener μΈν„°νŽ˜μ΄μŠ€λ₯Ό 직접 κ΅¬ν˜„ν•˜λŠ” λŒ€μ‹  읡λͺ… 객체λ₯Ό μ‚¬μš©ν•˜μ—¬ 더 κ°„κ²°ν•˜κ²Œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 있음

        (2) ν™œμš©μ‚¬λ‘€ 2 - 단 ν•œ 번 μ‚¬μš©ν•  μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„ 클래슀 μ •μ˜ 없이 μ‚¬μš©ν•˜κΈ°

interface Shape{
    fun onDraw() 		//κ΅¬ν˜„ν•΄μ•Ό ν•  λ©”μ„œλ“œ
}

val triangle = object: Shape{
    override fun onDraw(){
        //μ—¬κΈ°μ„œ 단 ν•œ 번 κ΅¬ν˜„ν•¨
    }
}

        (3) ν™œμš©μ‚¬λ‘€ 3 - κ°μ²΄λŠ” ν•„μš”ν•˜μ§€λ§Œ μƒμœ„ μΈν„°νŽ˜μ΄μŠ€, ν΄λž˜μŠ€κ°€ μ—†λŠ” 경우

fun foo(){
    val adHoc = object{
        var x: Int = 0
        var y: Int = 0
    }
    print(adHoc.x + adHoc.y)
}

 

 

2. μ˜€λ²„λ‘œλ”©

    : λ§€κ°œλ³€μˆ˜μ˜ 개수, μžλ£Œν˜•μ„ λ‹€λ₯΄κ²Œ ν•΄ 동λͺ…μ˜ λ‹€λ₯Έ λ©”μ†Œλ“œλ₯Ό λ§Œλ“ λ‹€
        //λ°˜ν™˜μžλ£Œν˜•μ€ μ˜€λ²„λ‘œλ”©μ— 영ν–₯을 μ£Όμ§€ μ•ŠμŒ

    - λ°›λŠ” 인자, 개수 등이 달라짐
          //λ§€κ°œλ³€μˆ˜μ˜ 개수 등에 따라 μ–΄λŠκ²ƒμ΄ 쓰일지가 결정됨
    - 상속 κ΄€λ ¨ --> μžμ‹ ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ 클래슀의 ν•¨μˆ˜μ™€ 같은 이름을 κ°€μ§„ 두 개의 ν•¨μˆ˜λ₯Ό 가짐
          //ν•˜λ‚˜λŠ” λΆ€λͺ¨ ν΄λž˜μŠ€μ— μ •μ˜λ˜μ–΄μžˆκ³ , λ‚˜λ¨Έμ§€λŠ” μžμ‹ ν΄λž˜μŠ€μ— μ •μ˜λ¨
    

fun main() {
    var calc = Calculator() 	//객체 λ§Œλ“€κΈ°
    
    var intResult = calc.add(1,2)
    var doubleResult = calc.add(1.2, 2.2)
    
    println("μ •μˆ˜ λ§μ…ˆκ²°κ³Ό: ${intResult}")
    println("μ‹€μˆ˜ λ§μ…ˆκ²°κ³Ό: ${doubleResult}")
    
}

class Calculator {
    
    fun add(num1: Int, num2: Int): Int {
        return num1+num2
    }
    
    fun add(num1: Double, num2: Double): Double {
        return num1+num2
    }
}
class Point(var x: Int = 0, var y: Int = 10) {
    // plus ν•¨μˆ˜μ˜ μ—°μ‚°μž μ˜€λ²„λ‘œλ”©
    operator fun plus(p: Point) : Point {
        return Point(x + p.x, y + p.y)
    }
    operator fun dec() = Point(--x, --y)
}

fun main() {
    val p1 = Point(3, -8)
    val p2 = Point(2, 9)

    var point = Point()
    println(point.y)
    println(p1.x)
    point = p1 + point
    println("point = (${point.x}, ${point.y})")
    point = p1 + p2 // Point 객체의 + 연산이 κ°€λŠ₯ν•˜κ²Œ λ˜μ—ˆλ‹€.
    println("point = (${point.x}, ${point.y})")
    --point // -- μ—°μ‚°μž
    println("point = (${point.x}, ${point.y})")

}


10
3
point = (3, 2)
point = (5, 1)
point = (4, 0)