Kotlin에서 모든 클래스는 하나의 기본 생성자를 가질 수 있으며(클래스의 선언에 지정됨) 여러 개의 보조 생성자를 가질 수 있습니다( constructor를 통해).
private, protected, internal, public)를 통해 생성자의 가시성을 숨기거나 제한할 수 있습니다.기본 및 보조 생성자의 예:
open class Person(val name: String) { constructor(name: String, age: Int) : this(name) { // 보조 생성자 } } class Employee : Person { constructor(name: String) : super(name) // 명시적인 super가 필요합니다. }
가시성 수정자:
class Secret private constructor() { companion object { fun create() = Secret() } } val s = Secret.create() // OK, 그러나 Secret() - 오류
뉘앙스:
Kotlin에서 클래스를 상속하고 기본 생성자를 호출하지 않고도 상속할 수 있습니까?
답변: 아니요. Kotlin에서 상속할 때는 항상 최소한 하나의 부모 생성자(기본 생성자 또는 보조 생성자( super()를 통해))를 호출해야 합니다.
예:
open class A(val x: Int) class B: A // 오류: A의 생성자를 명시적으로 호출해야 합니다.
이야기
팀에서 클래스의 객체 생성을 금지하려고 하고 생성자를 private으로 만들었습니다. 그러나 팩토리 메서드를 구현하는 것을 잊어버렸습니다. 이로 인해 리플렉션 없이 클래스를 테스트할 수 없게 되었습니다. CI가 차단되었습니다.
이야기
기본 생성자에 필수 매개변수가 있는 클래스를 상속했지만 상속자를 선언할 때 매개변수를 전달하지 않았습니다. 이는 긴 디버깅 후 컴파일 단계에서만 확인되었습니다.
이야기
보조 생성자를 사용할 때 모든 보조 생성자가 기본 생성자를 호출해야 한다는 것을 잊었습니다. 결과적으로 객체가 필요한 매개변수 없이 초기화되어 런타임에 NullPointerException이 발생했습니다.