해당 내용은 Do it! 코틀린 프로그래밍 책을 공부하며 인용 및 정리한 것입니다. 저의 개인적인 견해나 의견이 포함되어 있습니다. 코드는 되도록 책을 보고 응용해서 작성했습니다.
05_3 상속과 다형성
상속의 장점 : 상위 클래스의 있는 내용을 하위 클래스에서 다시 구현하지 않아도 됨
다형성 장점 : 하나의 이름으로 다양한 기능을 수행할 수 있음
상속과 클래스의 계층
- 파생 클래스(하위 클래스)에서는 기반 클래스(상위 클래스)와 다른 프로퍼티와 메서드만 추가하여 사용해도 됨
- 코틀린의 최 상위 클래스 Any 클래스 -> 상위 클래스를 명시하지 않으면 Any 클래스를 상속 받음
- 코틀린에서 상속할 수 있는 클래스를 선언하려면 open 키워드 사용. open 키워드를 적지 않을 경우 기본 클래스로 선언됨(최종 클래스로 상속 할 수 없음)
+) 자바에서 상속할 수 없는 클래스로 선언하고 싶은 경우 final 키워드 사용
하위 클래스 선언
open class Shape(var width: Int, var height: Int, var name: String) {
fun drawShap() = println("this shap is $name")
fun printFeature() = println("width: $width, height: $height")
}
// 주 생성자를 이용하여 상속
class Rectangle(width: Int, height: Int, name: String) : Shape(width, height, name) {
fun printRec() = println("this class is Rectangle class")
}
// 부 생성자 이용하여 상속
class Circle : Shape {
var round: Double
constructor(width: Int,
height: Int,
name: String,
round: Double) : super(width, height, name) {
this.round = round // 확장 : 새로 생성한 프로퍼티
}
}
다형성
- 오버로딩
- 오버라이딩
오버로딩(overloading)
- 동일한 클래스 안에서
- 같은 이름의 메서드로 여러번 정의하되, 매개변수는 다르게
- 클래스 메서드, 일반 함수 오버로딩 가능
- 주로 다양한 자료형에 대해 대응하기 위해 사용되고 있음
fun add(x: Int, y: Int) = x + y
fun add(x: Int, y: Int, z: Int) = x + y + z
fun add(x: Double, y: Double) = x + y
+) 옛날에 한 강사님이 알려주시길 load가 적재하는 의미도 있기 때문에 트럭에 똑같은 짐을 계속 over해서 쌓아올리는 걸 연상하면 쉽다고 설명해 주셨다.
오버라이딩(Overriding)
- 재정의
- 하위 클래스에서 새로 만들어지는 메서드가 이름이나 매개변수, 반환값이 상위 클래스와 같은 경우 하위 클래스에 의해 재정의 됨.
- 전혀 다른 기능 정의 가능
- 오버라이딩 하기 위해서 기반 클래스는 open 키워드, 파생 클래스는 override 키워드 사용
open class Shape { // 상속하기 위해 open 키워드 사용
open fun draw() = print("draw shape") // 오버라이딩을 위해 open 키워드 사용
}
class Rectangle : Shape() {
override fun draw() = print("draw Rectangle") // 재정의를 위해 override 키워드 사용
}
- open 키워드가 없는 메서드의 경우 overriding 불가능
- 오버라이딩을 통해 재정의하고 싶지 않은 경우 아래와 같이 final 키워드 사용
open class Shape { // 상속하기 위해 open 키워드 사용
final fun draw() = print("draw shape") // 오버라이딩 불가능하게 하는 final 키워드
}
class Rectangle : Shape() {
override fun draw() = print("draw Rectangle") // 에러
}
- 하위 클래스에서 특정 메서드 재설계 시 유용한 기법
05_4 super와 this의 참조
super.propertyName // 상위 클래스 프로퍼티 참조
super.method() // 상위 클래스 메서드 참조
super() // 상위 클래스 생성자
this.propertyName // 현재 클래스 프로퍼티 참조
this.method() // 현재 클래스 메서드 참조
this() // 현재 클래스 생성자 참조
super로 상위 객체 참조
- 상위 클래스에서 구현한 내용은 그대로, 필요한 내용만 추가하고 싶을 때
- super.method() 를 통해 상위 클래스의 메소드를 실행 시킬 수 있음
- 상위 클래스의 동작을 수행하고 일부는 재정의 하는 등 유용하게 사용 가능
this로 현재 객체 참조하기
- 오버로딩된 같은 클래스의 생성자를 호출 할 수 있음
- 상속을 통해서 클래스를 만드는 경우 -> 상위 클래스 생성자 있는 경우 반드시 하위 클래스에서 호출해야 함
-> this, super 로 위임하여 다른 생성자를 처리할 수 있게 됨
주 생성자와 부 생성자 함께 사용하기
- 객체의 인자 수에 따라 부 생성자 혹은 주 생성자를 호출
- 예제 코드 : 주생성자 -> 프로퍼티 할당 -> 초기화 블록 -> 부생성자
바같 클래스 호출
- 이너 클래스 : 클래스 안에 클래스
- super@outerClassName
- 이너 클래스에서 상위 클래스 호출 시 사용
'NSLog(@"%@", dailyLog)' 카테고리의 다른 글
[Kotlin 20200805] 프로퍼티 초기화 (0) | 2020.08.05 |
---|---|
[Kotlin 20200804] 객체 지향 프로그래밍 - 인터페이스 (0) | 2020.08.04 |
[Kotlin 20200802] 객체 지향 프로그래밍 - 클래스와 객체 (0) | 2020.08.03 |
[Kotlin 20200730] 프로그램 흐름 제어 (0) | 2020.07.30 |
[Kotlin 20200729] 함수형 프로그래밍 공부 (0) | 2020.07.29 |
댓글