본문 바로가기
코틀린

코틀린에서 abstract 클래스는 무엇이고 어떻게 사용할까?

by 기계공학 주인장 2023. 3. 30.
반응형

코틀린에서 abstract 키워드는 다음과 같은 특성을 갖습니다.

  • 추상 클래스는 일반적인 클래스와는 달리 객체를 직접 생성할 수 없습니다.
  • 추상 메서드는 구현이 없이 선언만 되어 있습니다.

그렇기 때문에 abstract는 다음과 같은 상황에서 주로 사용합니다.

  • 추상 클래스나 추상 메서드를 정의할 때 사용됩니다.

추상 클래스 및 메서드 정의 예시

추상 클래스 및 메서드는 다음과 같이 상속을 통해서만 사용할 수 있습니다.

// 추상 클래스 선언
abstract class Shape {
    // 추상 메소드 선언
    abstract fun draw()
}

// Shape 클래스를 상속받는 하위 클래스
class Circle : Shape() {
    override fun draw() {
        println("원을 그립니다.")
    }
}

// Shape 클래스를 상속받는 하위 클래스
class Rectangle : Shape() {
    override fun draw() {
        println("사각형을 그립니다.")
    }
}

fun main() {
    val circle = Circle()
    circle.draw() // 원을 그립니다.

    val rectangle = Rectangle()
    rectangle.draw() // 사각형을 그립니다.
}

위 코드에서 Shpae 클래스는 추상 클래스이며 Circle 클래스와 Rectangle 클래스에 상속되어 있습니다.

 

또한 Shape 클래스에 있는 draw() 메서드를 override 하고 있습니다.

 

이렇게 추상 클래스는 객체지향 프로그래밍에서 다형성을 구현하는데 매우 유용합니다.


그럼 open class와 abstract class는 뭐가 다른걸까?

공통점을 먼저 말하자면

  • 둘 다 상속하여 사용할 수 있다
  • 둘 다 다형성을 구현하는 데 사용될 수 있다

하지만 가장 큰 차이점이 존재하는데 그것은

 

open class의 경우 일반적인 클래스이기도 하기 때문에

 

단독으로 객체가 되어 사용될 수 있습니다

 

예를 들어 open class는 다음과 같이 사용할 수 있습니다.

 

open class Animal {
    // abstract와 달리 기본 값을 가질 수 있음
    open fun makeSound() {
        println("The animal makes a sound")
    }
}

class Dog : Animal() {
    override fun makeSound() {
        println("Woof!")
    }
}

fun main() {
    // Animal 클래스는 단독으로 사용 가능
    Animal().makeSound() // The animal makes a sound
    Dog().makeSound() // Woof!
}

 

위 코드에서 보이는 것처럼 open class Animal은 일반 클래스이기도 하기 때문에

 

단독으로 쓰여 객체를 만들 수 있습니다.

 

하지만 abstract class를 위와 같이 사용할 경우 

 

에러가 발생합니다.

// 추상 클래스 선언
abstract class Shape {
    // 추상 메소드 선언
    abstract fun draw()
}


fun main() {
    // error: Cannot create an instance of an abstract class
    val shape = Shape()
}

결론

코틀린에서 abstract 키워드는 다음과 같은 특성을 갖습니다.

  • 추상 클래스는 일반적인 클래스와는 달리 객체를 직접 생성할 수 없습니다.
  • 추상 메서드는 구현이 없이 선언만 되어 있습니다.

 

open class와 abstract class의 가장 큰 차이점은

 

open class의 경우 일반적인 클래스이기도 하기 때문에 단독으로 객체가 되어 사용될 수 있지만

 

abstract는 상속되어 재정의 하는 것만 가능합니다.

반응형


"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


댓글