클래스와 생성자
class Data{ // 선언부
//본문 내용이 업다면 생략가능
}
fun main(){
val data = Data()
data.함수()
}
클래스의 멤버는 생성자, 변수, 함수, 클래스로 구성됩니다. 코틀린에서 객체를 생성할 때 new키워드를 사용하지 않습니다.
코틀린에서는 생성자를 주생성자와 보조 생성자로 구분합니다. 한 클래스에서 주 생성자만으로도 보조 생성자만으로도 또는 둘 다 선언할 수 있습니다. 코틀린의 생성자는 constructor키워드로 선언하는 함수입니다.
주 생성자
class Data constructor(name:String){
}
위코드는 주 생성자를 선언하는 코드입니다. 주 생성자는 한 클래스에 하나만 존재할 수 있습니다. 주 생성자 constructor 키워드는 생략가능합니다. 만약 주생 성자를 만들지 않으면 컴파일러가 매개변수가 없는 주생 성자를 자동으로 추가합니다.
보통 클래스나 함수의 본문은 중괄호({})로 감싸지만 주생성자는 클래스 선언부에 있기 때문에 중괄호를 사용할 수 없습니다. 그래서 init 키워드를 이용해 주생 성자의 본문을 구현합니다.
class Data1( name : String ){
var name : String
init{
this.name= name
}
fun printName(){
println(name)
}
}
class Data2( val name : String ){
fun printName(){
println(name)
}
}
fun main(){
val data1 = Data1("tester")
data1.printName() // tester
val data2 = Data2("tester")
data1.printName() // tester
}
클래스에서 init영역은 꼭선언할 필요는 없습니다. 본문을 구현하고 싶을 때만 사용합니다. 기본적으로 생성사의 매개변수는 지역변수이기 때문 클래스의 다른 함수에서는 매개변수에 다른 조치를 하지 않는 이상 매개변수를 사용할 수 없습니다.
지역변수를 클래스 내부에서 사용할 수 있게 하는 조치 중 하나는 위 소스의 Data1 클래스처럼 멤버 변수에 이 값을 저장하는 것입니다. 또 하나는 Data2처럼 매개변수를 선언할 때 val이나 var 키워드로 선언하는것입니다. 이렇게할경우 매개변수는 클래스의 맴버변수가 됩니다.
* 원래 함수에서는 매개변수를 선언할때 val이나 var 키워드로 선언할 수 없고, 주 생성자만 유일하게 가능합니다.
보조생성자
class Data{
constructor(name:String){
println("1")
}
constructor(name:String,age:Int){
println("2")
}
}
보조생성자는 클래스의 본문에 constructor 키워드로 선언하는 함수입니다. 클래스의 본문에선언하므로 여러개를 추가 할수 있습니다.
class Data(name:String){
constructor(name:String,age:Int):this(name){
//본문
}
constructor(name:String,age:Int,text:String):this(name,age){
//본문
}
}
이렇게 주 생성자와 보조 생성자를 모두 선언한다면 반드시 생서자끼리 연결해주어야 합니다. 안그러면 오류가 납니다.