반응형
코틀린은 클래스를 정의할 때 동시에 생성자를 만들도록 할 수 있다.
다음 코드를 보자.
<생성자 자동 생성>
class Person(var name:String){
}
fun main() {
var person1 = Person("Lee")
println("person1의 이름은: ${person1.name}")
}
>> 출력
>> person1의 이름은: Lee
자바와는 다르게 코틀린은 클래스를 작성할 때 함수처럼 인자를 받을 수 있다.
위와 같이 클래스 객체 생성 시에 "Lee"라는 인자를 바로 넘겨주면 자동으로 생성자가 만들어지기 때문에
person1.name을 출력해보면 "Lee"가 할당되었음을 알 수 있다.
참고: init은 클래스 생성시 자동으로 실행되는 함수다.
class Person(var name:String){
init {
println("생성자 호출됨. 이름: $name")
}
}
fun main() {
var person1 = Person("Lee")
println("person1의 이름은: ${person1.name}")
}
>> // 출력
>> 생성자 호출됨. 이름: Lee
>> person1의 이름은: Lee
<생성자 직접 생성>
자바처럼 생성자를 직접 작성할 수도 있다.
class Person{
var name:String? = null
var age:Int? = null
constructor(){
}
constructor(_name:String?){
this.name = _name
}
constructor(_name:String?, _age:Int?){
this.name = _name
this.age = _age
}
}
fun main() {
var person1 = Person()
println("첫번째 사람 이름: ${person1.name} 나이: ${person1.age}")
var person2 = Person("Kim")
println("두번째 사람 이름: ${person2.name} 나이: ${person2.age}")
var person3 = Person("Park", 20)
println("세번째 사람 이름: ${person3.name} 나이: ${person3.age}")
}
// 출력
첫번째 사람 이름: null 나이: null
두번째 사람 이름: Kim 나이: null
세번째 사람 이름: Park 나이: 20
<생성자 자동 생성 + 생성자 직접 생성>
둘을 합쳐서 사용할 수도 있다. 단 이때는 constructor 뒤에 :을 붙이고 this(_name)을 추가시켜주어야 오류가 발생하지 않는다. 아래 코드의 결과를 보면
첫번째 사람은 생성자 자동생성을 사용했기 때문에 이름만 제대로 할당이 되었고
두번째 사람은 생성자 자동생성+직접생성을 사용했기 때문에 이름, 나이, 주소가 모두 할당되었다.
참고로 constructor 안에는 this.name = _name을 해줄 필요가 없다. 이미 생성자 생성 시 자동으로 할당되었기 때문이다.
class Person(var name:String?){
var age:Int? = null
var address:String? = null
constructor(_name:String?, _age:Int?, _address:String?):this(_name){
this.age = _age
this.address = _address
}
}
fun main() {
var person1 = Person("Kim")
println("첫번째 사람 이름: ${person1.name} 나이: ${person1.age} 주소: ${person1.address}")
var person2 = Person("Lee", 20, "Seoul")
println("두번째 사람 이름: ${person2.name} 나이: ${person2.age} 주소: ${person2.address}")
}
// 출력
첫번째 사람 이름: Kim 나이: null 주소: null
두번째 사람 이름: Lee 나이: 20 주소: Seoul
댓글