[Kotlin] 추상화

neoneoneo·2024년 3월 6일
0

kotlin

목록 보기
23/49
post-custom-banner

배경

Kotlin은 객체지향 프로그래밍 언어이다. 객체지향 프로그래밍에서 반드시 언급되는 키워드 중 추상화라는 것이 있다. 단어 자체는 많이 들어 봤지만, 추상화를 학습할 때 overriding, interface와 같은 개념들이 함께 언급되면서 머리 속을 복잡하게 한다. 이들은 비슷한 듯하지만 각자 다른 역할을 하기에 명확하게 구분하여 이해할 필요가 있는 것 같다.

본 포스팅에서는 추상화의 개념에 대해 살펴보고 kotlin 언어로 사례를 살펴보자.


사전 지식 : 클래스와 객체

  • 클래스와 객체를 사용하여 데이터와 함수를 '캡슐화'하고 추상화를 구현할 수 있다.
  • 클래스는 객체를 생성하기 위한 템플릿이며, 객체는 클래스의 인스턴스이다(like 붕어빵틀 - 붕어빵).

사전 지식 : override

  • 상위 클래스에서 명세된 함수를 하위 클래스에서 재정의하여 사용할 수 있다.
class Car(val brand: String, val model: String) {
    fun start() {
        println("Engine started")
    }
    fun stop() {
        println("Engine stopped")
    }
}
val myCar = Car("Toyota", "Camry")
myCar.start()

Kotlin에서는 여러 방식으로 추상화를 지원한다.

1. Abstrac class (추상 클래스)

  • 추상 클래스를 사용하여 함수의 일부만을 구현하고, 함수의 나머지 부분은 하위 클래스에서 구현하도록 강제할 수 있다.
    • 상위 클래스에서는 함수에 대한 선언을, 하위 클래스에서는 함수에 대한 디테일을 명세한다.
    • 추상 클래스는 추상 함수를 포함한다.
  • 추상 클래스는 안에 품고 있는 함수가 완성되지 않았다고 보기 때문에 단독으로 객체를 생성할 수 없다.
    • 하위 클래스에서 상속을 받아 추상 함수의 동작 부분을 구현해야 한다.
abstract class Animal { // 추상 클래스
    abstract fun makeSound() // 추상 함수. 선언만 해둔다.
    fun sleep() {
        println("Zzzzz")
    }
}
class Dog : Animal() {
    override fun makeSound() { // override하여 상세 동작을 명세한다.
        println("Woof! Woof!")
    }
}

2. Interface (인터페이스)

  • 인터페이스는 추상 함수와 일반 함수, 프로퍼티의 선언을 포할 수 있는 추상화 방법이다. 인터페이스에는 구현을 포함하지 않으며, 클래스나 다른 인터페이스에서 이를 구현하도록 강제한다.
    • 생성자를 가질 수 없다.
    • open이나 abstract 키워드가 없어도 포함된 모든 함수를 하위 클래스에서 구현하고 재정의 할 수 있다.
      • 구현부가 있으면 open, 없으면 abstract 함수로 간주한다.
    • 한 번에 여러 인터페이스를 상속할 수 있다.
  • 코스 재사용성과 다중 상속을 지원하는 데에 사용된다.
interface Shape { //인터페이스
    fun calculateArea(): Double
}
class Circle(val radius: Double) : Shape {
    override fun calculateArea(): Double {
        return 3.14 * radius * radius
    }
}
fun main() {
	var m = Mango()
    m.taste()
    m.color()
}
interface Tasty {
	fun taste()
}
interface Color {
	fun color() {
    	println("색이 밝다.")
    }
}
class Mango: Tasty, Color { // 두 개의 인터페이스를 상속 받아 사용함
	override fun taste() {
    	println("달콤하다.")
    }
    override fun color() {
    	println("노랗다.")
    }
}

[TIL-240306]

post-custom-banner

0개의 댓글