[Kotlin] 클래스의 생성자, 상속 설명 & 예제

728x90

생성자

class Person(var name:String, val birth Year:Int)

새로운 인스턴스를 만들기 위해 호출하는 특수한 함수
-> 생성자를 호출하면 클래스의 인스턴스를 만들어 반환 받을 수 있다.

생성자의 역할

  1. 인스턴스의 속성을 초기화
  2. 인스턴스 생성시 구문을 수행

기본생성자

fun main() {
    var a = Person("박보영", 1990)
    var b = Person("김수미", 1997)
    var c = Person("정장수", 1994)
}

class Person(var name: String, val birthYear: Int) {
    init {
        println("${this.birthYear}년생 ${this.name}님이 생성되었습니다.")
    }
}

 

보조생성자

여러 값 겹쳐서 기본 값으로 지정해주고 싶을때 사용

fun main() {
    var a = Person("박보영", 1990)
    var b = Person("김수미", 1997)
    var c = Person("장수", 1994)

    println()

    var d = Person("A")
    var e = Person("B")
    var f = Person("C")
}

class Person(var name: String, val birthYear: Int) {
    init {
        println("${this.birthYear}년생 ${this.name}님이 생성되었습니다.")
    }
    //기본 생성자가 있어야 한다 , 우 -> name , birthYear
    //birthYear 고정, 자동으로 넣어준다
    constructor(name: String) : this(name, 1997) {
        println("보조 생성자가 사용되었습니다.")
    }
}

 

클래스의 상속

상속이 필요한 경우 두가지

  1. 이미 존재 클래스 확장 -> 새로운 속성이나 함수를 추가한 클래스가 필요할때
  2. 여러개의 클래스를 만들었는데 클래스의 공통점을 뽑아 코드 관리를 편하게 하기 위해

슈퍼 클래스

속성과 함수를 물려주는 쪽

서브 클래스

물려 받는 쪽

상속의 규칙

  1. 서브 클래스는 슈퍼 클래스에 존재하는 속성과 '같은 이름'의 속성을 가질 수 없음
  2. 서브 클래스가 생성 될 때는 반드시 슈퍼 클래스의 생성자까지 호출되어야 함

클래스의 상속은 코드를 구조화 할 수 있는 장점이 있지만 지나치면 너무 복잡해지므로 적당히 쓸 것

fun main() {
    var a = Animal("흰둥이", 5, "개")
    var b = Dog("흰둥이", 5)

    //같은 값이 된
    a.introduce()

    b.introduce()
    b.bark()

    println()

    var c = Cat("루이", 1)
    c.introduce()
    c.meow()
}

//코틀린은 상속금지가 기본이기 때문에 open 붙여줘야 상속 받을 수 있다
open class Animal(var name: String, var age: Int, var type: String) {
    //동물의 정보 함수
    fun introduce() {
        //클래스 자신의 속성임이 확실한 경우는 this 사용하지 않아도 무관
        println("저는 ${type} ${name}이고 ${age}살 입니다.")
    }
}

//var, val 등으로 붙이면 속성으로 선언되기 때문에 안됨
//type은 공통 값이므로 '개'로 고정
class Dog(name: String, age: Int) : Animal(name, age, "개") {
    //Dog만의 함수 추가
    fun bark() {
        println("멍멍")
    }
}

class Cat(name: String, age: Int) : Animal(name, age, "고양이") {
    fun meow() {
        println("야옹 야옹")
    }
}

 

728x90

댓글

Designed by JB FACTORY