class 클래스명 constructor(필요한 매개변수들..) { // 주 생성자의 위치
...
constructor(필요한 매개변수들..) { // 부 생성자의 위치
// 프로퍼티의 초기화
}
}
init{
// 초기화 블록에는 간단한 코드가 허용됨.
}
open class 기반 클래스명 { // open으로 파생 가능 (다른 클래스가 상속 가능한 상태가 됨)
...
}
class 파생 클래스명 : 기반 클래스명() { // 기반 클래스로부터 상속, 최종 클래스로 파생 불가
...
}
open class Bird { // 여기의 open은 상속 가능을 나타냄
...
fun fly() { ... } // 최종 메서드로 오버라이딩 불가
open fun sing() { ... } // sing() 메서드는 하위 클래스에서 오버라이딩 가능
}
class Lark() : Bird() { // 하위 클래스
fun fly() { /* 재정의 */ } // 에러! 상위 메서드에 open키워드가 없어 오버라이딩 불가
override fun sing() { /* 구현부를 새롭게 재정의 */ }
}
open class Lark() : Bird() {
final override fun sing() { /* 구현부를 새롭게 재정의 */ } // 하위 클래스에서 재정의 금지
}
open class Base {
open val x: Int = 1
open fun f() = println("Base Class f()")
}
class Child : Base() {
override val x: Int = super.x + 1
override fun f() = println("Child Class f()")
inner class Inside{
fun f() = println("Inside Class f()")
fun test() {
f() // 현재 이너 클래스의 f() 접근
Child().f() // 바로 바깥 클래스 f()의 접근
super@Child.f() // Child의 상위 클래스인 Base 클래스의 f() 접근
println("[Inside] super@Child.x: ${super@Child.x}") // Base의 x 접근
}
}
}
open class A {
open fun f() = println("A Class f()")
}
interface B {
fun f() = println("B Interface f()") // 인터페이스는 기본적으로 open임
}
class C : A(), B {
fun test(){
f()
super<A>.f() // A클래스의 f()
super<B>.f() // B클래스의 f()
}
}
부스트코스 코틀린강좌를 참고하였습니다.