개요
코틀린에서는 객체 지향 프로그래밍과 함수형 프로그래밍 모두 지원하기 때문에,
객체 지향 프로그래밍을 위한 다형성으로 오버라이딩과 오버라이딩이 있다. 오늘은 이것에 대해 정리해보려고 한다.
오버로딩(Overlaoding)
오버로딩은 이름은 같지만 형태를 다르게 해서 메소드를 여러개 선언하는 것을 말한다.
코드로 예를 들자면,
class Example(){
fun coding(language : String) : String{
return "$language"
}
fun coding(studyCount : Int) : Int{
return studyCount
}
fun coding(language : String, studyCount : Int) : String{
return "$language $studyCount 번 공부함"
}
}
첫 번째, coding은 language라는 String 타입의 매개변수를 가지고 있다.
두 번째, coding은 studyCount라는 Int 타입의 매개변수를 가지고 있다.
마지막, coding은 lanugage라는 String 타입과, studyCount라는 Int 타입의 매개변수를 가지고 있다.
동일한 이름이지만 매개변수의 수, 매개변수의 타입에 따라 메소드를 다르게 정의할 수 있다.
이것을 '오버로딩' 이라고 한다.
매개변수와 타입은 오버로딩에 큰 역할을 하지만 반환 타입은 상관이 없다고 한다.
오버라이딩(Overriding)
슈퍼(부모)클래스를 상속받은 서브(자식)클래스에서 슈퍼(부모) 클래스에 정의되어 있는 메서드를 '재정의' 하는 것을 의미한다.
마찬가지로, 코드를 통해 알아보자.
open class Caffe{
open fun makeDrink(menu : String) : String{
println("뭐를 만들어 볼까?")
return menu
}
}
class Coffee : Caffe(){
override fun makeDrink(menu : String) : String{
println("커피가 좋겠군")
return menu
}
}
class Juice : Caffe(){
override fun makeDrink(menu : String) : String{
println("역시 주스지")
return menu
}
}
fun main(){
val caffe = Caffe()
val coffee = Coffee()
val juice = Juice()
caffe.makeDrink("메뉴정하기") //뭐를 만들어볼까? -> 메뉴정하기
caffe.makeDrink("커피") // 커피가 좋겠군 -> 커피
caffe.makeDrink("주스") // 역시 주스지 -> 주스
}
부모 클래스에 해당하는 Caffe를 만들고, menu라는 매개변수와 String을 반환하는 makeDrink라는 메소드를 만들었다.
그 뒤 각각 open 키워드를 붙여 상속이 가능하게끔 만들어준다.
그리고 Coffee, Juice에 Caffe를 상속하고 makeDrink라는 부모 클래스의 메소드를 override를 통해 오버라이딩 해준다.
이때, 부모 클래스 = Caffe의 makeDrink의 매개변수와 리턴 타입은 동일하게 해줘야 한다.
Coffee, Juice에 오버라이딩된 makeDrink 메소드에 각각의 매개변수와 리턴타입을 지정해주고 이를 실행시켜보면 위의 코드와 같이 나타난다.
'Language > kotlin' 카테고리의 다른 글
[Kotlin] object와 companion object의 초기화 시점 (0) | 2024.08.09 |
---|---|
[Kotlin] lateinit & lazy (0) | 2024.08.08 |
[Kotlin] Coroutine (0) | 2024.07.23 |
[Kotlin] 스코프함수(Scope function) (1) | 2024.07.05 |
[Kotlin] 추상 클래스 & 인터페이스 (0) | 2024.06.10 |