테크과학! DiMo
개발 환경: play.kotlinlang.org
상속 시에는 기본적으로
수퍼 클래스에 있는 함수와 같은 이름과 형태를 가진 함수는 서브 클래스에서 만들 수 없다
하지만 수퍼클래스에서 허용만 한다면 오버라이딩으로 서브클래스에서 같은 이름과 형태로 된 함수의 내용을 다시 구
현 할 수있다.
open class Animal {
// open을 붙이면 서브클래스에서 재구현이 허용된다.
open fun eat() {
println("음식을 먹습니다.")
}
}
class Tiger : Animal() {
override fun eat() {
println("고기를 먹습니다.")
}
}
fun main() {
var t = Tiger()
t.eat()
}
출력:
고기를 먹습니다.
추상화
선언부만 있고 기능이 구현되지 않은 추상 함수와 추상 함수를 포함하는 추상 클래스라는 요소로 구성된다.
abstract를 붙인 추상 클래스는 일부 함수가 구현되지 않은 미완성 클래스이기 때문에 단독으로 인스턴스를 만들 수 없
다. 반드시 서브클래스에서 상속을 받아 abstract 표시가 된 함수들을 구현해 줘야 한다.
fun main() {
var r = Rabbit()
r.eat()
r.sniff()
}
abstract class Animal {
// 추상함수는 비어있는 껍데기
abstract fun eat()
fun sniff() {
println("킁킁")
}
}
class Rabbit: Animal() {
override fun eat() {
println("당근을 먹습니다.")
}
}
출력:
당근을 먹습니다.
킁킁
다른 언어에서의 인터페이스
추상함수로만 이루어져 있는 '순수 추상화 기능'을 말하는 것
코틀린 에서의 인터페이스
인터페이스 역시 추상 함수와 일반 함수 모두를 가질 수 있다.
다만 추상함수는 생성자를 가질 수 있는 반면 인터페이스는 생성자를 가질 수 없다.
인터페이스에서 구현부가 있는 함수 -> open 함수
구현부가 없는 함수 -> abstract 함수로 간주
별도의 키워드가 없어도 포함된 모든 함수를 서브클래스에서 구현 및 재정의가 가능하다.
또한 한번의 여러 인터페이스를 상속받을 수 있으므로 좀 더 유연한 설계가 가능.
주의 해야 할 점
여러개의 인터페이스나 클래스에서 같은 이름과 형태를 구현하고 있다면 서브클래스에서 혼선이 일어나지 않도록
override를 이용하여 재구현 해줘야 한다.
fun main() {
var d = Dog()
d.run()
d.eat()
}
interface Runner {
fun run()
}
interface Eater {
fun eat() {
println("음식을 먹습니다")
}
}
class Dog : Runner, Eater {
override fun run() {
println("뛰는 중")
}
override fun eat() {
println("음식을 왕창 먹습니다.")
}
}
출력:
뛰는 중
음식을 왕창 먹습니다.
'Kotlin > 기본 문법' 카테고리의 다른 글
코틀린 강좌 #12 변수, 함수, 클래스의 접근범위와 접근제한자 (0) | 2020.12.19 |
---|---|
코틀린 강좌 #11 기본 프로젝트 구조 (0) | 2020.12.17 |
코틀린 강좌 #9 클래스의 상속 (1) | 2020.12.17 |
코틀린 강좌 #8 클래스의 생성자 (0) | 2020.12.17 |
코틀린 강좌 #7 클래스의 기본 구조 (0) | 2020.12.17 |