java - constructor (생성자)
public class UserInfo {
private String name;
private int age;
private String birthday;
public UserInfo(String name) {
this.name = name;
}
public UserInfo(String name, int age) {
this(name);
this.age = age;
}
public UserInfo(String name, int age, String birthday) {
this(name, age);
this.birthday = birthday;
}
}
kotlin - constructor (생성자)
class UserInfo {
var name : String = ""
var age : Int = 0
var birthday : String = ""
constructor(name : String) {
this.name = name
}
constructor(name : String, age : Int) : this(name) {
this.age = age
}
constructor(name : String, age : Int, birthday : String) : this (name, age) {
this.birthday = birthday
}
}
-> primary 생성자
// primary 생성자의 constructor 생략 가능
class UserInfo constructor(val name : String, val age : Int, val birthday : String)
-> secondary 생성자
class UserInfo {
constructor(name : String, age : Int)
}
-> primary 생성자
- val/var로 전역 변수 선언 가능
class UserInfo constructor (val name : String, val age : Int, val birthday : String)
-> secondary 생성자
- val/var로 전역 변수 선언 할 수 없다.
class UserInfo {
constructor (name : String, age : Int)
}
class userInfo {
var name : String = ""
var age : Int = 0
constructor (name : String, age : Int) { // secondary 생성자
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, "") // java 에서 활용하기 위해 secondary 생성자 생성
constructor (name : String) : this(name, 0) // java 에서 활용하기 위해 secondary 생성자 생성
}
- default 값을 추가해보자! // 위의 코드 대신 사용 가능!!
class UserInfo(
val name : String = "Name",
val age : Int = 0,
val birthday : String = "2000-01-01" ) {
}
kotlin constructor - call java
- java에서 사용하기 위해서 Overloading 처리하자!
- @JvmOverloads constructor을 추가
class UserInfo @JvmOverloads constructor (
val name : String = "Name",
val age : Int = 0,
val birthday : String = "2000-01-01" ) {
}
constructor에서 validation 체크
-> java
public class UserInfo{
private String name = "Name";
private int age = 0;
private String birthday = "2000-01-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(birtyday) == false) {
this.birthday = birthday;
}
}
}
kotlin constructor - init block
class UserInfo @JvmOverloads constructor (
val name : String = "name",
val age : Int = 0,
val birthday : String = "2000-01-01" ) {
init {
// 초기화
}
}
// 변수로 정의하지 않은 값을 받아옴
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() } ?: ""
}
}
class Sample {
init {
println ("init")
}
constructor (name : String) {
println ("constructor")
}
constructor (name : String, age : Int) : this(name) {
println("two constructor")
}
}
class ExampleKotlinUnitTest {
fun test() {
Sample ( "", 0 ) // init constructor two constructor 출력 - init이 제일먼저 출력됨!!
}
}
// this(name) 제거
class Sample {
init {
println ("init")
}
constructor (name : String) {
println ("constructor")
}
constructor (name : String, age : Int) {
println("two constructor")
}
}
class ExampleKotlinUnitTest {
fun test() {
Sample ( "", 0 ) // init constructor two constructor 출력 - init이 제일먼저 출력됨!!
}
}
-> secondary 생성자 제거
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() } ?: ""
}
}
-> init 블록 지우기
class UserInfo @JvmOverloads constructor (
name : String = "Name"
age : Int = 0,
birthday : String = "2000-01-01") {
// 전역 변수를 정의
val name : String = name.takeIf { it.isNotEmpty() } ?: ""
val age : Int = age.takeIf { it > 0 } ?: 0
val birthday : String = birthday.takeIf { it.isNotEmpty() } ?: ""
}
-> 불러온 값을 출력하거나 체크해야 될때는 init 블록 써줘야됨!!
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() } ?: ""
println("name ${this.name}")
}
}
-> init 블록안에 불러온 값 출력하는 코드만 넣을 때
class UserInfo @JvmOverloads constructor (
name : String = "Name"
age : Int = 0,
birthday : String = "2000-01-01") {
// 전역 변수를 정의
val name : String = name.takeIf { it.isNotEmpty() } ?: ""
val age : Int = age.takeIf { it > 0 } ?: 0
val birthday : String = birthday.takeIf { it.isNotEmpty() } ?: ""
// validation check
init {
println("name ${this.name}")
}
}
'# 02 > 코틀린' 카테고리의 다른 글
[Kotlin] Sealed Classes (0) | 2019.07.12 |
---|---|
[Kotlin] Companion Object (0) | 2019.07.12 |
[Kotlin] Class Inheritance (0) | 2019.07.11 |
[Kotlin] Null 예외처리 - etc (0) | 2019.07.11 |
[Kotlin] Null 예외처리 (0) | 2019.07.11 |