본문 바로가기
Java/Android App - Kotlin

Kotlin - 클래스 (생성자)

by 키모형 2023. 1. 4.
반응형

생성자의 기본 목적은 클래스의 객체를 만드는 방법을 지정하는 것입니다. 즉, 생성자는 객체를 초기화하고 객체를 사용할 수 있도록 준비합니다. 이 작업은 객체를 인스턴스화할 때 처리되었습니다. 생성자 내의 코드는 클래스의 객체가 인스턴스화될 때 실행됩니다. 매개변수를 포함하거나 포함하지 않고 생성자를 정의할 수 있습니다.

기본 생성자

기본 생성자는 매개변수가 없는 생성자입니다. 다음 코드 스니펫과 같이 기본 생성자를 정의할 수 있습니다.

class SmartDevice(val name: String, val category: String) {
	클래스본문    
}

 

매개변수화된 생성자 정의

SmartDevice 클래스에서 name 속성과 category 속성은 변경할 수 없습니다. SmartDevice 클래스의 모든 인스턴스가 name 속성과 category 속성을 초기화하도록 해야 합니다. 현재 구현에서 name  category 속성의 값은 하드코딩됩니다. 즉, 모든 스마트 기기는 "Android TV" 문자열로 이름이 지정되며 "Entertainment" 문자열로 분류됩니다.

불변성은 유지하되 하드코딩된 값을 피하려면 매개변수화된 생성자를 사용하여 초기화합니다.

  • SmartDevice 클래스에서 기본값을 할당하지 않고 name 속성과 category 속성을 생성자로 이동합니다.
class SmartDevice(val name: String, val category: String) {

    var deviceStatus = "online"

    fun turnOn(){
        println("Smart device is turned on.")
    }

    fun turnOff(){
        println("Smart device is turned off.")
    }
}

이제 생성자가 속성을 설정하는 매개변수를 허용하므로 이러한 클래스의 객체를 인스턴스화하는 방법도 변경됩니다. 다음 다이어그램에서 객체를 인스턴스화하는 전체 문법을 확인할 수 있습니다.

 

Kotlin의 생성자에는 두 가지 기본 유형이 있습니다.

  • 기본 생성자. 클래스에는 클래스 헤더의 일부로 정의된 기본 생성자가 하나만 있을 수 있습니다. 기본 생성자는 기본 또는 매개변수화된 생성자일 수 있습니다. 기본 생성자에는 본문이 없습니다. 즉, 코드를 포함할 수 없습니다.
  • 보조 생성자. 한 클래스에 여러 보조 생성자가 있을 수 있습니다. 매개변수를 포함하거나 포함하지 않고 보조 생성자를 정의할 수 있습니다. 보조 생성자는 클래스를 초기화할 수 있으며 초기화 로직을 포함할 수 있는 본문을 가집니다. 클래스에 기본 생성자가 있는 경우 각 보조 생성자는 기본 생성자를 초기화해야 합니다.

기본 생성자를 사용하여 클래스 헤더의 속성을 초기화할 수 있습니다. 생성자에 전달되는 인수는 속성에 할당됩니다. 기본 생성자를 정의하는 문법은 클래스 이름으로 시작하고 그 뒤에 constructor 키워드와 괄호 쌍이 나옵니다. 괄호에는 기본 생성자의 매개변수가 포함됩니다. 매개변수가 두 개 이상인 경우 쉼표로 매개변수 정의가 구분됩니다. 다음 다이어그램에서 기본 생성자를 정의하는 전체 문법을 확인할 수 있습니다.

보조 생성자는 클래스의 본문에 포함되고 이 생성자의 문법은 세 부분으로 구성됩니다.

  • 보조 생성자 선언. 보조 생성자 정의는 constructor 키워드로 시작하고 그 뒤에 괄호가 나옵니다. 해당하는 경우 괄호에는 보조 생성자에 필요한 매개변수가 포함됩니다.
  • 기본 생성자 초기화. 초기화는 콜론으로 시작하고 그 뒤에 this 키워드와 괄호 쌍이 나옵니다. 해당하는 경우 괄호에는 기본 생성자에 필요한 매개변수가 포함됩니다.
  • 보조 생성자 본문. 기본 생성자 초기화 뒤에 중괄호 쌍이 나오며 이 중괄호에는 보조 생성자의 본문이 포함됩니다.

다음 다이어그램에서 문법을 확인할 수 있습니다.

예를 들어 스마트 기기 제공업체에서 개발한 API를 통합하려고 하지만 이 API가 초기 기기 상태를 나타내는 Int 유형의 상태 코드를 반환합니다. API는 기기가 오프라인인 경우 0 값을, 기기가 온라인인 경우 1 값을 반환합니다. 다른 정수 값이면 상태는 알 수 없음으로 간주됩니다. 다음 코드 스니펫에서 볼 수 있듯이 SmartDevice 클래스에 statusCode 매개변수를 문자열 표현으로 변환하는 보조 생성자를 만들 수 있습니다.

class SmartDevice(val name: String, val category: String) { // 주 생성자
  var deviceStatus = "online"
  
  // 보조 생성자 
  constructor(name: String, category: String, statusCode: Int) : this(name, category) {
    deviceStatus = when (statusCode) {
      0 -> "offline"
      1 -> "online"
      else -> "unknown"
    }
  }

  fun turnOn(){
    println("Smart device is turned on.")
  }

  fun turnOff(){
    println("Smart device is turned off.")
  }
}

fun main() {
  // 주 생성자를 이용한 인스턴스 생성
  var smartTv1 = SmartDevice("LG Smart TV", "Entertainment")
  println(smartTv1.name)
  smartTv1.turnOn()
  smartTv1.turnOff()  
  println(smartTv1.deviceStatus)
  
  println("==========================================")
  
  // 보조 생성자를 이용한 인스턴스 생성
  var smartTv2 = SmartDevice("Android TV", "Entertainment", 0)
  println(smartTv2.name)
  smartTv2.turnOn()
  smartTv2.turnOff()  
  println(smartTv2.deviceStatus)
}

실행 결과 

LG Smart TV
Smart device is turned on.
Smart device is turned off.
online
==========================================
Android TV
Smart device is turned on.
Smart device is turned off.
offline

 

반응형