[Kotlin] 오버라이딩, 추상화, 인터페이스 설명 & 예제
- Language/Kotlin
- 2021. 2. 1.
728x90
오버라이딩
상속에서는 기본적으로 수퍼클래스와 같은 속성을 가진 서브클래스를 만들수 없다
fun a(v: Int) -> (x) fun a(v: Int)
하지만 슈퍼 클래스에서 '오버라이딩'이라는 형태로 허용한다면
같은 이름과 형태로 된 함수의 내용을 다시 구현할 수 있다.
fun main() {
var t = Tiger()
t.eat()
}
open class Animal {
//eat 함수를 오버라이드 하기 위해 open
open fun eat() {
println("음식을 먹습니다.")
}
}
class Tiger : Animal() {
//open 이 붙은 함수를 override
override fun eat() {
println("고기를 먹습니다.")
}
}
추상화
선언부만 있고 기능이 구현되지 않은 추상함수 , 추상함수를 포함하는 추상클래스로 구성되어 있다.
abstract를 붙인 추상 클래스는 일부 함수가 구현되지 않은 미완성 클래스이기 때문에 단독으로는 인스턴스를 만들 수 없습니다.
따라서 반드시 상속받고 abstract 표시가 된 함수를 구현해줘야 한다.
fun main() {
var r = Rabbit()
r.eat()
r.sniff()
}
//추상함수 = 빈껍데기
abstract class Animal {
abstract fun eat()
fun sniff() {
println("킁킁")
}
}
class Rabbit : Animal() {
//abstract -> override
override fun eat() {
println("당근을 먹습니다.")
}
}
추상화를 하는 또다른 방법 : interface
코틀린에서 인터페이스는 속성, 추상함수, 일반함수 모두 가질 수 있다.
다만, 추상함수는 생성자를 가질 수 있는 반명 인터페이스는 가질 수 없다.
인터페이스에서
구현부가 있는 함수 -> open 함수
구현부가 없는 함수 -> abstract 함수로 간주
따라서 별도 키워드가 없어도 서브클래스에서 구현 및 재정의 가능
또한 한번에 여러 인터페이스 상속 받을 수 있으므로 좀더 유연한 설계 가능
fun main() {
//두 인터페이스의 형식들을 모두 물려받아 사용하는 서브클래스가 됨
var d = Dog()
d.run()
d.eat()
}
interface Runner {
//구현부 없는 함수
fun run()
}
interface Eater {
fun eat() {
println("음식을 먹습니다.")
}
}
class Dog : Runner, Eater {
//구현부 없는 run
override fun run() {
println("우다다다 뜁니다")
}
//구현부 있는 override 재구현
override fun eat() {
println("허겁지겁 먹습니다.")
}
}
정리
오버라이딩 -> 이미 구현이 끝난 함수의 기능을 서브클래스에서 변경해야 할때
추상화 -> 형식만 선언, 실제 구현은 서브클래스에 일임할때 사용
인터페이스 -> 서로 다른 기능들을 여러개 물려주어야 할떄 유용한 기능
728x90
'Language > Kotlin' 카테고리의 다른 글
[Kotlin] 스코프, 접근제한자 설명 & 예제 (0) | 2021.02.02 |
---|---|
[Kotlin] 코틀린의 기본 프로젝트 구조 설명 & 예제 (0) | 2021.02.02 |
[Kotlin] 클래스의 생성자, 상속 설명 & 예제 (0) | 2021.02.01 |
[Kotlin] 클래스의 기본구조 설명 & 예제 (0) | 2021.01.29 |
[Kotlin] 흐름제어, 논리 연산자 설명 & 예제 (0) | 2021.01.29 |