연습장/이론

클래스 2. 주생성자와 보조생성자

아이른 2024. 1. 26. 16:49

- constructor(생성자)

: 인스턴스의 속성을 초기화 + 인스턴스 생성시 구문을 수행.(init로 호출)

: class 클래스명(속성) 클래스의 속성 선언 = 생성자 선언.

: 클래스를 만들 때, 기본적으로 선언(주생성자) + 필요에 따라 추가적으로 선언(보조생성자)

- 프라이머리 생성자(Primary Constructior) 

: 주생성자. init{} 

- 세컨더리 생성자(Secondary Constructor)

: 보조생성자. constructor(){}


- 주생성자와 init 사용. 

: init 사용이 메소드보다 가장 먼저 호출 됨을 볼 수 있음.

fun main() {
    val Lan: Person = Person("혜란",30,"책읽기")
    Lan.name = "혜란"
    Lan.age = 30
    Lan.hobby = "책읽기"

    println(Lan.name)
    Lan.walk("혜란")
    Lan.stop("혜란")
}
class Person(var name: String, var age: Int, var hobby : String){

init{
        println("${name}, ${age}, ${hobby} 초기화 완료")
    }
    fun walk(name : String){
        println("${name} 걷기")
    }
    fun stop(name : String){
        println("${name} 멈추기")
    }
}
fun main(){
    var a = Person("A", 1990)
    var b = Person("B", 2000)
    var c = Person("C", 2010)
}
class Person(var name:String, val birthYear:Int){
    init{
        println("${this.birthYear}년생 ${this.name}입니다")
    }
}
<print>
혜란, 30, 책읽기 초기화 완료
혜란
혜란 걷기
혜란 멈추기
<print>
1990년생 A입니다
2000년생 B입니다
2010년생 C입니다

 

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


- 보조생성자와 constructor 사용.

: 보조 생성자를 만들 때에는 반드시 주생성자를 통해 속성을 초기화 해줘야 함.

: 주생성자 -> 보조생성자 순으로 호출.

fun main() {
    val Lan: Person = Person("혜란",30,"책읽기","여성")
    Lan.name = "혜란"
    Lan.age = 30
    Lan.hobby = "책읽기"
    Lan.walk("혜란")
}
class Person(var name: String, var age: Int, var hobby : String){
init{
        println("${name}, ${age}, ${hobby} 초기화 완료")
    }
    constructor(name : String, age : Int, hobby : String, gender: String) : this(name, age, hobby){
        println("보조생성자 확인. ${gender}")
    }
    fun walk(name : String){
        println("${name} 걷기")
    }
}
fun main(){
    var a = Person("A", 1990)
    var b = Person("B", 2000)
    var c = Person("C", 2010)
    var d = Person("D")
    var e = Person("E")
    var f = Person("F")
    a.introduce("혜란",1994)
}
class Person(var name:String, val birthYear:Int){
    init{
        println("${this.birthYear}년생 ${this.name}입니다")
    }
    constructor(name:String): this(name, 1995){
        println("보조 생성자가 사용되었습니다")
    }
    fun introduce(name:String, birthYear: Int){
        println("${name}이고, ${birthYear}년생 입니다")
    }
}
<print>
혜란, 30, 책읽기 초기화 완료
보조생성자 확인. 여성 
혜란 걷기
<print>
1990년생 A입니다
2000년생 B입니다
2010년생 C입니다
1995년생 D입니다
보조 생성자가 사용되었습니다
1995년생 E입니다
보조 생성자가 사용되었습니다
1995년생 F입니다
보조 생성자가 사용되었습니다
혜란이고, 1994년생 입니다

 

: 보조 생성자가 주생성자를 호출하도록 하려면 :this 사용하고 주생성자가 필요로 하는 파라미터를 ()안에 넣으면 됨. 

: :this(name, 1995) 와 같이 birthYear 1995을 기본값으로 주생성자와 다른 형태의 생성자를 만들 수 있음.

- 보조생성자만으로 사용 가능. (주생성자 값 전부 제거)

: 주생성자가 있든 없든 init 사용 시, 최우선적으로 호출.

fun main() {
    val Lan: Person = Person("혜란",30,"책읽기")
    Lan.walk("혜란")
    val Han: Person = Person("혜란",30,"책읽기","여성")
    Han.walk("혜란")
}
class Person {
init{
        println("초기화 완료")
    }
    constructor(name : String, age : Int, hobby : String, gender: String){
        println("보조생성자 확인. ${gender}")
    }
    constructor(name : String, age : Int, hobby : String){
        println("보조생성자2 확인. ${name}, ${age}, ${hobby}")
    }

    fun walk(name : String){
        println("${name} 걷기")
    }
}
fun main() {
    val Lan: Person = Person("혜란",30,"책읽기","여성")
    Lan.walk("혜란")
    val Han: Person = Person("혜란",30,"책읽기")
    Han.walk("혜란")
}
class Person {
    constructor(name : String, age : Int, hobby : String, gender: String){
        println("보조생성자 확인. ${gender}") 
    }
    constructor(name : String, age : Int, hobby : String){
        println("보조생성자2 확인. ${name}, ${age}, ${hobby}")
    } 

    fun walk(name : String){
        println("${name} 걷기")
    }
}

<print>
초기화 완료
//호출 1 : val Lan > init
보조생성자2 확인. 혜란, 30, 책읽기
//호출 2 : val Lan > (첫번째 x)(두번째) constructor,
               name/age/hhobby 값 
 
혜란 걷기
//호출 3 : val Lan > function
초기화 완료
//호출 4 : val Han > init
보조생성자 확인. 여성
//호출 5 : val Han > (첫번째) constructor, gender 값
혜란 걷기
//호출 5 : val Han > function
<print>
보조생성자 확인. 여성
//호출 1 : (첫번째) constructor, gender 값
혜란 걷기
//호출 2 : val Lan > function
보조생성자2 확인. 혜란, 30, 책읽기
//호출 3 : val Lan > (첫번째 x)(두번째) constructor,
               name/age/hhobby 값 
혜란 걷기
//호출 4 : val Han > function