[코틀린 인 액션] 4.2.2 __부 생성자: 상위 클래스를 다른 방식으로 초기화__

코틀린 생성자 vs 자바 생성자

  • 코틀린은 자바에 비해 생성자가 여러 개 필요한 경우가 적다.
  • 자바에서 필요한 오버로드 생성자는 코틀린의 기본 생성자와 이름 붙인 인자 문법으로 해결이 가능하다.
    • 이름 붙인 인자
      • 함수나 생성자 호출시 파라미터의 이름을 명시적으로 지정하여 값을 전달하는 방식
      fun formatMessage(name: String, age: Int, location: String) {
          // ...
      }
      • 을 호출시에
      formatMessage(location = "Seoul", age = 30, name = "Alice")
       혹은
      formatMessage(name = "Alice", age = 30, location = "Seoul")
      • 인자가 무엇을 의미하는지 명확하게 전달이 가능하다.

부 생성자가 필요한 경우

  • 프레임 워크 클래스를 확장하는 경우, 다양한 방법으로 인스턴스 초기화할 수 있어야 할때
  • 예: 안드로이드의 View 클래스

예시

  1. View 클래스
    open class View {
        constructor (ctx: Context) {
            // 코드
        }
        constructor (ctx: Context, attr: AttributeSet) {
            // 코드
        }
    }
    
  1. MyButton 클래스
    class MyButton : View {
        constructor (ctx: Context) : super(ctx) {
            // ...
        }
        constructor (ctx: Context, attr: AttributeSet) : super(ctx, attr) {
            // ...
        }
    }
    

생성자 위임 방식

  • super() 를 통한 위임
  • this() 를 사용해 클래스 자신의 다른 생성자를 호출할 수 있음
    `class MyButton : View {
        constructor (ctx: Context) : this(ctx,MY_STYLE) {
            // ...
        }
        constructor (ctx: Context, attr: AttributeSet) : super(ctx, attr) {
            // ...
        }
    }

모든 부 생성자는 상위 클래스를 초기화하거나 다른 생성자에게 생성을 위임하는 역할을 해야합니다!


Uploaded by N2T