728x90
자바의 상속
- 객체지향 핵심 원칙 중 하나인 상속은 상속을 통해 기존 코드를 재사용하거나 확장할 수 있다.
- 자바는 기본적으로 모든 클래스가 상속이 가능하나, 상속에 따른 부작용이 발생할 경우를 대비해 final 키워드로 막을 수 있다.
- 대표적으로 system 클래스가 있다.
System.out.println("Hello World");
public final class System {
}
- 이펙티브 자바의 아이템 중 "상속을 위한 설계와 문서를 작성하고 그렇지 않으면 상속을 금지하라" 라는 주제가 있는데 여기서 상속에 대한 문제점에 대해 나와 있으며, 결과적으로 상속을 목적으로 만든 클래스가 아니면 모두 final로 작성하는 것이 좋다
코틀린의 상속
//코틀린 모든 클래스의 조상은 Any이다(equals, hashCode, toString 을 상속받는다)
//코틀린의 모든 클래스는 기본적으로 final이므로, 상속을 막는다 -> open 키워드를 통해 상속이 가능하도록 할 수 있다.
//open class Dog //open 키워드가 있으므로 상속 가능
open class Dog {
open var age: Int = 0
open fun bark() {
println("멍멍")
}
}
open class Bulldog(final override var age: Int = 0) : Dog() { //기본 생성자를 통해서도 재정의를 할 수 있다.
//override var age: Int = 0 //오버라이드 키워드를 통해 하위 클래스에서 상위클래스 메서드를 오버라이드 할 수 있다.
final override fun bark() { //하위 클래스에서 더이상 override한 메서드를 재정의 못하도록 박기 위해서는 Final 키워드를 사용하면 된다
//println("컹컹")
super.bark() //상위 클래스의 함수나, 프로퍼티를 재사용하기 위해서는 super 키워드를 사용하면 된다.
}
}
class ChildBulldog : Bulldog() {
/*
override var age: Int = 0
override fun bark() {
super.bark()
}
*/
}
fun main() {
val dog = Bulldog(age = 2)
println(dog.age)
dog.bark()
}
- 자바의 모든 클래스의 조상은 object, 코틀린의 모든 클래스의 조상은 Any이다.
- Any에는 equals, hashCode, toString 이 존재하고, 모든 클래스로 자동 상속된다.
- 코틀린의 클래스는 기본적으로 final 클래스와 같이 상속을 막고, 꼭 필요한 경우 open 키워드로 상속을 허용할 수 있다.
- 하위 클래스에서 상위 클래스를 확장하기 위해서는 클래스 뒤에 : 추가 후 상위 클래스를 작성한다.
- 함수나 프로퍼티를 재정의 할 때도 open 키워드로 오버라이드에 대해 허용해야 한다.
- 프로퍼티는 기본 생성자를 사용해 오버라이드 할 수 있다.
- 오버라이드 된 함수나 프로퍼티는 기본적으로 open이 되어 있어 하위 클래스에서 오버라이드를 막기 위해서는 final을 앞에 붙인다.
- 하위 클래스에서 상위 클래스의 함수나, 프로퍼티에 접근할 땐 super 키워드를 사용한다.
추상 클래스
abstract class Developer { //추상 클래스를 만들고 싶으면 abstract 키워드를 사용하자
abstract var age: Int
abstract fun code(language: String)
}
//abstract 클래스의 메서드나, 프로퍼티를 재정의를 반드시 해주어야한다
class BackendDeveloper(override var age: Int = 0) : Developer() {
override fun code(language: String) {
println("I code with $language")
}
}
fun main() {
val backendDeveloper = BackendDeveloper(age = 20)
println(backendDeveloper.age)
backendDeveloper.code("Kotlin")
}
- 코틀린은 abstract 키워드를 사용해 추상 클래스도 제공
- 하위 클래스에서 구현해야 하는 프로퍼티나 함수 또한 abstract 키워드를 사용한다.
728x90