프로그래밍Kotlin 개발자

Kotlin에서 생성자의 가시성 및 상속의 세부 사항을 설명하십시오: 기본 생성자와 보조 생성자는 어떻게 다르며, 상속 및 가시성 수정자와 관련된 뉘앙스는 무엇입니까? 코드 예제와 일반적인 오류를 제시하십시오.

Hintsage AI 어시스턴트로 면접 통과

답변.

Kotlin에서 모든 클래스는 하나의 기본 생성자를 가질 수 있으며(클래스의 선언에 지정됨) 여러 개의 보조 생성자를 가질 수 있습니다( constructor를 통해).

  • 기본 생성자는 선언 외부의 코드를 포함할 수 없습니다(로직은 init에 있습니다).
  • 보조 생성자는 추가 초기화 옵션을 구현합니다.
  • 부모에게 매개변수가 없는 생성자가 없으면 상속자는 반드시 명시적으로 그 생성자를 호출해야 합니다.
  • 수정자(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() - 오류

뉘앙스:

  • 기본 생성자에 매개변수가 있는 클래스는 해당 매개변수를 전달하지 않고 상속할 수 없습니다.
  • 보조 생성자는 기본 생성자를 간접적이거나 직접적으로 호출해야 합니다.
  • 중첩 클래스는 외부 클래스의 private 생성자에 접근할 수 없습니다.

패러디 질문.

Kotlin에서 클래스를 상속하고 기본 생성자를 호출하지 않고도 상속할 수 있습니까?

답변: 아니요. Kotlin에서 상속할 때는 항상 최소한 하나의 부모 생성자(기본 생성자 또는 보조 생성자( super()를 통해))를 호출해야 합니다.

예:

open class A(val x: Int) class B: A // 오류: A의 생성자를 명시적으로 호출해야 합니다.

주제의 세부 사항을 모르는 것으로 인한 실제 오류 사례.


이야기

팀에서 클래스의 객체 생성을 금지하려고 하고 생성자를 private으로 만들었습니다. 그러나 팩토리 메서드를 구현하는 것을 잊어버렸습니다. 이로 인해 리플렉션 없이 클래스를 테스트할 수 없게 되었습니다. CI가 차단되었습니다.


이야기

기본 생성자에 필수 매개변수가 있는 클래스를 상속했지만 상속자를 선언할 때 매개변수를 전달하지 않았습니다. 이는 긴 디버깅 후 컴파일 단계에서만 확인되었습니다.


이야기

보조 생성자를 사용할 때 모든 보조 생성자가 기본 생성자를 호출해야 한다는 것을 잊었습니다. 결과적으로 객체가 필요한 매개변수 없이 초기화되어 런타임에 NullPointerException이 발생했습니다.