Kotlin 클래스와 생성자

클래스

class 키워드

  • Kotlin 클래스는 class 키워드를 사용하여 선언합니다.
class Person { ... }
  • 클래스 선언부는 아래와 같이 구성됩니다.
    • 클래스 이름
    • 클래스 헤더(클래스 타입 파라미터 <T>, 기본 생성자 constructor 등),
    • 중괄호{ }로 둘러 싸인 클래스 바디
  • 클래스 헤더와 바디는 optional이므로, 바디가 없다면 중괄호 { }를 생략할 수 있습니다.
class Empty

Kotlin 클래스 생성하기

  • Intellij 상단 메뉴에서 [File] - [New] - [Kotlin File/Class] 클릭합니다.

image-20190101001008678

  • [Class] 를 선택하고 생성합니다.

image-20190101001942313

  • Person.kt 파일이 생성됩니다.
// Person.kt
class Person {
    
}

생성자

constructor 키워드

  • Java와 비교 - Java는 생성자를 클래스 내부에 선언해야합니다.
// Person.java
public class Person {
    Person(String firstName) {
        ...
    }
}
  • Kotlin은 constructor 키워드를 사용하여 생성자를 클래스 선언부(기본 생성자)클래스 내부(보조 생성자)에 선언할 수 있습니다.
// Person.kt - 기본 생성자
class Person constructor(firstName: String) { 
    ... 
}

기본 생성자(primary constructor)

  • 기본 생성자는 클래스 헤더의 한 부분으로, 클래스 이름 뒤(타입 파라미터 <T> 가 있다면 그 뒤)에 위치합니다.
class Person constructor(firstName: String) { ... }
  • 기본 생성자에 애노테이션(annotations)1이나 접근 제한자(visibility modifiers)2가 없다면 constructor 키워드를 생략할 수 있습니다.
// Person.kt - constructor 키워드 생략 가능
class Person(firstName: String) { 
    ... 
}
// Customer.kt - constructor 키워드 생략 불가능
class Customer public @Inject constructor(name: String) { 
    ... 
}
  • 기본 생성자의 파라미터는 클래스 바디에 선언된 프로퍼티 초기화에도 사용할 수 있습니다.
class Customer(name: String) {
    // 프로퍼티 customerKey 초기화에 name 파리미터 사용
    val customerKey = name.toUpperCase()
}
  • 코틀린은 기본 생성자에서 프로퍼티를 선언하고 초기화하는 간결한 구문을 제공합니다.
    (varval 3)
class Person(val firstName: String, val lastName: String, var age: Int) { 
    ... 
}

init 키워드

  • 코틀린에서는 기본 생성자가 클래스 선언부에 위치하므로 바디를 가질 수 없는 구조입니다.
  • 대신, init{} 함수 안에 초기화 코드를 작성하여 기본 생성자의 인자값을 처리할 수 있습니다.
  • 인스턴스가 초기화되는 동안, init{} 함수는 프로퍼티 초기화와 함께 클래스 바디에 선언된 순서대로 실행됩니다.
class InitOrderDemo(name: String) {
    val firstProperty = "First property: $name".also(::println)
    
    init {
        println("First initializer block that prints ${name}")
    }
    
    val secondProperty = "Second property: ${name.length}".also(::println)
    
    init {
        println("Second initializer block that prints ${name.length}")
    }
}

실행결과

First property: hello
First initializer block that prints hello
Second property: 5
Second initializer block that prints 5

보조 생성자(Secondary Constructors)

  • 클래스 바디 내부에 보조생성자를 생성할 수 있습니다.
class Person {
    constructor(parent: Person) {
        parent.children.add(this)
    }
}
  • 클래스에 기본 생성자가 있으면, 각 보조 생성자는 this 키워드를 사용하여 직접 기본생성자에게, 또는 다른 보조 생성자를 통해 간접적으로 기본생성자에게 위임을 해야합니다.
  • this 키워드기본 생성자의 속성을 상속받아 처리되는 형식입니다.
class Person(val name: String) {
    constructor(name: String, parent: Person) : this(name) {
        parent.children.add(this)
    }
}

  1. 코드에 메타데이터를 붙이는 방법 (ex. @Inject)
    Kotlin Reference - Annotations 

  2. 코틀린에는 4개의 접근 제한자가 있습니다
    (ex. private , protected , internal , public )
    Kotlin Reference - Visibility Modifiers 

  3. var : 수정이 가능한 변수
    val : 수정이 불가능한 변수
    Kotlin Reference - Defining variables