본문 바로가기

# 02/코틀린

[Kotlin] Class initializer

반응형

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