코틀린 클래스와 상속

코틀린 클래스와 상속(Inheritance) 완벽 정리

코틀린의 클래스는 기본적으로 상속이 금지되어 있다.
상속을 허용하려면 open 키워드를 명시해야 하며,
이를 통해 부모 클래스의 속성과 메서드를 재사용할 수 있다.


기본 클래스 선언

class Person(val name: String, val age: Int)

기본적으로 코틀린 클래스는 final이므로 상속이 불가능하다.

open class Animal {
fun eat() {
println("먹는 중...")
}
}

상속하기

클래스를 상속하려면 : (콜론)을 사용한다.
부모 클래스가 open 으로 선언되어 있어야 한다.

open class Animal {
open fun sound() {
println("동물 소리")
}
}
class Dog : Animal() {
override fun sound() {
println(“멍멍!”)
}
}
val dog = Dog()
dog.sound() // 출력: 멍멍!

open과 override

  • open: 상속 가능하도록 허용

  • override: 부모의 메서드를 재정의할 때 사용

open class Shape {
open fun draw() {
println("도형을 그립니다")
}
}
class Circle : Shape() {
override fun draw() {
println(“원을 그립니다”)
}
}

super 키워드

부모 클래스의 메서드나 속성에 접근할 때 super를 사용한다.

open class Vehicle {
open fun start() {
println("차량 시동 걸림")
}
}
class Car : Vehicle() {
override fun start() {
super.start()
println(“자동차 준비 완료”)
}
}
val car = Car()
// 출력:
// 차량 시동 걸림
// 자동차 준비 완료

init 블록 (초기화 블록)

객체가 생성될 때 자동 실행되는 초기화 구문이다.

open class Human(val name: String) {
init {
println("Human 생성자 실행됨: $name")
}
}
class Student(name: String, val major: String) : Human(name) {
init {
println(“Student 생성자 실행됨: 전공=$major“)
}
}

생성자 상속

부모 클래스에 주 생성자(primary constructor) 가 있다면,
자식 클래스는 반드시 이를 호출해야 한다.

open class Parent(val name: String)

class Child(name: String, val age: Int) : Parent(name)


속성 오버라이드

속성(property)도 openoverride 로 재정의할 수 있다.

open class Person {
open val type = "사람"
}
class Student : Person() {
override val type = “학생”
}

추상 클래스 (abstract class)

abstract 클래스는 인스턴스를 만들 수 없고,
상속을 통해서만 사용할 수 있다.
추상 메서드는 반드시 하위 클래스에서 구현해야 한다.

abstract class Shape {
abstract fun draw()
}
class Rectangle : Shape() {
override fun draw() {
println(“사각형을 그립니다”)
}
}

sealed 클래스

sealed 클래스는 상속 가능한 범위를 제한하는 특수한 클래스다.
주로 when 구문과 함께 사용되어 안전한 타입 분기를 처리할 때 유용하다.

sealed class Result

class Success(val data: String) : Result()
class Error(val message: String) : Result()

fun handle(result: Result) = when (result) {
is Success -> println(“성공: ${result.data}“)
is Error -> println(“오류: ${result.message}“)
}


다중 상속 불가, 인터페이스로 대체

코틀린은 클래스 다중 상속을 지원하지 않는다.
대신 여러 인터페이스를 동시에 구현할 수 있다.

interface Clickable {
fun click()
}
interface Focusable {
fun focus()
}class Button : Clickable, Focusable {
override fun click() = println(“버튼 클릭”)
override fun focus() = println(“버튼 포커스”)
}


부모 클래스의 속성 접근

부모 클래스의 생성자 속성은 자식 클래스에서 super로 접근 가능하다.

open class Animal(val name: String) {
open fun introduce() = println("나는 $name 입니다.")
}
class Cat(name: String) : Animal(name) {
override fun introduce() {
super.introduce()
println(“야옹~”)
}
}

상속과 접근 제한자

키워드 의미 상속 가능 여부
public 어디서나 접근 가능 가능
protected 하위 클래스에서만 접근 가능 가능
internal 같은 모듈 내에서만 접근 가능 제한적
private 같은 클래스 내부에서만 접근 가능 불가능

실전 예시: 상속 구조 설계

open class Employee(val name: String, val position: String) {
open fun work() = println("$name ($position): 업무 중")
}
class Developer(name: String, position: String, val language: String) : Employee(name, position) {
override fun work() {
super.work()
println(“개발 언어: $language“)
}
}
val dev = Developer("재은", "백엔드 개발자", "Kotlin")
dev.work()

  • open을 명시하지 않으면 상속 불가

  • super 를 통해 부모 기능 재사용

  • sealed class 로 안전한 분기 처리 가능

  • abstract class 는 공통 인터페이스와 기본 동작을 함께 정의할 때 유용

  • 다중 상속이 필요할 땐 인터페이스 조합으로 해결



게시됨

카테고리

작성자

댓글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다