[코틀린기초] 24. super와 this

super는 상위 클래스의 메서드, 프로퍼티, 생성자를 사용하는 키워드

this는 현재 클래스의 메서드, 프로퍼티, 생성자를 사용하는 키워드

## 바깥 클래스 접근하기

이너클래스는 inner 키워드를 사용하여 선언하며, @ 기호를 이용하여 @기호 옆에 바깥 클래스 명을 작성해 호출한다.

  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접근
        }
      }
  } 
  
  fun main(){
    val c1 = Child()
    c1.Inside().test()  //  이너 클래스 Inside의 메서드 test() 실행
  }

## 앵글브라켓을 사용한 이름 중복 해결

  open class A{
    open fun f() = println("A Class f()")
    fun a() = println("A Class a()")
  }
  
  interface B{ 
    fun f() = println("B Interface f()")  //  인터페이스는 기본적으로 open이다
    fun b() = println("B Interface b()")
  }
  
  class C :" A(), B{  // ,를 사용해 클래스와 인터페이스 지정. 상속은 단 한개만 가능
    override fun f() = println("C Class f()")
    fun test() {
      f() //현재 클래스의 f()
      b() //인터페이스의 b()
      super<A>.f()  // A 클래스의 f() 
      super<B>.f()  // B 인터페이스의 f()
    }
  }
  
  fun main(){
    val c = C()
    c.test()
  }