클래스 정의

지시자 정의

지시자는 클래스의 상속이나 멤버들의 접근 범위를 제한함.

클래스 정의

class Person constructor(var age: Int) : Any() {
    var message = ""
    var name: String = ""
    var isMarried = false

    init {
        message = "안녕하세요"
        println(message)
    }
    
    // 주 생성자 위임 호출
    constructor(age: Int, name: String) : this(age) {
        this.name = name
        this.age = age
    }

    // 보조 생성자 위임 호출
    constructor(age: Int, name: String, isMarried: Boolean = false) : this(age, name) {
        this.name = name
        this.age = age
        this.isMarried = isMarried
    }

    fun printAge() {
        print(age)
    }
		

    class Parent() {
        // 내부 클래스 로직
    }

    object Object {
        // 내부 객체 로직
    }
}

fun main() {
    val person = Person(18) // 주 생성자 호출
    val sister = Person(19, "누나임") // 보조 생성자 호출 (주 생성자 위임 호출)
    val brother = Person(20, "형임", false) // 보조 생성자 호출 (보조 생성자 위임 호출)
}
컴파일러는 생성자가 없는 클래스는 주 생성자를 자동으로 만들어준다.
주 생성자와 보조 생성자를 모두 정의하면 항상 주 생성자까지 호출하여 전체 속성에 값을 갱신할 수 있어야 함.

**Tip**
너무 많은 보조 생성자가 만들어지면 불편하므로, 초깃값 등을 부여해 보조 생성자의 작성을 줄이자.

주 생성자 가시성 처리

fun main() {
    val singleton = Singleton.instance
}

class Singleton private constructor() {
    // 싱글톤 객체 생성
    companion object {
        val instance: Singleton by lazy { Singleton() }
    }
    // 클래스 내부 로직
}

메서드 참조