티스토리 뷰
코틀린에서 상속의 개념을 알아봅시다.
우선, 상속 문법을 사용하는 이유는 불필요한 코드의 중복을 막기위해서 입니다.
여러 클래스에서 동일한 함수를 3번 이상 사용하는 경우, 코드가 중복되어 리팩토링이 필요합니다.
이렇게 코드의 쓸데없는 중복을 막을 수 있도록 도와주는 문법이 상속입니다.
상속은 부모 클래스의 함수나 변수 등을 자식 클래스가 물러 받는 것을 말합니다.
저번에 클래스에 대해 설명한 부분을 기억하시나요?
https://itknowledgeshare.tistory.com/27
코틀린 클래스 Kotlin Class
클래스를 이해하기 위해서는 우선 OOP의 개념을 알아야 합니다. OOP는 Object Oriented Programming의 약자로, 한글로는 객체지향프로그래밍이라고 일컫습니다. OOP와 대비되는 개념은 절차지향프로그래
itknowledgeshare.tistory.com
클래스를 설명서에 비유해서 설명한 바 있습니다. 상속은 부모의 설명서를 자식이 물러받게 된다고 이해하면 쉽습니다.
코틀린에서 상속 문법을 사용할 때, 몇 가지 알아둬야 할 부분이 있습니다.
먼저, 자식 클래스가 인스턴스화 되기 위해서는, 부모 클래스가 먼저 인스턴스화 되어야 합니다.
두 번째로는, 부모 클래스의 생성자에 타입이 적혀 있는 인자들을 자식 클래스가 물러 받을 때는 타입을 선언하지 않습니다. 자식 클래스에서 새롭게 생긴 인자에는 타입 선언이 가능합니다.
세 번째로는, 자식 클래스는 부모 클래스 자체를 타입으로 받을 수 있습니다. 반대로, 부모 클래스는 자식 클래스를 타입으로 받을 수 없습니다.
그럼 예문을 통해서 상속에 대해 더 알아봅시다.
fun main(array: Array<String>){
val superCar: SuperCar = SuperCar()
superCar.drive()
superCar.stop()
superCar.driveFast()
}
open class Car(engine: String, body: String){
open fun drive(): String {
return "달린다"
}
fun stop(){
println("멈춘다")
}
}
class SuperCar() : Car("VV engine", "copper") {
override fun drive(): String {
//println("조금씩 달린다")
//super.drive()
val run = super.drive()
return "조금씩 $run"
}
fun driveFast(){
println("빨리 달린다")
}
}
위의 예문에서 Car, SuperCar 두 개의 클래스가 있습니다. 클래스는 일종의 설명서라고 했죠?
여기서 Car는 부모 클래스고, SuperCar는 자식 클래스라고 생각해 봅시다. SuperCar도 Car 한 종류이기 때문이죠.
Car에는 drive( ), stop( ) 두 개의 기능이 있을 때, 자식 클래스인 SuperCar에서 해당 기능을 반복해서 쓸 필요가 없이 바로 부모로부터 상속을 받을 수 있습니다.
우선, SuperCar 클래스에서 상속을 받을 수 있는 방법은 리턴 타입을 부모 클래스로 적어 주는 것입니다.
class SuperCar( ) : Car("vv engine", "copper") 이렇게 선언된 부분을 보면, 클래스명 뒤의 세미콜론 부분은 타입을 적는 부분인데, 부모 클래스를 타입으로 적어준 것입니다.
그럼, 부모 클래스의 기능을 가져와야죠? 이 때 등장하는 개념이 메소드 오버라이딩입니다.
메소드 오버라이딩은 말그대로 메소드를 덮어 씌우는 개념입니다. 부모 클래스의 메소드(=함수/기능)를 그대로 가져와서 사용하는데, 이는 아래 사진처럼 마우스 우클릭 -> Generate -> Override Method를 클릭해서 사용합니다.
override fun drive(): String{
super.drive()
}
메소드 오버라이딩 부분에서 super.drive( )의 super는 Car( ) 클래스를 의미합니다. 부모 클래스를 단지 super 키워드로 표현한 것 뿐입니다. 따라서 부모 클래스의 drive( ) 메소드를 쓰겠다는 의미입니다.
위의 SuperCar 클래스는 메소드 오버라이딩을 통해서 부모 메소드를 전달 받았으며, 이를 조금 변경하였습니다. 이렇게 자식 클래스는 부모 클래스의 함수를 전달 받아 그대로 사용하던지, 변경을 할 수 있습니다.
또 한 가지, 중요한 부분은 부모 클래스를 상속받으면, 부모 클래스가 private 접근제어자를 가지고 있지 않아야 합니다.
이전의, 접근제어자 포스팅에서 클래스는 기본적으로 디폴트 값이 private으로 설정되어 있습니다. 따라서 이를 다른 예약어로 바꿔야 하는데, 이는 'open' 입니다.
open class Car(engine: String, body: String) 부모 클래스의 class 예약어 앞에 open이 붙여진 것이 보이시죠? 이렇게 open을 명시해야만 외부로부터 접근이 가능해지므로 상속이 가능합니다.
당연하겠지만, 부모 클래스인 Car는 자식 클래스인 SuperCar의 driveFast 기능은 이용할 수 없습니다!
'Kotlin' 카테고리의 다른 글
코틀린 제너릭 Kotlin Generics (0) | 2021.07.06 |
---|---|
코틀린 인터페이스 Kotlin Interface (0) | 2021.07.06 |
코틀린 접근제어자 Kotlin Access Modifier (0) | 2021.07.06 |
코틀린 전역 변수, 지역 변수 (Global Variables, Local Variables) (0) | 2021.07.06 |
코틀린 클래스 Kotlin Class (0) | 2021.07.06 |
- Total
- Today
- Yesterday
- 안드로이드 앱 만들기
- ToDo List 앱 만들기
- 뷰 바인딩
- 상대적 레이아웃
- 2019년 사건사고
- findViewById
- notifyDataSetChanged
- android adapter
- 리스트뷰
- addView
- 대한민국 미제사건
- 안드로이드 어댑터
- 애드뷰
- 탭레이아웃
- 리사이클러뷰
- 안드로이드 스튜디오 에러
- 메소드 오버라이딩
- RecyclerView
- 미제사건
- bmi 계산기 만들기
- 인텐트
- 안드로이드 프로젝트
- Bmi Calculator
- tabLayout
- 자바스크립트 배열
- 2007년 사건사고
- 2021년 사건사고
- view binding
- lazy init
- 선형 레이아웃
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |