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