[코틀린] study day 6
생성자
class 클래스명 constructor(필요한 매개변수들..) { // 주 생성자의 위치
...
constructor(필요한 매개변수들..) { // 부 생성자의 위치
// 프로퍼티의 초기화
}
}
- 클래스에 부 생성자를 하나 혹은 그 이상 포함할 수 있다.
- 매개변수는 서로 달라야 함
- 초기화 블록
init{
// 초기화 블록에는 간단한 코드가 허용됨.
}
상속
- open 키워드를 통한 선언
open class 기반 클래스명 { // open으로 파생 가능 (다른 클래스가 상속 가능한 상태가 됨)
...
}
class 파생 클래스명 : 기반 클래스명() { // 기반 클래스로부터 상속, 최종 클래스로 파생 불가
...
}
- 코틀린의 모든 클래스는 묵시적으로 Any로부터 상속
오버라이딩
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() { /* 구현부를 새롭게 재정의 */ } // 하위 클래스에서 재정의 금지
}
super
- super.프로퍼티명 // 상위 클래스의 프로퍼티 참조
- super.메서드명() // 상위 클래스의 메서드 참조
- super() // 상위 클래스의 생정자의 참조
this
- this.프로퍼티명 // 현재 클래스의 프로퍼티 참조
- this.메서드명() // 현재 클래스의 메서드 참조
- this() // 현재 클래스의 생성자의 참조
@
- 이너 클래스에서 바깥 클래스의 상위 클래스를 호출하려면 super 키워드와 함께 엣(@) 기호 옆에 바깥 클래스명을 작성해 호출
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()의 접근
[email protected]() // Child의 상위 클래스인 Base 클래스의 f() 접근
println("[Inside] [email protected]: ${[email protected]}") // 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()
}
}
부스트코스 코틀린강좌를 참고하였습니다.
Author And Source
이 문제에 관하여([코틀린] study day 6), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sainkr/코틀린-study-day-6저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)