본문 바로가기
Kotlin Language/Kotlin 기본 문법

Kotlin(코틀린) - 오버라이딩(Overriding)

by Classic Master 2023. 12. 6.
728x90

오버라이딩(Overriding)

  • 부모 클래스에서 이미 정의된 메서드를 자식 클래스에서 동일한 메서드 이름, 매개변수 타입 및 개수, 반환 타입를 가진 메서드로 다시 구현하는 것을 의미합니다. 이것은 상속 관계에서 발생하며, 자식 클래스에서 부모 클래스의 메서드를 필요에 맞게 재정의할 수 있게 해줍니다

오버로딩 (Overloading)

  • 오버로딩은 같은 클래스 내에서 메서드 이름은 동일하지만 매개변수의 타입, 개수, 또는 순서가 다른 여러 메서드를 정의하는 것입니다. 메서드가 서로 다르기 때문에 컴파일러가 호출될 메서드를 식별할 수 있습니다.

 


 

오버라이딩 사용법

open class Animal {
    open fun makeSound() {
        println("소리 모음")
    }
}
class Dog : Animal() {
    override fun makeSound() {
        println("왈! 왈!")
    }
}
fun main() {
    val dog = Dog()
    dog.makeSound() // 출력: 왈! 왈!
}
  • Dog 클래스는 Animal 클래스를 상속하고, makeSound 메서드를 오버라이딩하여 자신만의 구현을 제공합니다

인터페이스를 오버라이딩

interface Sound {
    fun makeSound()
}
class Cat : Sound {
    override fun makeSound() {
        println("냐옹!")
    }
}
class Crow : Sound {
    override fun makeSound() {
        println("까악!")
    }
}
fun main() {
    val cat = Cat()
    val crow = Crow()
    cat.makeSound() // 출력: 냐옹!
    crow.makeSound() // 출력: 까악! 
}
  • Sound 인터페이스는 하나의 추상 메서드인 makeSound를 가지고 있습니다.
  • Cat 클래스는 Sound 인터페이스를 구현하고, makeSound 메서드를 오버라이딩하여 고양이 소리를 출력합니다.
  • Crow 클래스도 Sound 인터페이스를 구현하고, makeSound 메서드를 오버라이딩하여 까마귀 소리를 출력합니다.
  • Cat 객체와 Crow 객체를 생성하고, 각 객체의 makeSound 메서드를 호출하여 각각 고양이 소리와 까마귀 소리를 출력합니다.

오버라이딩과 상위 클래스 메서드 호출

open class Vehicle {
    open fun start() {
        println("출발합니다..")
    }
}
class Car : Vehicle() {
    override fun start() {
        super.start()
        println("차량 가동합니다.")
    }
}
fun main() {
    val car = Car()
    car.start()
}
  • main 함수에서는 Vehicle 클래스는 start라는 메서드를 정의하고 있습니다. 
  • 이 메서드는 기본적으로 "출발합니다.."이라는 메시지를 출력합니다. 
  • 키워드 open은 이 클래스가 다른 클래스에서 상속될 수 있고, 메서드가 오버라이딩될 수 있음을 나타냅니다.
  • Car 클래스는 Vehicle 클래스를 상속하고 있습니다. 또한, start 메서드를 오버라이딩하고 있습니다.
  •  super.start()는 상위 클래스인 Vehicle의 start 메서드를 호출하는 구문입니다. 
  • 그 후에 "차량 가동합니다."이라는 메시지가 출력됩니다.
  • main 함수에서는 Car 클래스의 인스턴스를 생성하고, 그 인스턴스의 start 메서드를 호출합니다.
  •  이때, Car 클래스에서 오버라이딩한 start 메서드가 호출됩니다. 결과적으로 아래와 같이 출력됩니다:

Super.

  • super를 사용하여 부모 클래스의 메서드를 호출할 수 있습니다. 이를 통해 하위 클래스에서 부모 클래스의 기능을 유지하면서 추가적인 동작을 할 수 있습니다.

오버라이딩 주의사항

상위 클래스 메서드는 open이나 abstract 키워드로 표시되어야 합니다

  • 하위 클래스에서 메서드를 재정의하려면 해당 메서드가 상위 클래스에서 open이나 abstract로 표시되어야 합니다. 그렇지 않으면 하위 클래스에서 재정의할 수 없습니다.

상위 클래스의 메서드 시그니처와 일치해야 합니다

  • 하위 클래스에서 재정의하는 메서드는 상위 클래스의 메서드와 시그니처가 일치해야 합니다. 시그니처는 메서드의 이름, 매개변수의 타입과 개수, 반환 타입을 의미합니다.
open class Animal {
    open fun makeSound() {
        println("소리 효과")
    }
}
class Dog : Animal() {
    override fun makeSound() {  // 올바른 재정의
        println("멍 ! 멍 !")
    }
}// 예제에서는 makeSound()가 일치해야합니다.

 

super 키워드 사용 시 주의

  • super 키워드를 사용할 때, 무한 재귀 호출을 피하기 위해 조심해야 합니다. 즉, 하위 클래스에서 super를 호출하는 경우에는 무한 재귀에 빠지지 않도록 조심해야 합니다.
  • 무한재귀 : 함수나 메서드가 자기 자신을 계속 호출하는 상황을 말합니다. 이는 프로그램이 끝없이 재귀 호출을 반복하면서 무한 루프에 빠지게 됩니다
open class Vehicle {
    open fun start() {
        println("로딩중..")
    }
}

class Car : Vehicle() {
    override fun start() {
        super.start()  // 이 부분에서 무한 재귀에 빠질 수 있음
        println("아직도 로딩중 잠시만 기다려주세요..")
    }
}

 

final 키워드 사용 시 주의

  • 상위 클래스에서 final로 선언된 메서드는 하위 클래스에서 재정의할 수 없습니다. 따라서 재정의가 필요한 경우에는 상위 클래스에서 open 키워드를 사용하여 메서드를 표시해야 합니다.
open class Animal {
    final fun eat() {
        println("먹는중입니다.")
    }
}
class Dog : Animal() {
    // 아래 주석 해제 시 컴파일 오류 발생
    // override fun eat() { /* ... */ }
}
728x90
반응형