티스토리 뷰

728x90

1. constructor

- primary 생성자

class UserInfo constructor(val name: String, val age: Int, val birthday: String)
  • primary 생성자의 constructor 는 생략 가능
  • val/ var 로 전역 변수 선언 가능

- secondary 생성자

class UserInfo {
	constructor(name: String, age: Int) 
}

val/ var 로 전역 변수 선언 할 수 없다
따라서 아래와 같이 코드를 작성해야 한다. 

class UserInfo {
	
    var name: String = ""
    var age: Int = 0
    constructor(name: String, age: Int) {
    	this.name = name
        this.age = age
	}
}        


결론은, primary 생성자를 적극 활용하는게 좋다. (코드가 훨씬 짧죠?)

class UserInfo(val name: String, val age: Int, val birthday: String) {
    
    constructor(name: String, age: Int): this(name, age, "")
    
    constructor(name: String): this(name, 0)
}    

 


default 생성자를 활용하면 더더 짧아진다.

class UserInfo(
    val name: String = "Name"
    val age: Int = 0,
    val birthdahy: String = "2000-01-01") {
}    

 



Java 에서도 생성자 Overloading 문제가 없도록 작성하려면 @JvnOverloads constructor 를 추가해주자.
(Java에서는 default 생성자가 없기 때문에, 모든 파라미터를 작성해야 한다.)

class UserInfo @JvmOverloads constructor(
    val name: String = "Name",
    val age: Int = 0,
    val birthday: String = "2000-01-01") {
}    

 



Primary 생성자의 변수들을 조작하는 코드들은 어디다가 작성하나요?

응 init block 이란게 있어.

Kotlin constructor - init block

The primary constructor cannot contain any code.
Initialization code can be placed in initializer blocks, which are prefixed with the init keyword:

출처: KotlinLang 공식 Docs

class UserInfo @JvmOverloads constructor(
    val name: String = "Name",
    val age: Int = 0,
    val birthday: String = "2010-01-01") {
    
    init {
    	// 초기화
	}
}    

kotlin에서는 init block 이 항상 제일 먼저 실행됨을 기억하세요


Sample("name", 10); // Sample 클래스 생성


/******************/
class Sample {
    init {
    	println("init")
    }
    
    constructor(name: String) {
    	println("constructor")
    }
    
    constructor(name: String, age: Int): this(name) {
    	println("two constructor)
    }
}

 맨 첫줄의 코드를 실행하면 출력 결과는 다음과 같습니다. 

init
constructor
two constructor

 


2. Constructor 에서 Validation Check

- java

public class UserInfo {
    private String name = "Name"
    private int age = 0;
    private String birthday = "2000-10-01";
    
    public UserInfo(String name, int age, String birthday) {
      if (TextUtil.isEmpty(name) == false) {
          this.name = name;
      }

      if (age > 0) {
          this.age = age;
      }
      if (TextUtil.isEmpty(birthday) == false) {
          this.birthday = birthday;
      }
    }
}  

 

- kotlin 

class UserInfo @JvmOverloads constructor(
    name: String = "Name",
    age: Int = 0,
    birthday: String = "2000-01-01") {
    
    // 전역 변수를 정의
    val name: String
    val age: Int
    val birthday: String
    
    // validation check
    init {
    	this.name = name.takeIf { it.isNotEmpty() } ?: ""
        this.age = age.takeIf { it > 0 } ?: 0
        this.birthday = birthday.takeIf { it.isNotEmpty() } ?: ""
    }
}    

참고로 위의 코드는 constructor의 매개변수 선언 시에 val, var을 지정하지 않고 전역변수를 따로 설정하였습니다. 

즉, kotlin primary constructor 의 생성자는 val/ var을 선택적으로 사용할 수 있다는 겁니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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 31
글 보관함