class 클래스명 constructor(매개변수 ) { // 주 생성자
..
constructor(매개변수) { ... } // 부 생성자
[constructor(매개변수) { ... }] // 추가 부 생성자
}
class Bird {
// property
val name: String
val age: Int
val wing: Int
val color: String
// sencodary constructor
constructor(name: String, age :Int, wing:Int, color:String) {
this.name = name;
this.age = age;
this.wing = wing;
this.color = color;
}
// 매개변수와 생성 프로퍼티 의 이름을 다르게 하면 this를 사용하지 않고도 설정
// 매개변수들은 부 생성자와 같은 생성자 오버로딩을 하고있으므로 사용할 수 없습니다
//constructor(_name:String, _age: Int, _wing: Int, color: String) {
//name = _name
//age = _age
//wing = _wing
//color = _color
//}
// secondary constructor 2
constructor(_name:String, _age:Int) {
name = _name
age = _age
}
// method
fun fly() = print("i can fly")
fun sing(vol : Int) = print(vol + " sounds")
}
fun main() {
// 생성자의 인자로 객체 생성과 동시에 초기화
val bird = Bird("lark", 3, 2, "RED")
}
1. 방법 1
class Bird constructor(_name: Stirng, _age:Int, _wing:Int, _color:String) {
val name = _name
val age = _age
val wing = _wing
val color = _color
}
2. 방법 2
class Bird(_name: Stirng, _age:Int, _wing:Int, _color:String) {
val name = _name
val age = _age
val wing = _wing
val color = _color
}
3. 방법 3
class Bird(val name: Stirng, val age:Int, val wing:Int, val color:String) {
}
class Bird(val name: Stirng, val age:Int, val wing:Int, val color:String) {
// 초기화 블록
init {
print("이름 : " + name )
print("나이 : " + age )
print("날개 수 : " + wing)
print("색상 : " + color)
}
}
class Bird(val name: Stirng = "noname"
, val age:Int, val wing:Int = 2, val color:String) {
}
// open으로 파생 가능 (다른 클래스가 상속 가능한 형태가 된다)
open class Bird { .. }
// 기반 클래스로부터 프로퍼티와 메서드를 상속받고 최종 클래스이므로 파생 불가능
class Lark : Bird() { .. }
// open 으로 상속가능한 클래스의 형태로 변경
open class Bird(val name: Stirng = "noname"
, val age:Int, val wing:Int = 2, val color:String) {
// method
fun fly() = print("i can fly")
fun birth(age : Int) = print(age + " olds")
}
// 주 생성자를 사용하는 상속
class Lark(name : String, age : Int, wing: Int, color: String)
: Bird(name, age, wing, color) {
fun color() = print("i'm "+ color);
}
// 부 생성자를 사용하는 상속
class Parrot : Bird {
val lang : String
constructor(name: String, age : Int, wing: Int, lang: String)
: super(name, age, wing, color) {
this.lang = lang // 새로 추가된 프로퍼티
}
fun speak(lang : String) = print("i can speak " +lang)
}
하위클래스는 상위 클래스의 메서드나 프로퍼티를 그대로상속하여 상위 클래스의 기능 및 자신만의 프로퍼티나 메서드를 확장할 수 있다
class Person(val name: String, val age: Int,
out : Unit = println("[primary constructor] call")) {
val fname = println("hello world")
init {
println("kitty")
}
constructor(name: String
, out: Unit = println("[secondary constructor] call"))
: this(name, 10){
println("[secondary constructor] call body")
}
}
fun main() {
val person = Person("고길동", 33)
println()
val person2 = Person("둘리")
}
실행 결과는 다음과 같다
[primary constructor] call
hello world
kitty
(공백)
[secondary constructor] call
[primary constructor] call
hello world
kitty
[secondary constructor] call body