엔지니어 규의 IT 프로그래밍 다이어리

[Kotlin]9. 클래스의 상속 본문

프로그래밍 언어/코틀린

[Kotlin]9. 클래스의 상속

엔지니어 규 2022. 5. 10. 21:31
728x90

클래스의 상속이 필요한 경우는 두가지가 있다.

 

첫번째는 기존 클래스가 있을때, 이 클래스를 확장하여 새로운 기능이나 속성을 가진 클래스를 만들어야 할때가 있고,

 

두번째는 여러가지 클래스를 만들었는데, 이 클래스들의 공통점을 뽑아 코드관리를 쉽게하기 위함이다.

 

여기서 속성과 함수를 물려주는 쪽을 Super Class, 물려받는 쪽을 Sub Class 라고 한다.

 

다음 의 애완동물을 관리하는 Animal Class 를 살펴보자.

fun main(){
 
    var a= Animal("별이",5,"개")
    var b = Dog("멍이",4)
    var c = Cat("냥이",7)
 
    a.introdunce()
    b.introdunce()
    b.bark()
    c.meow()
 
 
}
 
open class Animal(var name: String, var age : Int, var type :String){
    fun introdunce(){
        println("저는${type} ${name}이고, ${age}살 입니다.")
    }
}
 
class Dog( name: String, age: Int) : Animal (name, age, "개"){
    fun bark(){
        println("멍멍")
    }
}
 
class Cat(name: String, age: Int) : Animal(name,age,"고양이"){
    fun meow(){
        println("야옹")
    }
}


저는개 별이이고, 5살 입니다.
저는개 멍이이고, 4살 입니다.
멍멍
야옹
cs

 

open class Animal(var name: String, var age : Int, var type :String)

여기서 class 앞에 open 을 써줘야 Animal class 는 super class 로서, sub class 인 dog, cat 에게 상속을 해줄 수 있다.

 

open 은 class 가 상속될 수 있도록 class 선언시 붙여줄 수 있는 키워드 이다.

 

 

상속을 할때는 두가지 규칙이 있다.

 

1. 첫번째는 수퍼 클래스에 존재하는 속성과 '같은이름' 의 속성을 가질수 없으며,

2. 두번째는 서브클래스가 생성될 떄는 반드시 수퍼 클래스의 생성자까지 호출이 되어야 한다.

 

 

class Dog( name: String, age: Int) : Animal (name, age, "개")

 

위의 Dog Class 를 만들 때는 생성자에서 이름과 나이를 받지만 var 을 붙이지 않으며 일반 parameter로 받아,

animal class 의 생성자에 직접 넘겨준다. 

 

클래스의 상속을 위해 Dog class 선언후 콜론을 붙이고, 수퍼클래스의 생성자  [: Animal (name, age, "개")] 를 호출 할 수 있게 해준다.

 

(name, age, "개") 에서  "개" 는 고정된 값으로 넘기게 된다.

 

constructor(name: String) : this(name,1997

앞에서 공부한 보조생성자 인 constructor 가 주 생성자를 받아온것과 비슷한 구조이다.

 

fun main(){
 
    var a= Animal("별이",5,"개")
    var b = Dog("멍이",4)
 
    a.introdunce()
    b.introdunce()
 
}

저는개 별이이고, 5살 입니다.
저는개 멍이이고, 4살 입니다.

여기서 보는 것처럼 Animal class 을 상속받은 Dog class 는  Animal class 와 같은 속성과 기능을 가지게 된다.

 

 

 

또한 아래의 소스코드 처럼 Dog, Cat 만 쓸수 있는 함수를 내부적으로 선언해 줄 수 있다.

class Dog( name: String, age: Int) : Animal (name, age, "개"){
    fun bark(){
        println("멍멍")
    }
}
 
class Cat(name: String, age: Int) : Animal(name,age,"고양이"){
    fun meow(){
        println("야옹")
    }
}


이처럼 클래스의 상속은 클래스를 더 구조적으로 다룰 수 있게 해준다는 장점이 있지만,

 

지나친 상속은 코드를 더 어렵게 만들게 된다.

728x90
Comments