Kotlin 12. 초기화하기

이도현·2023년 8월 10일
0

Kotlin 공부

목록 보기
12/20

1. 기본생성자

class Player(_name: String, 
             _healthPoints:Int, 
             _isBlessed: Boolean, 
             _isImmortal: Boolean) {
  var name = _name
  	get() = field.capitalize()
    set(value) {
  		field = value.trim()
  }
  
  val healthPoints = _healthPoints
  val isBlessed = _isBlessed
  private val isImmortal = _isImmortal
  
  fun castFireball(numFireballs: Int = 2) =
  	println("한 덩어리의 파이어볼이 나타난다. (x$numFireballs)")
}

생성자의 매개변수와 클래스의 프로퍼티가 이름이 겹칠 경우, 구분을 위해 생성자의 매개변수 이름 앞에 언더스코어(_)를 붙이는 관례가 있습니다.

  • 기본 생성자 속성 정의
class Player(_name: String,
            var healthPoints:Int, 
            var isBlessed: Boolean, 
            private val isImmortal: Boolean) {
  var name = _name
    get() = field.capitalize()
    set(value) {
    	field = value.trim()
  }
  
  fun castFireball(numFireballs: Int = 2) =
  	println("한 덩어리의 파이어볼이 나타난다. (x$numFireballs)")
}

2. 보조생성자

  • 생성자에 대한 오버로드 지원
  • constructor 이름으로 정의
    - this로 다른 생성자 호출
class Player(_name: String,
            var healthPoints:Int, 
            var isBlessed: Boolean, 
            private val isImmortal: Boolean) {
  var name = _name
    get() = field.capitalize()
    set(value) {
    	field = value.trim()
  }
  
  constructor(name:String) : this(name, 
              healthPoints=100, 
              isBlessed=true,
              isImmortal=false)
  fun castFireball(numFireballs: Int = 2) =
  println("한 덩어리의 파이어볼이 나타난다. (x$numFireballs)")
}

속성 초기화 추가

class Player(_name: String,
            var healthPoints:Int, 
            var isBlessed: Boolean, 
  			private val isImmortal: Boolean) {
  var name = _name
    get() = field.capitalize()
    set(value) {
      field = value.trim()
  	}
    
  constructor(name:String) : this(name, 
            healthPoints=100, 
            isBlessed=true,
            isImmortal=false) {
  	if(name.toLowerCase() == "kar") healthPoints = 45
  }
  
  fun castFireball(numFireballs: Int = 2) =
  	println("한 덩어리의 파이어볼이 나타난다. (x$numFireballs)")
}

기본인자

class Player(_name: String,
          var healthPoints:Int = 100, // 기본인자
          var isBlessed: Boolean, 
          private val isImmortal: Boolean){
  var name = _name
    get() = field.capitalize()
    set(value) {
  		field = value.trim()
  }
  constructor(name:String) : this(name, 
            //healthPoints=100,	이거 지울 수 있음 기본인자가 있으니
            isBlessed=true,
            isImmortal=false) {
  	if(name.toLowerCase() == "kar") healthPoints = 45
  }
  fun castFireball(numFireballs: Int = 2) =
  	println("한 덩어리의 파이어볼이 나타난다. (x$numFireballs)")
}

// 다양한 생성자 호출 방법
Player("Madrigal", 64, true, false)
Player("Madrigal", true, false)
Player("Madrigal")

지명인자

  • 인자가 많아지면 순서에 의한 인자 매핑이 해석하기 힘들어짐
  • 인자명을 이용하여 인자를 지정
Player(name = "Madrigal", 
      healthPoints = 64, 
      isBlessed = true, 
      isImmortal=false)

초기화 블록

  • init { }로 정의
  • 속성값의 검사 및 설정을 수행
class Player(_name: String,
            var healthPoints:Int = 100, 
            var isBlessed: Boolean, 
            private val isImmortal: Boolean) {
  :
  init {
    require(healthPoints > 0, {"healthPoints는 0보다 커야 합니다."})
    require(name.isNotBlank(), {"플레이어는 이름이 있어야 합니다."})
  }
}

require 특정 조건이 참인지 검사하고 그렇지 않으면 예외를 발생시키는 데 사용

초기화 순서

  • 기본 생성자에 정의된 속성에 인자값 지정
  • 클래스 내부에 지정된 속성에 초기값 지정
  • 초기화 블록에서 속성에 초기값 지정 및 함수 호출/실행
  • 보조 생성자에서 송성의 초기값 지정및 기본 생성자 호출
profile
좋은 지식 나누어요

0개의 댓글