[Kotlin] Abstract class, Open class

Subeen·2023년 11월 28일
0

Kotlin 문법

목록 보기
7/23

abstract class

  • abstract class는 추상 클래스를 의미한다.
  • abstract 내부에 abstract 멤버를 하나 이상 가진 클래스를 의미한다.
  • 추상 클래스는 객체의 추상적인 상위 개념으로 공통된 개념을 표현할 때 사용한다.
  • 추상 클래스는 그 자체의 객체를 생성할 수 없다.
  • 생성자는 가질 수 있는데 생성자는 하위 클래스에서 추상 클래스를 상속 받을 때 사용하며 추상 클래스의 concrete 프로퍼티를 초기화 하는데 쓸 수 있다.
  • open 키워드를 따로 추가하지 않아도 된다.

추상 클래스 정의

  • 추상 클래스로 만들기 위해서는 abstract 변경자 키워드를 붙인다.
  • 추상 클래스의 메소드는 추상 메소드와 일반 메소드 사용이 가능하며 추상 메소드의 경우 abstract키워드를 사용하여 정의한다.
  • 추상 메소드는 구현 없이 선언만 되어 있으며 선언만 되어 있기에 반드시 하위 클래스에서 재정의(override)해야 된다.
fun main() {
    val addOperation = AddOperation()
    val add = addOperation.operation(10, 20)
    println(add)  // 30.0
    
    val SubtractOperation = SubtractOperation()
    val sub = SubtractOperation.operation(10, 5)
    println(sub)  // 5.0
}

abstract class AbstractOperation {  // 추상 클래스 선언
    abstract fun operation(num1: Int, num2: Int): Double  // 추상 메소드 선언
}

class AddOperation: AbstractOperation() {  // AbstractOperation 상속 받는 하위 클래스
    override fun operation(num1: Int, num2: Int): Double {
        return (num1 + num2).toDouble()
    }
}

class SubtractOperation: AbstractOperation() {  // AbstractOperation 상속 받는 하위 클래스
    override fun operation(num1: Int, num2: Int): Double {
        return (num1 - num2).toDouble()
    }
}

open class

  • open class는 상속 가능한 클래스를 정의할 때 사용한다.
  • kotlin의 클래스는 기본적으로 상속이 불가능하므로 open 변경자를 사용하여 상속받을 수 있도록 허용한다.
  • 일반적인 클래스이기도 하기에 단독으로 객체가 되어 사용 될 수 있다.
fun main() {
    // open class인 Animal 클래스는 단독 사용이 가능하다.
    Animal().printSound()  // growl growl!
    Dog().printSound()  // bark bark!
    Cat().printSound()  // mew mew!
}

open class Animal() {
    open fun printSound() {  하위 클래스에서 선택적으로 override 할 수 있다.
        println("growl growl!")
    }
}

class Dog: Animal() {
    override fun printSound() {
        println("bark bark!")
    }
}

class Cat: Animal() {
    override fun printSound() {
        println("mew mew!")
    }
}

abstract class vs open class

  • abstract class는 객체를 생성할 수 없지만 open class는 단독으로 객체가 되어 사용 할 수 있다.
  • abstract class의 멤버는 override가 필수인 반면 open class의 멤버는 선택적으로 override할 수 있다.
  • abstract 메소드의 경우 구현 없이 선언만 하는 반면 open 메소드는 반드시 바디를 가져야 한다.
profile
개발 공부 기록 🌱

0개의 댓글