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
반응형
'Kotlin Language > Kotlin 기본 문법' 카테고리의 다른 글
Kotlin(코틀린) - 제네릭(Generic) (0) | 2023.12.07 |
---|---|
Kotlin(코틀린) - 확장함수(Extension functions) (0) | 2023.12.07 |
Kotlin(코틀린) - 지연 초기화(lateinit , lazy) (0) | 2023.12.07 |
Kotlin(코틀린) - 스코프 함수(let, with, run, apply, also) 정리 (0) | 2023.12.06 |
Kotlin(코틀린) - 고차함수(Higher-order Function) (0) | 2023.12.06 |
Kotlin(코틀린) - 널 안전성 (Null-Safety) (0) | 2023.12.05 |