본문 바로가기
Kotlin Language/Kotlin 기본 문법

Kotlin(코틀린) - 생성자(init, Constructor)

by Classic Master 2023. 12. 1.
728x90

코틀린에서 생성자는 클래스의 인스턴스를 초기화하는데 사용되는 함수입니다. 코틀린에서는 주 생성자와 부 생성자(secondary constructor)로 나뉘며, 주 생성자는 클래스 헤더 부분에 선언되고, 부 생성자는 클래스 본문 부분에 선언됩니다

 

init

  • 주로 클래스의 초기화 로직을 담당하는 특별한 종류의 함수입니다. 이 함수는 클래스가 생성될 때 호출되며, 주로 프로퍼티 초기화나 다른 초기화 코드를 담는 데 사용됩니다. init 함수는 주 생성자(Primary Constructor)의 일부로 정의되며, 클래스 내에 여러 개의 init 블록을 가질 수 있습니다
  • 코틀린을 별도의 생성자 영역이 없기 때문에 init 영역에서 초기화해주어야 한다.
class MyClass(name: String, age: Int) {
    // 주 생성자에서 프로퍼티 초기화
    val name: String
    val age: Int

    init {
        // init 블록에서 초기화 로직 수행
        this.name = name
        this.age = age
        // 여기에서 다양한 초기화 로직 수행 가능
        println("객체가 생성되었습니다.")
    }
    // 다른 init 블록도 추가할 수 있음
    init {
        // 다른 초기화 로직 수행
        println("다른 init 블록입니다.")
    }
}
fun main() {
    // 클래스 인스턴스 생성 시 init 함수가 호출됨
    val myObject = MyClass("Korea", 33)
}

This ?

  • 객체 내부에서 현재 인스턴스를 가리키는 참조입니다. 즉, 현재 메서드나 코드 블록이 속해있는 객체를 가리킵니다. this를 사용하여 객체 내부에서 인스턴스 변수나 메서드에 접근할 수 있습니다. 주로 멤버 변수와 메서드 매개변수의 이름이 충돌할 때 구분하기 위해 사용됩니다.

 


Constructor

  • 부 생성자는 클래스를 생성할 때 추가적인 초기화 로직이나 다른 생성자를 호출하기 위해 사용됩니다. 다음은 부 생성자의 예제입니다
class MyClass {
    // 주 생성자의 프로퍼티 선언
    val property1: Type1
    // 부 생성자 정의
    constructor(parameter1: Type1) {
        // 부 생성자의 초기화 로직
        this.property1 = parameter1
    }
    // 다른 부 생성자도 추가 가능
    constructor(parameter1: Type1, parameter2: Type2) : this(parameter1) {
        // 추가적인 초기화 로직
    }
    // 나머지 클래스 멤버 선언
    fun myMethod() {
        // 메서드 로직
    }
}
  • 코틀린에서는 클래스에 주 생성자와 부 생성자를 함께 사용할 수 있습니다. 주 생성자는 클래스 선언 부분에, 부 생성자는 클래스 내부에 constructor 키워드를 사용하여 정의됩니다.

주의사항

  • 주 생성자를 사용하면 기본 생성자가 자동으로 생성되지 않습니다. 따라서 다음과 같이 기본 생성자 형태로 클래스 변수를 초기화하는 것은 허용되지 않습니다:
// 이렇게는 사용할 수 없습니다.
class MyClass(name: String, age: Int) {
    val myName = name  // 에러 발생!
    val myAge = age
}
  • constructor로 생성한 생성자는 기본생성자가 아니기 때문에  (인자 = 변수)같은 형태로 쓸 수는 없습니다. 때문에 생성자 영역에서 매개변수를 클래스변수에 할당을 해야합니다.

 

class MyClass {
 constructor(var name : string, var num :Int){
	}
}
728x90
반응형