개발(Android)/kotlin syntax

[Kotlin syntax] Constructor

shinyelee 2022. 5. 23. 15:27

[코틀린 문법] 생성자

fun main() {

    var bts = Singer("정국", 1997)
    var txt = Singer("연준", 1999)
    var aespa = Singer("윈터", 2001)
    var nmixx = Singer("설윤", 2004)
//    안녕하세요, 1997년생 정국입니다.
//    안녕하세요, 1999년생 연준입니다.
//    안녕하세요, 2001년생 윈터입니다.
//    안녕하세요, 2004년생 설윤입니다.

}

// constructor(생성자) //
// 새 인스턴스를 만들기 위해 호출하는 특수한 함수
// 인스턴스 속성 초기화 && 인스턴스 생성시 구문 수행
// () 안에 클래스가 가지는 속성 == 생성자

// init //
// 파라미터/반환형 없는 함수
// 생성자 -> 인스턴스 생성시 호출됨

// this //
// 인스턴스 자신의 속성이나 함수를 호출하기 위해 클래스 내에서 사용되는 키워드

class Singer (var name: String, val birthYear: Int) {
    init {
        println("안녕하세요, ${this.birthYear}년생 ${this.name}입니다.")
    }
}
// 수정

fun main() {

    var bts = Singer("정국", 1997)
    // 보조생성자 -> 은우와 지효도 자동으로 1997년생 됨
    var astro = Singer("은우")
    var twice = Singer("지효")
//    안녕하세요, 1997년생 정국입니다.
//    안녕하세요, 1997년생 은우입니다.
//    보조생성자가 사용되었습니다.
//    안녕하세요, 1997년생 지효입니다.
//    보조생성자가 사용되었습니다.

}

// secondary constructor(보조 생성자) //
// 필요에 따라 추가적으로 선언
// 기본 생성자와 다른 형태의 생성자 제공
// -> 인스턴스 생성시 편의 제공 또는 추가적인 구문 수행
// (기본 생성자는 클래스를 만들 때 기본으로 선언)

class Singer (var name: String, val birthYear: Int) {
    init {
        println("안녕하세요, ${this.birthYear}년생 ${this.name}입니다.")
    }
    constructor(name: String) : this(name, 1997) {
        // 보조 생성자를 만들 때는 반드시 기본 생성자를 통해 속성을 초기화 해줘야 함
        // : this 쓴 후 기본 생성자가 필요로 하는 파라미터를 ()안에 넣어주면 됨
        println("보조생성자가 사용되었습니다.")
    }
}

// 생성자 보충설명 (1)

fun main() {

    val human = Human("shinyelee")

    human.eatingCake()
//    yummy!

    println("My name is ${human.name}")
//    My name is shinyelee

}

// 생성자가 없는 클래스의 예시
class Human1 {}

// 생성자가 있는 클래스의 예시
class Human2() {} // 인자 0개
class Human3(age : Int) {} // 인자 1개
class Human4(fistName : String, lastName : String) {} // 인자 2개 이상

// 클래스 선언부에서 클래스명 옆에 괄호를 붙여 생성자를 만듦
// -> 기본 생성자
class Human(name : String) {

    val name : String = name
//    Property is explicitly assigned to parameter name, so it can be declared directly in constructor

    fun eatingCake() {
        println("yummy!")
    }

}
// 생성자 보충설명 (2)

fun main() {

// 위와 동일

}

// class Human constructor(val name : String) {}
// constructor 생략 가능
class Human(val name : String) {
    // 프로퍼티를 생성자에서 직접 선언 -> 코드 깔끔해짐

    fun eatingCake() {
        println("yummy!")
    }

}
// 생성자 보충설명 (3)

fun main() {

    val human = Human("shinyelee")

    // ()안에 name 안 넣어도 컴파일 오류가 나지 않음
    // -> 기본값을 anonymous로 설정했기 때문
    val who = Human()

    human.eatingCake()
//    yummy!

    println("My name is ${who.name}")
//    My name is anonymous

}

// 디폴트값 부여함
class Human(val name : String = "anonymous") {

    fun eatingCake() {
        println("yummy!")
    }

}
// 생성자 보충설명 (4)

fun main() {

    val human = Human("shinyelee")
//    인스턴스 생성할 때 함께 실행됨

    val who = Human()
//    인스턴스 생성할 때 함께 실행됨

    human.eatingCake()
//    yummy!

    println("My name is ${who.name}")
//    My name is anonymous

}

class Human(val name : String = "anonymous") {

    init {
        println("인스턴스 생성할 때 함께 실행됨")
    }

    fun eatingCake() {
        println("yummy!")
    }

}
// 생성자 보충설명 (5)

fun main() {

    // 주생성자 -> 부생성자 순으로 실행
    // init 먼저 실행 후 -> constructor 블럭 실행
    
    val myBro = Human("min", 27)
//    인스턴스 생성할 때 함께 실행됨
//    My name is min, and 27 years old

}

// 주생성자
class Human(val name : String = "anonymous") {

    // 부생성자 -> this로 주생성자의 위임을 받아야 함
    constructor(name : String, age : Int) : this(name) {
        println("My name is ${name}, and ${age} years old")
    }

    // init -> 주생성자의 일부
    init {
        println("인스턴스 생성할 때 함께 실행됨")
    }

    fun eatingCake() {
        println("yummy!")
    }

}

참고

 

[Kotlin]생성자 초간단 이해하기

새로운 언어를 공부하는 것은 늘 새롭고 재밌다(아님 말고..). 코틀린 또한 마찬가지다. 구글이 작년에 이것을 안드로이드 공식 언어로 채택한 후로 보기 시작한 언어인데 여러모로 재미난 사항

medium.com

반응형