티스토리 뷰

Programming Language/Kotlin

[Kotlin] 생성자

SdardewValley 2022. 8. 3. 22:31
반응형

주 생성자(primary constructor)

다양한 생성자 정의 방법

class User(val nickname: String)

  코틀린에서 클래스를 정의할 때 중괄호를 붙여주지 않아도 된다. 클래스 뒤에 오는 괄호로 둘러싸인 코드(val 선언에 해당하는 부분)가 주 생성자이다. 주 생성자는 생성자 파라미터 지정 및 생성자에 의해 초기화되는 프로퍼티 정의에 사용된다. 이 User 클래스를 풀어쓰면 아래와 같다.

 

class User constructor(_nickname: String) {
  val nickname: String
  
  init {
    nickname = _nickname
  }
}

  constructor은 주 생성자나 부 생성자 정의를 위해서 사용하는 키워드이다. init 키워드는 초기화 블록을 정의하는 키워드이다. 이 초기화 블록은 주 생성자와 함께 사용되고 여러개를 정의할 수도 있다. 그리고 아래와 같이 변경할 수 있다.

 

class User constructor(_nickname: String) {
  val nickname = _nickname
}

 

  주 생성자의 파라미터는 초기화 블록(init 안)이나 프로퍼티를 초기화하는 식에서만 참조 가능하다.

 

class User(val nickname: String)

  파라미터 앞에 val을 추가함으로써 간단하게 작성할 수 있다.

 

 

디폴트 값 지정

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

  코틀린에서는 파라미터에 디폴트값을 지정할 수 있다. 객체를 생성할 때 isSubscribed 값을 따로 전달하지 않는다면 기본으로 isSubscribed의 값은 true가 된다.

 

val user1 = User("user1", false)
val user2 = User("user2", isSubscribed = false)

  isSubscribed 값을 전달 할 때 파라미터의 순서에 해당하는 값을 전달하거나 이름을 지정해서 전달할 수 있다.

 

하위 클래스에서 상위 클래스 초기화

open class User(val nickname: String)

class TwitterUser(nickname: String): User(nickname) {}

 

  상위 클래스를 상속 받았을 때 상위 클래스 초기화를 위해서 괄호 안에 파라미터를 전달하면 된다.

 

기본 생성자

interface Clickable

open class Button

class RadioButton: Button(), Clickable

  Button 클래스처럼 클래스의 생성자를 정의하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어준다. 그리고 이런 Button 클래스와 같은 클래스를 상속받은 하위클래스는 상위 클래스에 전달할 인자가 없더라도 기본 생성자를 호출해야 한다.

 

  클래스를 상속받은 경우 상위 클래스의 생성자 호출로 인해서 클래스 이름의 뒤에는 반드시 괄호가 들어간다. 인터페이스를 상속받은 경우에는 생성자가 없기 때문에 뒤에 괄호가 붙지 않는다. 따라서 자바의 implements, extends 대신 콜론(:)을 사용하더라도 괄호를 통해서 인터페이스를 상속받았는지 클래스를 상속받았는지 구분할 수 있다.

 

class Secretive private constructor() {}

  외부에서 인스턴스화 되는 것을 막고 싶은 경우에는 생성자의 가시성을 private으로 지정하면 된다.

 

 

부 생성자(secondary constructor)

  부 생성자는 주 생성자 선언 없이 constructor 키워드로 시작하는 생성자이다. 

 

open class User(val nickname: String)

class TwitterUser: User{
  constructor(nickname: String): super(nickname) {
  }
}

  여기서 부 생성자는 super 키워드로 상위 클래스의 생성자를 호출한다.

 

class TwitterUser: User {
  constructor(nickname: String): this(nickname, false) {
  }

  constructor(nickname: String, isLogined: Boolean): super(nickname, isLogined) {
  }
}

  부 생성자는 this 키워드를 사용해서 또 다른 생성자를 호출할 수 있다.

 

 

참고

  • Kotlin IN ACTION
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함