[코틀린] study day 6

승아·2020년 10월 20일
0

생성자

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()의 접근
            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()
   }
}

부스트코스 코틀린강좌를 참고하였습니다.

0개의 댓글