클래스 - 오버라이딩

황승현·2023년 12월 7일
0

코틀린 강의 정리

목록 보기
18/36
post-thumbnail

오버라이딩

부모 클래스의 정보를 재설계(refactoring)

  • 오버로딩과는 다른 개념!

  • 상속받은 부모 클래스의 정보(프로퍼티)나 행위(메서드)를 재설계하는 기법

  • 주로 부모 클래스의 행위(메서드)를 재설계

  • 오버라이딩이 필요한 이유

    • OOP관점에서는 클래스들간의 관계를 만들고, 일관성을 유지하는 목표를 가진다
    • 부모 클래스를 일일이 수정하면 재사용 및 유지보수가 어렵다.
    • 필요한 기능이 필요할 때마다 클래스를 계속 만들면 일관성을 해친다.

예시 코드

각 개체마다 개성을 더하고 싶다

fun main() {
    var bird = Bird("새") // name만 받아서 클래스 인스턴스화
    var chicken = Chicken("닭", 2) //닭과 2라는 파라미터를 받아서 클래스 인스턴스화
    var sparrow = Sparrow("참새", "갈색")//참새와 갈색이라는 파라미터를 받아서 클래스 인스턴스화
    var pigeon = Pigeon("비둘기", "서울")//비둘기와 서울이라는 파라미터를 받아서 클래스 인스턴스화

    bird.fly() //bird의 fly 메서드 호출
    chicken.fly() //bird의 fly 메서드 호출
    sparrow.fly() //bird의 fly 메서드 호출
    pigeon.fly() //bird의 fly 메서드 호출
}

// 주생성자를 이용한 부모 클래스
open class Bird(name:String) {
    var name: String = ""

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

    open fun fly() { //오버라이딩 하기 위해서 open 키워드 사용
        println("${name}은 날아요~")
    }

}


// Chicken 클래스는 주생성자의 파라미터로 닭과 나이를 받아옮
// 받아온 파라미터 중 닭을 부모 클래스 Bird의 주생성자로 전달
class Chicken(name: String, age: Int) : Bird(name) {
    var age:Int = 0

    init {
        this.age = age
    }

	// 부모 클래스 Bird에 있는 fly 메서드를 내가 원하는 기능으로 수정함
    override fun fly() { //오버라이딩 하기 위해서 override 키워드 사용
//        super객체는 부모의 객체를 의미하며 자동으로 생성됨
//        즉 부모객체의 fly메서드를 부르는 행위임
//        필요없으니 주석처리완료
//        super.fly()
        println("${age}살의 ${name}가 날아봅니다~ 꼬끼오!")
    }
}


// Sparrow 클래스는 주생성자의 파라미터로 참새와 색을 받아옮
// 받아온 파라미터 중 참새를 부모 클래스 Bird의 주생성자로 전달
class Sparrow(name: String, color: String) : Bird(name) {
    var color:String = ""

    init {
        this.color = color
    }

	// 부모 클래스 Bird에 있는 fly 메서드를 내가 원하는 기능으로 수정함	
    override fun fly() { //오버라이딩 하기 위해서 override 키워드 사용
//        super객체는 부모의 객체를 의미하며 자동으로 생성됨
//        즉 부모객체의 fly메서드를 부르는 행위임
//        필요없으니 주석처리완료
//        super.fly()
        println("${color}${name}이 날아봅니다~ 짹짹!")
    }
}


// Pigeon 클래스는 주생성자의 파라미터로 비둘기를 받아옮
// 받아온 파라미터를 부모 클래스 Bird의 주생성자로 전달
class Pigeon(name: String, address: String) : Bird(name) {
    var address: String = ""

    init {
        this.address = address
    }
    
	// 부모 클래스 Bird에 있는 fly 메서드를 내가 원하는 기능으로 수정함	
    override fun fly() { //오버라이딩 하기 위해서 override 키워드 사용
//        super객체는 부모의 객체를 의미하며 자동으로 생성됨
//        즉 부모객체의 fly메서드를 부르는 행위임
//        필요없으니 주석처리완료
//        super.fly()
        println("${address} 살고있는 ${name}가 날아봅니다~ 구구!")
    }
}

0개의 댓글