1. 상속의 기본 (open, override)
-
코틀린의 모든 클래스, 멤버 →
final(default)- 상속 및 재정의 하려면 명시적 으로
open을 사용해야함.
- 상속 및 재정의 하려면 명시적 으로
-
open: 클래스나 멤버를 상속/재정의 가능하게 설정.
-
특이사항
val프로퍼티는 자식에서var로 재정의 가능var를val로 바꾸는 것은 불가능
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)가 없음
- 자바와 공통점 : 자바의