카테고리 없음

코틀린(생성자)

sangwoon 2022. 6. 23. 14:23

생성자란 무엇인가?

예시를 보며 알면 좋을 것이다.

class User1{
    var name = "ggg"
    constructor (name: String){
        this.name = name
        
    }
    fun print(){
        println("name : $name")
    }
}

코틀린의 생성자는 constructor이라는 키워드로 선언하는 함수이다.

class 안에 멤버 변수를 선언하고 생성자로 받은 값을 멤버 변수에 넣어주어 사용하는 것이다.

 

그럼 생성자란?

역할 객체를 생성할 때 항상 실행되는 것으로, 객체를 초기화해주기 위해 맨 처음 실행되는 메소드를 말한다.

 

주 생성자란?

 

주 생성자는 constructor로 클래스 내부에 선언한다.

class User constructor(){}

하지만 주 생성자를 생성할 때 constructor은 생략이 가능하다.

class User(){}

그리고 주 생성자는 필요에 따라 매개변수를 선언할 수도 있다 .

 

그럼 이제 주 생성자의 매개변수를 class 내부 맴버 변수에 전달하는 여러가지 방법에 대해 알려주겠다.

 

init 영역

 

init 영역은 주 생성자뿐만 아니라 보조 생성자에서도 사용된다.

간단하게 설명하면 클래스 객체를 생성할 때 init 영역에 작성한 코드를 자동으로 실행시킬 때 쓴다.

이 말은 

생성자를 호출할 때 init 영역이 실행되므로 생성자의 매개변수에 접근이 가능하기도 하다.

 

예시)

class User2(name: String, count:Int){
    var name: String
    var count:Int
    init {
        this.name = name
        this.count = count
        
    }
    fun print(){
        println("name : $name, count: $count")
    }
}

이렇게 생성자의 매개변수를 class 안에 맴버 변수에게 담아 

객체 생성시 실행할 수 있다. 

 

참고로 코틀린 객체 생성하는 법은 

val user2 = User2("sangwoon",2)

 

이런식으로 new를 사용하지 않는다(자바랑 다름)

 

매개변수를 바로 멤버 변수로 선언하는 방법

내가 가장 많이 사용하고 제일 편한 방법이라고 생각해서 

예시를 준다. 

결국 지금까지 쓴 class의 constructor,init 그리고 지금 알려줄 이것 모두 동일한 기능을 한다는 것을 잊으면 안된다.

 

예시)

class User2(val name: String, val count:Int){
    fun print(){
        println("name: $name, count: count")
    }
}

이런식으로 생성자의 매개변수를 클래스의 멤버 변수로 바로 선언할 수 있다.

또 알아둬야할 것은 주 생성자만 매개변수를 받을 때 val,var 을 사용할 수 있다~~

 

 

보조 생성자란?

보조 생성자는 클래스 본문에서 constructor 키워드로 선언하는 함수이다.

그리고 보조 생성자는 하나의 클래스 안에서 여러 개를 추가할 수 있다.

class User{
    constructor(name :String){
        println("only name")
    }
    constructor(name: String,count:Int){
        println("name and count")
    }
}

위에 예시처럼 하나의 클래스의 2개의 보조 생성자를 추가했다.

직접 메인 함수에서 출력 해보자

fun main() {
    User("limsangwoon")
    User("sangwoon",1)
    
}

실행 결과

only name

name and count

 

이렇게 클래스 안에 두 개의 생성자를 만들고 각 생성자의 맞는 파라미터의 인자값을 넣어주니 잘 처리를 하는 것을 알 수 있다.

 

보조 생성자 + 주 생성자

우리는 주 생성자와 보조 생성자에 대해 배웠다.

하지만 이 두가지를 한 클래스에 사용을 한다면 문제가 생긴다.

class User(name:String){
	constructor(name:String,count:Int){
    }
}

위와 같이 작성을 하면 error가 발생한다는 것이다.

 

하지만 해결하기 위한 방법이 있다.

바로 보조 생성자는 객체를 생성할 때 호출되며, 이때 클래스 내에 주 생성자가 있다면 this() 구문을 이용해 주 생성자를 호출해야한다.

 

예시)

class User(name:String){
	constructor(name: String,count:Int): this(name) {
    (..생략..)
    }
}
fun main(){
	val user = User("kkang",10)
}

이렇게 하면 보조 생성자로 객체를 생성할 때 주 생성자가 함께 호출된다.