본문 바로가기

Kotlin/Basic

[kotlin]코틀린의 생성자(constructor)

🧭 코틀린의 생성자(Constructor)

코틀린에서는 하나의 주(primary) 생성자와 여러 개의 부(secondary) 생성자를 사용할 수 있다. 주 생성자는 클래스의 헤더로써 클래스의 이름과 동일한 이름을 사용한다.

만약 주 생성자에 어노테이션이나 가시성 변경자(visibility modifiers)가 없다면, 생성자 키워드는 생략 가능.

// constructor 키워드를 사용한 모습
class Person constructor(firstName: String) { /* . . . */ }

// constructor 키워드를 생략한 모습
class Person(firstName: String) { /* . . . */ }

보통 주 생성자는 클래스를 초기화할 때 주로 사용하는 간략한 생성자로, 클래스 본문 밖에 정의한다.

반면 부 생성자는 클래스 본문 안에 정의한다.

또한 코틀린에서는 초기화 블록(Initializer block : init { /* . . .*/ } )을 통해 초기화 로직을 추가할 수 있다.

주 생성자(Primary constructor)


코틀린에서는 클래스 이름 뒤에 고는 괄호(” ( ) ”)로 둘러 쌓인 코드를 주 생성자라고 한다.

주 생성자는 두 가지 목적으로 사용된다.

  • 생성자 파라미터를 지정하는 것
  • 그 생성자 파라미터에 의해 초기화되는 프로퍼티를 정의하는 것.

아래의 1번, 2번, 3번은 모두 같은 클래스의 생성자를 정의하는 것이다.

// 1번 방법
class User constructor(_nickname: String){
		val nickname: String
		init {
				nickname = _ nickname
		}
}
// 2번 방법
class User (_nickname: String){
		val nickname = _nickname
}
// 3번 방법
class User (val nickname: String)

이 중 3번의 방식이 가장 간단하다.

함수 파라미터처럼 생성자 파리미터에도 아래와 같이 default값을 정의할 수 있다.

class User (val nickname: String, val isSubscribed: Boolean = true)

클래스의 인스턴스를 만들때에는 자바와 달리 new키워드 없이 생성자를 직접 호출하면 된다.

val hyun = User("유저")

부 생성자(Secondary constructor)


위에서 언급했듯이 부 생성자는 클래스 본문 안에서 본문 안에서 정의되는 생성자이다.

아래와 같이 생성자가 2개인 View 클래스가 있다고 가정하겠다.

open class View {
		constructor (ctx: Context) { // 부 생성자
				/* . . . */
		}
		constructor(ctx: Context, attr: AttributeSet) { // 부 생성자
				/* . . . */
		}
}

이 클래스를 확장하면서 아래와 같이 두 가지 방식으로 부생성자를 정의할 수 있다.

// 1번. super() 를 통해 상위 클래스의 생성자를 호출함.
class MyButton : View {
		constructor (ctx: Context) : super(ctx) {
				// . . .
		}
		constructor (ctx: Context, attr: AttributeSet) : super(ctx, attr) {
						// . . .
				}
}

// 2번. this()를 통해 자기 자긴인 클래스의 다른 생성자를 호출함.
class MyButton : View {
		constructor (ctx: Context) : super(ctx, MY_STYLE) {
				// . . .
		}
		constructor (ctx: Context, attr: AttributeSet) : super(ctx, attr) {
						// . . .
				}
}

클래스에 주 생성자가 없다면 부 생성자는 반드시 상위 클래스를 초기화하거나 다른 생성자에게 생성을 위임해야한다.

부 생성자가 필요한 이유는 자바와의 상호 운용성과 팩토리 메소드에서 필요하기 때문이다.


Uploaded by N2T