| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 |
- 아두이노
- Kotlin LinkedList
- 스택
- 재정의함수
- Stack
- kotlin
- 클래스
- 라즈베리파이 피코
- 추상화함수
- 자료구조
- LinkedList
- State Hoisting
- Android
- 리컴포지션
- kotlinClass
- Queue
- Compoae
- Kotlin자료구조
- 우송대
- List
- 개발 보드
- 우송대학교
- deque
- 코틀린
- 안드로이드
- PICO4
- Class
- 큐
- 상태 호이스팅
- 컴포즈
- Today
- Total
개발자의 생활
상속 본문
1. 일반 class
상속을 받은 class는 상위(부모) class에 있는 메서드나 프로퍼티를 사용할 수 있으며 override를 통해 재정의를 할 수도 있습니다.
상속받는 방법은 Java 와 방식이 약간 다릅니다. Java에서는 class 뒤에 extends 키워드를 사용했지만 Kotlin에서는 : 기호를 사용합니다. 또한 부모 Class 도 open 키워드를 붙여주어야 상속을 할 수 있습니다. (open 이 없으면 기본으로 final 가 됩니다.)
사용방식과 기본값은 조금 다르지만 규칙과 사용방법은 Java 와 동일합니다.
fun main(){
val vehicle = Vehicle(70)
vehicle.driving()
val car = Car(60)
car.driving()
}
open class Vehicle(
private val speed: Int
){
open fun driving(){
println("$speed km/h 의 속력으로 달린다")
}
}
class Car(speed: Int) : Vehicle(speed)
Car Class 는 상속을 받은 Vehiclev Class를 상속받았기 때문에 driving 메서드를 그대로 사용할 수 있습니다.
fun main(){
val vehicle = Vehicle(70)
vehicle.driving()
val car = Car(60)
car.driving()
}
open class Vehicle(
val speed: Int
){
open fun driving(){
println("$speed km/h 의 속력으로 달린다")
}
}
class Car(speed: Int) : Vehicle(speed){
override fun driving() {
println("자동차가 ${super.speed} km/h 의 속력으로 달린다")
}
}
위 코드에서는 Vehiclev 메소드를 Car Class에서 override로 재정의 하였습니다.
추가
open class Vehicle(
open val speed: Int
){
open fun driving(){
println("$speed km/h 의 속력으로 달린다")
}
}
class Car(speed: Int) : Vehicle(speed){
override val speed: Int
get() = if(super.speed < 60) super.speed else 60
}
Kotlin 은 생성자에 필드를 만들면 자동으로 프로퍼티가 만들어진다고 이전 블로그에서 포스팅 한적 있습니다.
즉 getter, setter 도 open 키워드를 붙여주면 재정의가 가능합니다.
2. 추상 class
추상 class 는 메서드 만 정의해 놓고 상속받는 class에서 구현을 강제하도록 하는 것입니다.
fun main(){
val vehicle: Vehicle = Car(70)
vehicle.driving()
}
abstract class Vehicle(
val speed: Int
){
abstract fun driving()
}
class Car(speed: Int) : Vehicle(speed){
override fun driving() {
println("자동차가 ${super.speed} 의 속력으로 달린다")
}
}
추상 class는 Java 와 거의 동일합니다.
abstract 키워드를 사용해서 수상 class를 만들고 내부에서 동일하게 abstract 키워드를 붙여 추상메서드를 만들 수 있습니다.
이 메서드는 자식 class에서 반드시 구현체를 만들어 주어야 합니다.
abstract class Vehicle {
abstract val speed: Int
abstract fun driving()
}
class Car(override val speed: Int) : Vehicle(){
override fun driving() {
println("자동차가 $speed 의 속력으로 달린다")
}
}
여기서 당연히 프로퍼티도 추상화가 가능합니다. 다만 생성자 부분에서는 abstract를
또한 일반 class처럼 open을 사용해서 이미 구현되어 있는 메서드도 재정의 할 수 있도록 허용할 수 있습니다.
3. interface
인터페이스 도 Java와 사용법은 동일합니다. 상속받을 때는 class를 상속받을 때처럼 : 을 사용하면 됩니다. 물론 인터페이스는 여러 개를 상속받을 수 있습니다.
다만 인터페이스는 생성자가 없으며 필드를 생성할 수 없습니다.
fun main(){
val vehicle: Vehicle = Car(70)
vehicle.driving()
vehicle.test()
}
interface Vehicle {
val speed: Int
fun driving(){
println("자동차가 $speed 의 속력으로 달린다")
}
fun test()
}
class Car(override val speed: Int) : Vehicle{
override fun test() {
println("추상메소드 입니다")
}
}
kotlin 인터페이스에서는 는 open과 default 키워드가 없어도 자동으로 유추하여 구분을 해 줍니다.
Kotlin에서 class와 interface 상속 은 키워드가 조금 다를 뿐이고 사용 방식이나 규칙은 동일합니다.
| 특징 | 일반 class | 추상 class | interface |
| 생성자 | O | O | X |
| 필드(backing field) | O | O | X |
| 인스턴스화 | O | X | X |
| 다중 상속 | X | X | O |
| 추상 메서드 | X | O | O |
일반 class, 추상 class, interface의 특징을 간단하게 정리한 표입니다.
이상으로 Kotlin 상속에 대한 소개를 마치겠습니다. 감사합니다.
'kotlin' 카테고리의 다른 글
| 중첩 클래스, 내부클래스 (0) | 2025.09.08 |
|---|---|
| object 키워드(정적 변수, 정적 함수) (1) | 2025.08.31 |
| class(클래스) (4) | 2025.08.14 |
| 유용한 String 함수 (6) | 2024.10.30 |
| 제네릭 (0) | 2024.10.30 |