6. Classes & Ingeritance
클래스와 상속 구조
치트시트
클래스는 기본
final
, 상속하려면open
상속/구현:
:
사용부모 생성자 반드시 호출
오버라이드 시
override
필수추상 클래스/인터페이스 인스턴스화 불가
인터페이스: default 키워드 없이 메소드 구현 가능, 프로퍼티 선언 가능
키워드:
final
/open
/abstract
/override
1) 클래스 기본 특징
코틀린 클래스는 기본적으로 final → 상속 불가
상속을 허용하려면
open
붙여야 함필드를 선언하면 자동으로 getter/setter가 붙어 “프로퍼티”로 동작
open class Animal(val name: String) {
open fun sound() = println("...")
}
👉 자바에서는 모든 클래스가 기본적으로 상속 가능(open)이고, final
로 막음.
2) 상속 문법
extends
/implements
대신:
사용
class Dog(name: String) : Animal(name) {
override fun sound() = println("멍멍")
}
부모 생성자를 반드시 호출해야 함
오버라이드 시
override
키워드 필수
3) 추상 클래스 (Abstract Class)
abstract
클래스는 인스턴스화 불가추상 멤버는 하위 클래스가 반드시 구현해야 함
abstract class Animal {
abstract fun sound()
}
class Cat : Animal() {
override fun sound() = println("야옹")
}
4) 인터페이스 (Interface)
선언:
interface
다중 구현 가능
default 키워드 없이 메소드 구현 가능
interface Flyable {
fun fly() = println("날다") // 디폴트 구현
}
class Penguin : Flyable
같은 메소드가 겹칠 경우
super<인터페이스>.메소드()
로 특정 가능프로퍼티도 선언 가능 (backing field는 없음)
5) 상속 관련 키워드 정리
final
: 오버라이드 금지 (기본값)open
: 오버라이드 허용abstract
: 반드시 오버라이드 필요override
: 상위 타입 멤버를 재정의
👉 자바와 달리, 상속·오버라이드는 항상 명시적이어야 함.
6) 주의할 점
생성자/초기화 블록에서
open
프로퍼티 사용 금지 → 예기치 못한 버그 발생 가능상위 생성자를 호출하지 않으면 컴파일 에러
7) 실무 예시
A. Spring Bean 계층 구조
abstract class BaseService {
abstract fun execute()
}
class UserService : BaseService() {
override fun execute() { /* 로직 */ }
}
→ 추상 클래스로 공통 템플릿 제공.
B. Android UI
open class BaseActivity : AppCompatActivity() {
open fun setupViews() {}
}
class MainActivity : BaseActivity() {
override fun setupViews() { /* 뷰 초기화 */ }
}
C. 다중 인터페이스
interface Loggable { fun log() = println("log") }
interface Trackable { fun track() = println("track") }
class Service : Loggable, Trackable
Last updated