[TIL] 2023.12.01

Gahyeon Lee·2023년 12월 1일
0

TIL

목록 보기
15/47
post-thumbnail

😵‍ 상속

[상속 = 클래스 간의 상속]

  • 클래스(설계도) 간의 관계를 더욱 끈끈하게 만들 수 있다.
  • 공통적인 요소들이 있다면 부모/자식 클래스를 구분해서 상속 관계를 만들 수 있다.
  • 코틀린은 무분별한 상속으로 예상치 못한 흐름을 방지하기 위해 다른 언어들과 달리 생략된 final 키워드로 기본적으로 상속을 막아두었다.
  • 코틀린은 open 키워드를 활용해서(추가해야) 상속 관계를 만들 수 있다.
  • 부모클래스에서 생성자를 활용하는 경우에 자식에서 객체 생성시 전달해 줘야 한다.

[상속이 필요한 이유]

  • 다형성을 구현할 수 있다.
  • 클래스의 내용을 변경해야하는경우, 부모 클래스만 변경하는것으로 유지보수의 공수를 크게 줄일 수 있다.

[예시 코드]

  • 닭, 참새, 비둘기는 새라는 공통점이 있다.
  • 닭, 참새, 비둘기는 새라는 부모에서 출발했다는 관계를 만들어 줄 수 있다.
    (닭, 참새, 비둘기 class를 따로따로 만들어서 써도 지금 당장 문제는 없지만, 관계를 만들어 주면 나중에 유지보수가 쉽다.)
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() {	// 뒤에 : Bird()를 써서 Bird가 부모 클래스이고, Chicken이 자식 클래스임을 나타내준다.
							// 여기에 fly()라는 메소드를 만들지 않았는데 부모 클래스에서 상속 받아와서 쓸 수 있다.
}

class Sparrow : Bird() {

}

class Pigeon : Bird() {

}

/* 결과
새는 날아요~
새는 날아요~
새는 날아요~
새는 날아요~
*/
  • 부모클래스(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 = ""이 프로퍼티인데, 이 프로퍼티의 name이라는 뜻(this는 현재 클래스의 상태변수를 의미)
        this.name = name	// 생성자의 파라미터로 넘어 온 name을 프로퍼티의 name에 대입❓
    }

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

}

class Chicken(name: String) : Bird(name) {	  // 부모 클래스가 생성자가 있기 때문에, 자식 클래스도 부모 클래스를 불러올 때 그대로 파라미터 값을 넘겨줘야 한다.(자식 클래스도 생성자로 파라미터(name: String)를 받아 온다.)

}

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

}

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

}
profile
코린이 강아지 집사🐶

0개의 댓글