오버라이딩
역할
- 이미 구현이 끝난 함수의 기능을 서브 클래스에서 변경해야 할 때 사용
- 원칙적으로 서브 클래스에서 수퍼 클래스에 있는 같은 이름과 형태로 된 함수를 선언할 수 없지만 오버라이딩을 통해 이를 가능하도록 해준다.
기본 형태
- 수퍼 클래스에서 open이 붙은 함수는 서브 클래스에서 override를 붙여 재구현 하면 됨
- 수퍼 클래스: open fun 함수명() {}
- 서브 클래스: override fun 함수명() {}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
open class Animal(){
open fun eat(){
println("음식을 먹습니다.")
}
}
class Cat : Animal(){
override fun eat(){
println("생선을 먹습니다.")
}
}
fun main(){
var t = Cat()
t.eat()
}
추상화
역할 및 구성
- 형식만 선언하고 실제 구현은 서브클래스에 일임할 때 사용하는 기능
- 선언부만 있고 기능이 구현되지 않은 추상함수, 추상함수를 포함하는 추상클래스로 구성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
abstract class Person(){
abstract fun eat()
fun introduce(){
println("안녕하세요.")
}
}
class woman: Person(){
override fun eat(){
println("밥을 먹습니다.")
}
}
fun main(){
var w = woman()
w.eat()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
abstract class Person(){
//abstract fun eat()
open fun introduce(){
println("안녕하세요.")
}
}
class woman: Person(){
override fun introduce(){
println("밥을 먹습니다.")
}
}
fun main(){
var w = woman()
w.introduce()
}
- 위와 같이 open 사용해서 override 가능
인터페이스
- 추상화의 또 다른 방법
- 추상함수: 생성자를 가질 수 있다.
- 인터페이스: 생성자를 가질 수 없다.
- 한 번에 여러 인터페이스 상속 가능
- 서로 다른 기능들을 여러개 물려주어야 할 때 유용한 기능
- 구현부가 있는 함수는 open 함수로, 구현부가 없는 함수는 abstract 함수로 간주한다.
- 별도의 키워드가 없어도 서브 클래스에서 구현 및 재정의가 가능
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
interface Runner{
fun run()
}
interface Eater{
fun eat(){
println("음식을 먹습니다.")
}
}
class Dog: Runner, Eater{
override fun run(){
println("폴짝 폴짝")
}
override fun eat(){
println("간식을 먹습니다.")
}
}
fun main(){
var d = Dog()
d.run()
d.eat()
}