240604_TIL

2024. 6. 4. 20:55TIL(Today I Learned)

# 상속

- 다형성을 구현할 수 있음

- 클래스의 내용을 변경해야 하는 경우 부모 클래스만 변경하는 것으로 공수 줄일 수 있음

 

fun main() {
    var bird = Bird()
    var chicken = Chicken()
    var sparrow = Sparrow()
    var pigeon = Pigeon()

    bird.fly()
    chicken.fly()
    sparrow.fly()
    pigeon.fly()
}

open class Bird {
    fun fly() {
        println("새는 날아요~")
    }
}

class Chicken : Bird() {

}

class Sparrow : Bird() {

}

class Pigeon : Bird() {

}

 

* 수퍼클래스에스 생성자를 활용하는 경우에는 서브 클래스에 객체 생성 시 전달해줘야 함

fun main() {
    var bird = Bird("새")
    var chicken = Chicken("닭")
    var sparrow = Sparrow("참새")
    var pigeon = Pigeon("비둘기")

    bird.fly()
    chicken.fly()
    sparrow.fly()
    pigeon.fly()
}

open class Bird(name:String) {
    var name: String = ""

    init {
        // this는 현재 클래스의 상태변수를 의미합니다
        // var name: String = ""
        this.name = name
    }

    fun fly() {
        println("${name} 날아요~")
    }

}

class Chicken(name: String) : Bird(name) {

}

class Sparrow(name: String) : Bird(name) {

}

class Pigeon(name: String) : Bird(name) {

}

서브클래스의 name에 들어온 값 => Bird의 name 값 => init => this

 

# 오버라이딩

- 수퍼클래스의 정보나 행위를 재설계 가능

- 주로 수퍼클래스의 행위를 재설계

- 공통적인 내용은 수퍼클래스에서 살리고, 각 서브클래스의 개성을 살리고 싶을 때 사용

* 단축키 ctrl + O : 오버라이딩할 수 있는 메소드 리스트 안내

 

fun main() {
    var bird = Bird("새")
    var chicken = Chicken("닭", 2)
    var sparrow = Sparrow("참새", "갈색")
    var pigeon = Pigeon("비둘기", "서울")

    bird.fly()
    chicken.fly()
    sparrow.fly()
    pigeon.fly()
}

open class Bird(name:String) {
    var name: String = ""

    init {
        // this는 현재 클래스의 상태변수를 의미합니다
        // var name: String = ""
        this.name = name
    }

    open fun fly() {
        println("${name}은 날아요~")
    }

}

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

    init {
        this.age = age
    }

    override fun fly() {
//        super객체는 부모의 객체를 의미하며 자동으로 생성됨
//        즉 부모객체의 fly메소드를 부르는 행위임
//        필요없으니 주석처리완료
//        super.fly()
        println("${age}살의 ${name}가 날아봅니다~ 꼬끼오!")
    }
}

class Sparrow(name: String, color: String) : Bird(name) {
    var color:String = ""

    init {
        this.color = color
    }

    override fun fly() {
//        super객체는 부모의 객체를 의미하며 자동으로 생성됨
//        즉 부모객체의 fly메소드를 부르는 행위임
//        필요없으니 주석처리완료
//        super.fly()
        println("${color}의 ${name}이 날아봅니다~ 짹짹!")
    }
}

class Pigeon(name: String, address: String) : Bird(name) {
    var address: String = ""

    init {
        this.address = address
    }

    override fun fly() {
//        super객체는 부모의 객체를 의미하며 자동으로 생성됨
//        즉 부모객체의 fly메소드를 부르는 행위임
//        필요없으니 주석처리완료
//        super.fly()
        println("${address} 살고있는 ${name}가 날아봅니다~ 구구!")
    }
}

 

# 오버로딩

- 동일한 이름의 메소드를 여러 형태로 만들 수 있음  

- 매개변수의 개수나 자료형을 다르게 하면 동일한 이름으로 메소드를 만들 수 있음

- 반환형은 오버로딩에 영향 X

- 오버로딩이 필요한 이유:

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

 

# 인터페이스

- 근본적인 기능은 상속, 추가적인 기능들은 인터페이스로 추가할 수 있음

- 메소드의 로직이 없이 이름만 존재할 때 추상 메소드라고 함.

- Ex) 보통 새는 헤엄지는 경우가 없기 때문에 새 수퍼 클래스에 추가하기 어려움이 있으므로, 오리를 포함한 물에서 서식하는 조류에 대한 별도 기능이 필요함

fun main() {
    var bird = Bird("새")
    var chicken = Chicken("닭")
    var sparrow = Sparrow("참새")
    var pigeon = Pigeon("비둘기")
    var duck = Duck("오리")

    bird.fly()
    chicken.fly()
    sparrow.fly()
    pigeon.fly()
    duck.swim()
}

open class Bird(name:String) {
    var name: String = ""

    init {
        // this는 현재 클래스의 상태변수를 의미합니다
        // var name: String = ""
        this.name = name
    }

    fun fly() {
        println("${name} 날아요~")
    }

}

class Chicken(name: String) : Bird(name) {

}

class Sparrow(name: String) : Bird(name) {

}

class Pigeon(name: String) : Bird(name) {

}

class Duck(name: String) : Bird(name), WaterBirdBehavior {
    override fun swim() {
        println("${name}가 수영해요~")
    }
}

 

 

'TIL(Today I Learned)' 카테고리의 다른 글

240612_TIL  (2) 2024.06.12
240605_TIL  (2) 2024.06.05
240603_TIL  (0) 2024.06.03
240531_온보딩 1주차 (4)  (0) 2024.05.31
240530_온보딩 1주차 (3)  (0) 2024.05.30