일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 애드몹
- Android
- 안드로이드앱개발
- androidstudio
- 범물동카페
- 범물동
- 의무경찰
- 앱개발
- 안드로이드
- 동성로맛집
- 안드로이드앱
- 동성로핫플
- 감성카페
- 수성구맛집
- 코딩공부
- 어플개발
- 대구인스타핫플
- 코딩
- 개발자
- 지산동카페
- 대구카페
- 수성구카페
- 안드로이드스튜디오
- 파이썬
- 안드로이드개발
- 애드센스
- 대구맛집
- 인스타핫플
- 대구핫플
- 동성로카페
Archives
- Today
- Total
Glacier's Daily Log
헷갈리는 Sealed, Open, Abstract Class를 정리해보자 본문
반응형
안드로이드 개발을 코틀린으로 진행하다보면 Sealed, Open, Abstract 클래스를 많이 사용하게 된다. 자주 사용하다보면 어떤 상황에 쓰면 되는지 감은 오지만 정확히 정리해본적은 없는 것 같아서 시작한다.
코틀린에서 abstract, open, sealed, 그리고 기본 class는 각각의 용도와 제약 조건이 있다. 이들의 차이점과 공통점을 살펴보자.
1. abstract, open, sealed 의 공통점
- 모두 클래스이다. 코틀린에서 클래스는 객체 지향 프로그래밍의 기본 단위로, 인스턴스를 생성하거나 상속의 기반이 된다.
- 모두 상속을 허용할 수 있는 클래스로 사용될 수 있지만, 어떤 클래스는 상속이 기본적으로 허용되지 않으며, 상속 가능 여부는 해당 키워드에 따라 결정된다.
2. abstract, open, sealed 의 차이점
2-1) abstract 클래스
- 정의: 추상 클래스는 미완성 상태의 클래스로, 직접 인스턴스를 생성할 수 없고 반드시 상속을 통해 구현이 완료되어야 함.
- 상속: 추상 클래스는 다른 클래스들이 상속하여 사용해야 하며, 추상 메서드가 포함될 수 있음. 상속받는 클래스는 추상 메서드를 반드시 구현해야 함.
- 특징:
- 클래스 안에 추상 메서드(구현부가 없는 메서드)를 정의할 수 있음.
- 상속받는 클래스는 override 키워드를 사용하여 해당 메서드를 구현해야 함.
- 추상 클래스 자체는 인스턴스화할 수 없음.
- abstract 클래스 와 interface 의 차이
- 추상 클래스와 인터페이스의 차이점
-
특징 추상 클래스 (Abstract Class) 인터페이스 (Interface) 상속 단일 상속만 가능 다중 상속 가능 메서드 구현 일부 메서드를 구현할 수 있음 기본적으로 구현되지 않지만, 기본 구현 제공 가능 상태 유지 필드를 가질 수 있고, 상태를 유지 가능 필드나 상태 유지 불가 인스턴스화 직접 인스턴스화할 수 없음 인스턴스화 불가 목적 클래스의 기본 동작과 상태를 정의, 다른 클래스가 이를 확장 공통 동작을 정의하고 이를 여러 클래스가 구현할 수 있게 함 사용 예 클래스 간의 관계가 밀접하거나 기본 동작을 공유해야 할 때 사용 여러 클래스가 공통된 기능을 구현해야 할 때 사용 - 상속: 두 개념 모두 다른 클래스에서 상속받아 사용할 수 있음.
- 인스턴스화 불가: 두 개념 모두 직접 인스턴스화할 수 없으며, 이를 구현하는 클래스에서만 사용할 수 있음.
- 구현 강제: 추상 메서드나 선언된 메서드는 이를 상속받는 클래스에서 반드시 구현되어야 함.
- 추상 클래스와 인터페이스는 객체 지향 프로그래밍에서 클래스나 메서드의 구조를 정의하고 구현을 강제하기 위해 사용된다. 하지만 이 두 개념에는 중요한 차이점이 있다.
2-2) open 클래스
- 정의: 코틀린에서 기본적으로 클래스는 상속이 불가능. 상속을 가능하게 하려면 open 키워드를 명시해야 한다.
- 상속: open 키워드를 사용한 클래스는 다른 클래스에서 상속할 수 있습니다. 메서드나 프로퍼티에도 open을 사용하여 상속 또는 오버라이드가 가능하도록 설정할 수 있음.
- 특징:
- 상속이 가능하지만, 강제되지 않음. 즉, 직접 인스턴스를 생성할 수 있다.
open class Vehicle {
open fun drive() {
println("Driving")
}
}
class Car : Vehicle() {
override fun drive() {
println("Car is driving")
}
}
2-3) sealed 클래스
- 정의: sealed 클래스는 상속 계층을 제한하는 클래스. 즉, 상속을 허용하되, 상속받는 클래스는 반드시 같은 파일 내에서 정의되어야함.
- 상속: 다른 파일에서는 상속이 불가능하며, 상속 계층을 명확하게 제한하는 데 사용.
- 특징:
- 상태나 결과를 표현하는 데 유용하며, 보통 when 표현식과 함께 사용된다. when 문에서는 모든 하위 클래스를 미리 알 수 있어 모든 케이스를 처리해야 함이 보장됩니다. (else브랜치 생략가능)
sealed class Result {
class Success(val data: String) : Result()
class Error(val message: String) : Result()
}
fun handleResult(result: Result) {
when (result) {
is Result.Success -> println(result.data)
is Result.Error -> println(result.message)
}
}
2-4) 그냥 class
- 정의: 기본 class는 코틀린에서 상속이 불가능한 클래스. 추가적으로 상속을 허용하지 않으며, 이를 상속하려면 open 키워드가 필요.
class User(val name: String)
3. 한눈에 보기: 요약
종류 | 상속 가능 여부 | 인스턴스 생성 가능 여부 | 사용 목적 |
abstract | 상속받는 클래스 필수 | 불가능 | 추상 클래스로 상속받아 메서드를 구현하도록 강제하는 경우 |
open | 명시적으로 상속 가능 | 가능 | 기본적으로 상속이 불가능한 코틀린 클래스의 상속을 허용하고 싶을 때 |
sealed | 같은 파일 내에서 상속 가능 | 가능 | 상속 계층을 제한하여 예측 가능한 상속 구조를 만들고 싶을 때 |
기본 class | 불가능 | 가능 | 일반적인 클래스, 상속을 허용하지 않음 |
4. 결론
- abstract 클래스는 미완성된 클래스로 상속이 강제됨.
- open 클래스는 상속을 허용하지만, 강제하지 않으며 인스턴스화가 가능.
- sealed 클래스는 상속을 제한하고, 제한된 상속 계층 내에서 안전하게 상속 구조를 유지.
- 기본 class는 상속이 불가능한 독립적인 클래스.
이런 차이점들을 고려하여 상황에 맞는 클래스를 선택해 사용하면 됨.
반응형
'Coding > Android' 카테고리의 다른 글
[앱 개발 전문가] 기기 연동 안드로이드 앱을 개발해 드립니다. (BLE, MQTT, TCP, RTSP, PTZ, 클래식 블루투스 등) (3) | 2024.12.01 |
---|---|
코틀린 SAM-constructor 란? 그리고 코틀린에서 clickListener를 간단하게 쓸 수 있는 이유 (0) | 2024.04.09 |
@JvmField 어노테이션으로 Java+Kotlin 환경에 대응하기 (0) | 2024.03.29 |
[Kotlin] vararg로 파라미터 갯수를 유동적으로 지정하기 (0) | 2024.01.29 |
UI 작성시 ConstraintLayout을 활용을 권장하는 이유 (1) | 2024.01.25 |
Comments