티스토리 뷰
인터페이스
• 구현부 없이 틀을 만들어 놓은 것
• 인터페이스를 상속한 클래스는 해당 인터페이스의 틀을 지켜야 한다.
- 일종의 규약(프로토콜)이다.
- 지켜야 하는 규약이기 때문에, 클래스 내부를 보지 않고 인터페이스만 봐도 어떤 멤버가 들어있는 지 등의 사용법 유추가 가능하다.
• 자료형으로 쓸 수 있다.
• 다중 상속, 다중 구현이 가능하다.
interface Tiger {
fun bite()
fun hide()
}
interface Bird {
fun fly()
}
class BackDoSanTiger: Tiger, Bird {
override fun bite() { // Tiger 인터페이스의 bite 구체적 구현
println("문다.")
}
override fun hide() { // Tiger 인터페이스의 hide 구체적 구현
println("숨는다.")
}
override fun fly() { // Bird 인터페이스의 fly 구체적 구현 -> 다중 상속이 가능하다.
println("난다.")
}
}
val backDoSanTiger: BackDoSanTiger = BackDoSanTiger()
backDoSanTiger.bite() // 문다 출력
backDoSanTiger.hide() // 숨는다 출력
backDoSanTiger.fly() // 난다 출력
* 코틀린에서의 인터페이스
• 원래 인터페이스의 문제점
- 인터페이스는 구현부가 없는 틀이다.
-> 따라서, 상속받은 클래스에서 반드시 구현해야 한다.
-> 이는 해당 인터페이스를 상속받은 클래스가 만약 여러 개라 하더라도, 그 클래스들 전부를 구현해주어야 한다는 뜻이다.
-> 구현할 내용 중 공통된 부분이 었더라도, 각 클래스마다 따로 일일이 구현해주어야 한다.
-> 이는 불편하고, 코드의 낭비이다.
• 그래서 코틀린은 인터페이스에서 메소드를 구현할 수 있게 지원해준다.
* 프로퍼티는 안 되고 메소드 구현만 지원
interface Person {
var age: Int
fun eat()
fun walk() { // 코틀린은 인터페이스에 메소드 구현이 가능하다.
println("걷는다.")
}
fun sleep() {
println("잠을 잔다.")
}
var name: String = "홍길동" // 오류 발생 : 프로퍼티의 구현은 안 된다.
}
class Teacher() : Person {
override var age: Int = 40
override fun eat() { // eat의 구체적 구현
println("밥을 사먹는다.")
}
// walk는 구현되어 있기 때문에 없어도 된다.
// sleep도 구현되어 있기 때문에 없어도 된다.
}
class Student() : Person {
override var age: Int = 19
override fun eat() { // eat의 구체적 구현
println("급식을 먹는다.")
}
// walk는 구현되어 있기 때문에 없어도 된다.
override fun sleep() { // 이미 인터페이스에서 구현되어 있는 sleep를 오버라이드
println("한국 학생들은 잠을 못 잔다.")
}
}
val student: Student = Student()
student.eat()
student.sleep()
println(student.age)
val teacher: Teacher = Teacher()
teacher.eat()
teacher.sleep()
println(teacher.age)
* 클래스의 상속과 인터페이스의 상속의 다른 점
• 클래스는 멤버를 숨기는 것이 기본 값.
- 즉, 명시하지 않으면 final이 기본 값.
- 상속을 하기 위해선 open 키워드를 적어줘야 함.
• 인터페이스는 멤버를 보여주는 것이 기본 값.
- 즉, 명시하지 않으면 open이 기본 값.
- 상속을 막기 위해선 final 키워드를 적어줘야 함.
이 글은
패스트 캠퍼스 Android 앱 개발의 정석 with Kotlin 올인원 패키지 Online
강의를 듣고 공부한 내용을 바탕으로 작성되었습니다.
'📱 Android > 💻 Kotlin' 카테고리의 다른 글
[Android/Kotlin] 22. 스코프 함수(Scope Function) (0) | 2022.10.25 |
---|---|
[Android/Kotlin] 21. 익명 클래스(Anonymous Class) (0) | 2022.10.24 |
[Android/Kotlin] 19. Null Safety (0) | 2022.10.13 |
[Android/Kotlin] 18. 형변환 (0) | 2022.10.13 |
[Android/Kotlin] 17. 상속 (0) | 2022.10.12 |