본문 바로가기
Kotlin

코틀린 - 클래스 생성자와 상속

by sinabeuro 2023. 5. 1.
728x90

 

다양한 생성자 선언

class Person constructor(name: String, age: Int) {

    var name: String = name
    var age: Int = age

    init {
        if (age <= 0) {
            throw IllegalArgumentException("나이는 ${age}일 수 없습니다.")
        }
    }
}

class Person1(
    val name: String,
    val age: Int
) {
    init {
        if (age <= 0) {
            throw IllegalArgumentException("나이는 ${age}일 수 없습니다.")
        }
    }
}

class Person2 constructor(name: String, age: Int) {

    var name: String = name
    var age: Int = age

    constructor(name: String): this(name, 1)

    constructor(): this("홍길동") {
        println("두 번째 부생성자")
        println(name)
        println(age)
   }

    init {
        if (age <= 0) {
            throw IllegalArgumentException("나이는 ${age}일 수 없습니다.")
        }
    }
}

fun main() {
    val person = Person("홍길동", 1)
    println(person)
    person.age = 10
    println(person)

    val person1 = Person1("홍길동", 10)
    println(person1.age)

    val person2 = Person2("홍길동")
    println(person2.age)

    val person3 = Person2()
}

 

 

함수 문과 식(statement vs expression)

{
    fun isAdult1(): Boolean {
        return this.age >= 20
    }

    val isAdult2: Boolean
        get() = this.age >= 20

    val isAdult3: Boolean
        get() {
            return this.age >= 20
        }
}

 

자바로 변환 시 함수 앞에 final 이 붙습니다.

모두 동일한 기능이고 표현 방식만 다릅니다.

객체의 속성이라면, custom getter를 쓴다. 그렇지 않다면 함수를 씁니다.

 

custom getter, setter 선언 방법

    var name: String = name
        get() = field.uppercase()
        set(value) {
            field = value.uppercase()
        }

 

 

abstract class Animal(
    protected val species : String,
    protected open val legCount : Int,
) {
    abstract fun  move()
}

 

class Penguin(
    species: String,
    private val wingCount: Int = 2
) : Animal(species, 2) {

    override fun move() {
        println("팽귄이 움직입니다.")
    }

    override val legCount: Int
        get() = super.legCount + this.wingCount

}

 

추상 클래스는 인스턴스화 할 수 없다.

 

 

 

상속의 특징

상속 관련 키워드 4가지 정리

1. final : override 를 할 수 없게 한다. default 로 보이지 않게 존재한다.

2. open : override 를 열어 준다.

3. abstract : 반드시 override 해야 한다.

4. override : 상위 타입을 오버라이드 하고 있다.

 

상속 또는 구현을 할 때에 : 을 사용해야 한다.

상위 클래스 상속을 구현할 때 생성자를 반드시 호출해야 한다.

override 를 필수로 붙여야 한다.

추상 맴버가 아니면 기본적으로 오버라이드가 불가능하다.

- open 을 사용해주어야 한다.

상위 클래스의 생성자 또는 초기화 블록에서 open 프로퍼티를 사용하면 얘기치 못한 버그가 생길 수 있다.

 

728x90

'Kotlin' 카테고리의 다른 글

코틀린 - Object 함수(Companion)  (0) 2023.05.01
코틀린 - 접근 제어자  (0) 2023.05.01
Kotlin - 기본 문법2  (0) 2023.04.17
Kotlin - 기본 문법1  (0) 2023.03.27
Kotlin - 변수 선언  (0) 2023.03.01

댓글