앱 개발/Kotlin

Class(클래스 구조, 생성자)

태기 2023. 2. 25. 12:10

<< git 소스코드 >>

 

코틀린은 파일 이름과 클래스 이름이 달라도 된다.

하나의 파일 안에 여러 클래스를 넣는것도 가능하다.

1. 클래스 생성과 선언

class Human {
    val name = "taek"
    fun born() {
        println("New human has been born!!")
    }
}

fun main() {
    val human = Human()
    println("this human's name is ${human.name}")
    human.born()
}

기본적인 클래스 구조이다

 

2. 생성자

class Human constructor (name: String){
    val name = name
    fun born() {
        println("New human has been born!!")
    }
}

fun main() {
    val human = Human("taek")
    println("this human's name is ${human.name}")
    human.born()
}

 

객체를 생성할 때 이름을 건네주어 Human 객체를 생성하도록 생성자를 만드려면 constructor을 선언하고 옆에 매개변수를 선언하면 된다.

 

만약, 위처럼 생성자에 매개변수와 클래스 내부의 변수명이 같다면 매개변수에 한 번만 선언해줄 수도 있다

constructor은 생략 가능하다

따라서 다음과 같이 바꿀 수 있다

class Human (val name: String){
    fun born() {
        println("New human has been born!!")
    }
}

여기서, 생성자에 변수를 초기화를 해준다

class Human (val name: String = "Anonymous"){
    fun born() {
        println("Human's name is ${name}")
    }
}

fun main() {
    val human = Human("taek")
    val human2 = Human()
    println("this human's name is ${human.name}")
    human.born()
}

초기화를 해주면 객체를 생성할 때 빈 파라미터로 생성해도 생성이 된다.

 

주 생성자

위 코드를 보면 생성자로 객체를 생성할 때 변수만 생성하고 코드 블럭을 사용할 수 없다. 코드 블럭을 사용하려면 init을 쓰면 된다.

class Human (val name: String = "Anonymous"){
    init {
        println("created Human")
    }

    fun born() {
        println("New human has been born!!")
    }
}

 

부 생성자

constructor을 선언해서 부 생성자를 만들어준다.

부 생성자는 주 생성자를 물려받아야 한다.

class Human (val name: String = "Anonymous"){
    constructor(name: String, age: Int) : this(name) {
        println("my name is ${name}, ${age} years old")
    }
    init {
        println("created Human")
    }

    fun born() {
        println("New human has been born!!")
    }
}

fun main() {
    val human = Human("taek")
    val human2 = Human()
    val human3 = Human("taeki", 10)
    println("this human's name is ${human.name}")
    human.born()
}

실행을 해보면, 부 생성자가 생성되기 전에 init 안에 있는 코드가 먼저 실행이 될 것이다.

 

주의해야할 점은, 부 생성자가 생성되기 전에 주 생성자의 init 코드가 먼저 실행된다는 것을 생각해야한다.