생성자란 무엇인가?
예시를 보며 알면 좋을 것이다.
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)
}
이렇게 하면 보조 생성자로 객체를 생성할 때 주 생성자가 함께 호출된다.