오늘 알아볼 주제는 <클래스의 상속>입니다
<상속 inheritance>
상속은 왜 필요할까요?
크게 상속이 필요한 경우는 2가지가 있는데요
1. 기존 클래스를 확장하여 새로운 속성이나 함수를 추가한 클래스를 만들어야 할 때
2. 여러개의 클래스를 만들었는데 클래스들의 공통점을 뽑아 코드 관리를 편하게 해야할 때
이때 속성과 함수를 물려주는 클래스를 수퍼 클래스,
물려받는 쪽을 서브 클래스 라고 합니다
코드를 통해 상속을 알아보도록 하겠습니다!
fun main() {
var a = Animal("별이", 5, "개")
var b = Animal("별이", 5)
a.introduce()
b.introduce()
b.bark()
var c = Cat("루이", 1)
c.introduce()
c.meow()
}
open class Animal (var name: String, var age: Int, var type: String) {
fun introduce() {
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살 입니다.
저는 개 별이이고, 5살 입니다.
멍멍
저는 고양이 루이이고, 1살 입니다.
야옹야옹
*/
애완동물을 관리하는 Animal 클래스가 있습니다
Animal 클래스에는 이름, 나이, 종류 등의 기본정보가 들어갑니다
그리고 동물의 정보를 알 수 있는 introduce 함수 하나가 포함되어 있습니다
이제 Animal 클래스를 상속받아 Dog와 Cat 클래스로 확장하는 코드를 보겠습니다
그 전에 코틀린은 상속 금지가 기본값이기 때문에 클래스를 상속해주기 위해서는 Animal 클래스 앞에
'open'이라는 키워드를 붙여주어야 합니다
('open'은 클래스가 상속될 수 있도록 클래스 선언 시 붙여줄 수 있는 키워드입니다)
이때 상속과 관련된 규칙 2가지가 있습니다
1. 서브 클래스는 수퍼 클래스에 존재하는 속성과 '같은 이름'의 속성을 가질 수 없음
2. 서브 클래스가 생성될 때는 반드시 수퍼 클래스의 생성자까지 호출되어야 함
그래서 Dog 클래스를 만들 때 생성자에서 이름과 나이를 받긴 하지만 클래스의 자체 속성으로 만들어주는 var을 붙이지 말고
(*var, val 등을 붙이면 속성으로 선언됩니다!)
일반 파라미터로 받아 Animal 클래스의 생성자에 직접 넘겨주도록 해야합니다
클래스의 상속은 클래스 선언 뒤에 콜론을 붙이고 수퍼 클래스의 생성자를 호출할 수 있도록 해주면 됩니다
생성자의 파라미터로 받은 이름과 나이, 그리고 "개"라는 종류는 Dog 클래스라면 공통된 값이므로 고정된 값으로 넘겨줍니다
이렇게 Dog 클래스를 만들어주면 이름과 나이, 그리고 '개'라는 종류를 넣어 Animal 클래스로 생성한 a 인스턴스와
이름과 나이를 넣어 Dog 클래스로 생성한 b 인스턴스가 같은 속성과 함수의 기능을 갖게 됩니다
그리고 여기에 추가로 Dog 클래스에 bark 함수를 만들고
b 인스턴스에서 bark 함수를 호출하면 "멍멍" 이 출력되는 것을 확인할 수 있습니다
bark함수는 Dog 클래스 안에서 만들어졌기 때문에 a 인스턴스는 사용할 수 없고 b 인스턴스만 사용 가능합니다
Cat 클래스도 똑같이 파라미터로 이름과 나이를 받고 이름, 나이, "고양이" 라는 값을 수퍼클래스에 넘겨줍니다
그리고 meow() 라는 함수를 넣어 "야옹야옹"을 출력하도록 하였습니다
클래스의 상속은 클래스를 더 구조적으로 다룰 수 있게 해준다는 장점이 있지만
지나친 상속구조는 코드를 더 어렵게 만들 수도 있으므로 주의하여 사용해야 합니다!
<클래스의 상속>은 여기서 마치도록 하겠습니다
*위 글은 유튜브 테크과학! DeMo님의 강좌를 참고하여 작성하였습니다
'Kotlin' 카테고리의 다른 글
[Kotlin] 코틀린 프로젝트의 구조 (0) | 2023.07.23 |
---|---|
[Kotlin] 10. 오버라이딩과 추상화 (0) | 2023.07.20 |
[Kotlin] 08. 클래스의 생성자 (0) | 2023.07.18 |
[Kotlin] 07. 클래스의 기본 구조 (0) | 2023.07.18 |
[Kotlin] 06. 흐름제어와 논리연산자 (0) | 2023.07.17 |