[Kotlin] Constructor & Inheritance

sundays·2023년 3월 11일
0

kotlin

목록 보기
16/19

Constructor

  • 클래스를 생성할때 기본적으로 생성되는 함수
  • 객체 생성시 값을 인자로 설정한다
class 클래스명 constructor(매개변수 ) { // 주 생성자
	..
    constructor(매개변수) { ... } // 부 생성자
    [constructor(매개변수) { ... }] // 추가 부 생성자
}

생성자

  • Primary Constructor
    • 클래스명과 함께 호출되며 constructor가 생략되어 생성될 수 있다
  • Secondary 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) {

}

Inheritance

  • 자식 클래스를 만들때 상위 클래스의 속성과 기능을 물려받아 계승한다
  • 상위 클래스의 프로퍼티와 메서드가 자식에게 적용된다

open 키워드

// open으로 파생 가능 (다른 클래스가 상속 가능한 형태가 된다)
open class Bird { .. } 
// 기반 클래스로부터 프로퍼티와 메서드를 상속받고 최종 클래스이므로 파생 불가능
class Lark : Bird() { .. }
  • 모든 클래스들은 묵시적으로 Any를 상속한다

상속 예제

// 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

profile
develop life

0개의 댓글