728x90

생성자

  • 기본 생성자와 명시적 생성자가 존재
  • 기본 생성자는 이전까지 클래스를 만들던 행위와 차이가 없음
  • 명시적 생성자는 주 생성자와 부 생성자로 구분할 수 있음 // Init (주 생성자), Constructor (부 생성자)

주생성자의 예시 

fun main() {
    val people1 = People("사람1", 10, 100.0, 30.0)
    println(people1.name) //주생성자
                          //사람1
    people1.run()   // 뛴다.
}
class People(_name: String, _age: Int, _height: Double, _weight: Double) {
    var name = ""
    var age = 0
    var height = 0.0
    var weight = 0.0
    init {                  //생성시 프로퍼티 초기화 
        println("주생성자")
        name = _name
        age = _age
        height = _height
        weight = _weight
    }
    fun run() {
        println("뛴다.")
    }
}

또는

fun main() {
    val people1 = People("사람1", 10, 100.0, 30.0)
    println(people1.name) //주생성자
                          //사람1
    people1.run()   // 뛴다.
}
class People(val name: String,val age: Int, val height: Double,val weight: Double) {

    init {                  //생성시 프로퍼티 초기화
        println("주생성자")

    }
    fun run() {
        println("뛴다.")
    }
}

val 키워드를 붙여주면 생성과 동시에 초기화 작업을 할 수 있음 

 

부생성자

fun main() {
    val people1 = People("사람1", 10, 100.0, 30.0)
//    gender 없는 생성자
//    이름 : 사람1
//    나이 : 10
//    몸무게 : 100.0
//    키 : 30.0 
    val people2 = People("사람2", 20, 160.3, 56.7, "남자")
//    gender 있는 생성자
//    이름 : 사람2
//    나이 : 20
//    몸무게 : 160.3
//    키 : 56.7
//    성별: 남자 
}

class People {
    var name = ""
    var age = 0
    var weight = 0.0
    var height = 0.0
    var gender = ""

    constructor(_name: String, _age: Int, _weight: Double, _height: Double) {
        println("gender 없는 생성자")
        println("이름 : $_name")
        println("나이 : $_age")
        println("몸무게 : $_weight")
        println("키 : $_height")
    }

    constructor(_name: String, _age: Int, _weight: Double, _height: Double, _gender: String) {
        println("gender 있는 생성자")
        println("이름 : $_name")
        println("나이 : $_age")
        println("몸무게 : $_weight")
        println("키 : $_height")
        println("성별: $_gender")
    }
}

 

주생성자와 부생성자의 차이

  • 한 가지의 형태로 클래스를 실체화할때는 주 생성자를 활용할 수 있다.
  • 항상 <이름, 나이,몸무게,키>만 생성자에서 최초로 코드를 실행할 때는 주 생성자를 사용한다.
  • 여러 형태로 클래스를 실체화할때는 보조 생성자(부생성자)를 활용할 수 있다.
  • <이름, 나이,몸무게>  또는 < 이름, 나이,몸무게,키,성별> 처럼 여러개의 생성자를 통해 최초로 코드를 실행할 때는 부 생성자를 이용한다. 

만약, 100명의 사람의 인스턴스를 만든다고 했을 때, 절반의 사람이 1995년생 이라면? 

보조 생성자를 이용해서 코드량을 줄일 수도 있다. 

fun main() {
    val a = People("김",1990) //init 실행: 이름은 : 김 , 출생년도는 : 1990 입니다.
    val b = People("이",1980) //init 실행: 이름은 : 이 , 출생년도는 : 1980 입니다.
    val c = People("박",1995) //init 실행: 이름은 : 박 , 출생년도는 : 1995 입니다.
    val d = People("최") /*init 실행: 이름은 : 최 , 출생년도는 : 1995 입니다.
                                 보조 생성자 생성 :이름 : 최 , 출생년 : 1995      */

    val e = People("강") /*init 실행: 이름은 : 강 , 출생년도는 : 1995 입니다.
                                 보조 생성자 생성 :이름 : 강 , 출생년 : 1995      */

    val f = People("문") /*init 실행: 이름은 : 문 , 출생년도는 : 1995 입니다.
                                 보조 생성자 생성 :이름 : 문 , 출생년 : 1995      */
}
class People(val name: String, val birthYear: Int){
    init {
        print("init 실행: ")
        println("이름은 : $name , 출생년도는 : $birthYear 입니다.")
    }
    constructor(name: String) :this(name,birthYear = 1995){
        print("보조 생성자 생성 :")
        println("이름 : $name , 출생년 : $birthYear")
    }
}

 

+ Recent posts