6) 상속과 다형성

SOCICAL·2024년 6월 22일

android

목록 보기
19/20
post-thumbnail

Kotlin에서는 객체지향 프로그래밍(OOP)의 중요한 개념인 상속과 다형성을 지원한다.

# 상속 (Inheritance)

  • 클래스가 다른 클래스의 속성과 메서드를 상속받아 재사용하고 확장할 수 있게 하는 기능이다.
  • Kotlin에서는 기본적으로 클래스가 final로 선언되어 있어 상속이 불가능하다. 상속을 허용하려면 open 키워드를 사용해야 한다.

- 기본 클래스 (Superclass)

open class Animal(val name: String) {
    open fun sound() {
        println("$name makes a sound")
    }
}

- 하위 클래스 (Subclass)

class Dog(name: String) : Animal(name) {
    override fun sound() {
        println("$name barks")
    }
}

class Cat(name: String) : Animal(name) {
    override fun sound() {
        println("$name meows")
    }
}

- 상속을 활용한 예제

fun main() {
    val dog = Dog("Buddy")
    dog.sound() // 출력: Buddy barks

    val cat = Cat("Whiskers")
    cat.sound() // 출력: Whiskers meows
}

# 다형성 (Polymoriphism)

  • 동일한 인터페이스나 상위 클래스를 사용하여 서로 다른 타입의 객체를 다룰 수 있게 하는 기능이다.
  • 다형성을 통해 객체의 구체적인 타입을 알지 못해도 동일한 방식으로 다룰 수 있다.

- 예제: 다형성 활용

fun main() {
    val animals: Array<Animal> = arrayOf(Dog("Buddy"), Cat("Whiskers"))

    for (animal in animals) {
        animal.sound() // 각 Animal 객체의 sound() 메서드 호출
    }
}

- 출력 결과

Buddy barks
Whiskers meows

# 추상 클래스 (Abstract class)

  • 인스턴스를 생성할 수 없으며, 상속을 통해서만 사용될 수 있는 클래스이다.
  • 추상 메서드를 포함할 수 있으며, 추상 메서드는 하위 클래스에서 반드시 구현해야 한다.

- 추상 클래스 선언

abstract class Shape(val name: String) {
    abstract fun area(): Double
    abstract fun perimeter(): Double
}

- 하위 클래스에서 추상 메서드 구현

class Circle(name: String, val radius: Double) : Shape(name) {
    override fun area(): Double {
        return Math.PI * radius * radius
    }

    override fun perimeter(): Double {
        return 2 * Math.PI * radius
    }
}

class Rectangle(name: String, val width: Double, val height: Double) : Shape(name) {
    override fun area(): Double {
        return width * height
    }

    override fun perimeter(): Double {
        return 2 * (width + height)
    }
}

- 추상 클래스 사용 예제

fun main() {
    val shapes: Array<Shape> = arrayOf(Circle("Circle", 3.0), Rectangle("Rectangle", 4.0, 5.0))

    for (shape in shapes) {
        println("${shape.name} - Area: ${shape.area()}, Perimeter: ${shape.perimeter()}")
    }
}

- 출력 결과

Circle - Area: 28.274333882308138, Perimeter: 18.84955592153876
Rectangle - Area: 20.0, Perimeter: 18.0

# 인터페이스 (Interface)

  • 클래스가 구현해야 하는 메서드의 집합을 정의한다.
  • 인터페이스를 통해 다중 상속을 구현할 수 있다.

- 인터페이스 선언

interface Drivable {
    fun drive()
}

interface Flyable {
    fun fly()
}

- 인터페이스 구현

class Car : Drivable {
    override fun drive() {
        println("Car is driving")
    }
}

class Airplane : Drivable, Flyable {
    override fun drive() {
        println("Airplane is taxiing")
    }

    override fun fly() {
        println("Airplane is flying")
    }
}

- 인터페이스 사용 예제

fun main() {
    val car: Drivable = Car()
    car.drive() // 출력: Car is driving

    val airplane: Airplane = Airplane()
    airplane.drive() // 출력: Airplane is taxiing
    airplane.fly() // 출력: Airplane is flying
}

0개의 댓글