1. 상속의 기본 (open, override)

  • 코틀린의 모든 클래스, 멤버 final(default)

    • 상속 및 재정의 하려면 명시적 으로 open 을 사용해야함.
  • open: 클래스나 멤버를 상속/재정의 가능하게 설정.

  • 특이사항

    • val 프로퍼티는 자식에서 var로 재정의 가능
    • varval로 바꾸는 것은 불가능
open class Shape {
    open val vertexCount: Int = 0
    open fun draw() = println("도형을 그립니다.")
}
 
class Rectangle : Shape() {
    override val vertexCount: Int = 4
    override fun draw() = println("사각형을 그립니다.")
}

2. 비어 있지 않은 생성자가 있는 부모 상속

  • 부모 클래스의 생성자에서 파라미터를 요구하는 경우, 자식 클래스에서는 부모 생성자의 요구사항을 준수하여야 한다.
open class Bird(val species: String)
 
// 1. 주 생성자에서 부모 호출 (가장 일반적)
class Penguin(species: String) : Bird(species)
 
// 2. 부 생성자에서 super로 호출
class Eagle : Bird {
    constructor(species: String) : super(species)
}

3. super 호출

  • 부모 클래스의 메서드나 프로퍼티를 자식에서 참조할 때 사용
    • 다중 상속(인터페이스) 시 이름이 겹치면 super<Base>.method() 형식을 사용합니다.
open class Base {
    open fun f() = println("Base.f()")
}
 
class Derived : Base() {
    override fun f() {
        super.f() // 부모의 로직 수행
        println("Derived.f()")
    }
}

4. 추상 클래스 (abstract)

  • abstract 키워드가 붙으면 자동으로 open 상태.
    • 추상 함수/프로퍼티: 본문이 없으며 자식에서 반드시 구현해야 함.
abstract class GameCharacter {
    abstract val power: Int
    abstract fun attack() // 추상 함수
 
    fun move() = println("캐릭터 이동") // 일반 함수
}

5. 인터페이스 (interface)

  • Property추상 메서드 를 가짐.

    • 프로퍼티: 필드가 없으므로 값을 저장하지 못하며, 자식이 오버라이딩하거나 커스텀 게터를 제공해야 함.
  • 디폴트 메서드: 본문이 있는 메서드를 작성하면 구현체에서 선택적으로 재정의 가능.

interface Clickable {
    val clickCount: Int // 추상 프로퍼티
    fun click()         // 추상 메서드
    fun doubleClick() { // 디폴트 메서드
        println("Double Clicked!")
    }
}

6. 접근 제어자 (Visibility Modifiers)

  • 모듈 단위 접근 제어
제어자범위비고
public어디서나 접근 가능기본값
internal같은 모듈 내에서만 접근 가능프로젝트/라이브러리 단위 보안
protected상속 관계의 자식 클래스에서만 가능최상위(파일 레벨) 선언 불가
private선언된 클래스 또는 파일 내부에서만 가능가장 좁은 범위

7. 모든 클래스의 뿌리 (Any)

  • 모든 클래스의 부모 : Any
  • 주요 메서드
    • equals(), hashCode(), toString()
  • 특징
    • 자바와 공통점 : 자바의 Object와 대응
    • 차이점 : 스레드 관련 메서드(wait, notify)가 없음