- 일반 클래스와 달리 구체적으로 데이터를 담지 않고, 추상적인 데이터를 담고 있는 클래스임.
- 클래스 간에 공통된 기능을 구현하면서 일부 메서드는 구체적인 구현을 강제하고 싶을 때 사용.
- 완전히 구현되지 않은 클래스이며 일부 함수는 구현될 수 있고, 추상 함수 선언이 가능함.
- 추상 함수는 추상 클래스를 상속하는 클래스에서 오버라이딩이 강제적임.
- 주로 다른 클래스가 이를 상속받아 기능을 확장하거나 구체화하는데 사용됨.
- 추상 클래스를 선언할 땐
abstract
키워드를 붙어야함.
fun main() {
val galaxyS24 = AndroidPhone()
}
abstract class Electronics {
abstract fun powerOn()
}
abstract class CommunicationDevice : Electronics() {
abstract fun makeCall()
}
abstract class Phone : CommunicationDevice() {
abstract fun takePhoto()
}
class AndroidPhone() : Phone() {
override fun takePhoto() { }
override fun makeCall() { }
override fun powerOn() { }
}
추상 클래스의 특징
abstract
키워드를 사용하여 추상 클래스안에 추상 함수를 선언할 수 있음.
- 최소 하나 이상의 추상 함수를 포함해야함.
- 자식 클래스에서 추상 클래스를 상속하여 구체화해야함.
추상 클래스를 사용하는 이유
- 구현의 강제성을 보장함.
- 추상 함수는 반드시 자식 클래스에서 오버라이딩해야함.
- 일반 함수는 오버라이딩을 강제하지 않음. 추상 클래스의 상속 관계에서 오버라이딩을 강제하므로, 개발자의 실수를 줄일 수 있음.
- 미완성 클래스임을 명시하기 위해 사용됨.
- 추상 클래스를 상속하여 구체적인 구현을 하라는 명확한 의도를 표현함.
- 명확한 의도 제시
- 이 클래스는 공통 동작이나 상태를 제공하며, 직접 사용되지 않고 반드시 상속을 통해 구체화되어야 한다라는 의미 내포.
- 다른 개발자와 협업시 디자인 목적을 명확히 이해 가능.
안드로이드에서 추상클래스
- Activity, Fragment에서 공통 동작을 설계할 때
- ex) ViewBinding사용시 초기화 로직
일반 클래스와 추상 클래스 선택 기준
- 인스턴스화 될 필요가 없고, 설계적 유연성, 확장성, 코드 유지 보수성 이점을 가져가는 경우 → 추상 클래스
- 추상 함수의 사용은 필수가 아님. 옵셔널임. →
ViewModel
클래스 참고
- 추상 함수를 사용 안하더라도, 위 같은 이점을 챙기는 경우
- 상속을 강제할 필요가 없는 경우, 데이터나 상태를 유지하는 경우, 객체 인스턴스화 → 일반 클래스
결론