추상 클래스 알아보기
추상 클래스
- 추상 클래스는
abstract
예약어로 지정한 클래스임.
- 추상 클래스는 직접 객체를 생성할 수 없고, 다른 클래스에 상속해서 구현해야함.
- 추상 클래스에서는 추상 속성, 메서드 이외의 일반 속성과 일반 메서드도 정의할 수 있음.
- 추상 클래스는 전체적인 구성이 “구체화” 되어 있지 않고, 설계만 되어 있는 클래스임.
- 여러 클래스에 걸쳐 공통적으로 사용되는 메서드나 변수를 추상 클래스에 정의함으로써 코드 중복을 줄일 수 있음.
fun main() {
val man = Man("지원").apply {
println(name)
displayJob("안드로이드 개발자")
println(age)
displaySSN(1234)
}
}
class Man(override val name: String) : Person(name) {
override fun displayJob(description: String) { println("$name 님의 직업은 $description 입니다.") }
override fun displaySSN(ssn: Int) { super.displaySSN(ssn) } // 재정의 필수 아님.
}
abstract class Person(name: String) {
init { println("이름은 $name") }
var age: Int = 40 // 일반 속성
abstract val name: String // 추상 속성
open fun displaySSN(ssn: Int) { println("주민번호 is : $ssn") } // 일반 메서드
abstract fun displayJob(description: String) // 추상 메서드
}
이름은 지원
지원
지원 님의 직업은 안드로이드 개발자 입니다.
40
주민번호 is : 1234
abstract
예약어를 붙인 추상 속성(멤버)은 반드시 구현 클래스에서 재정의 되어야 함.
open
예약어를 붙인 멤버는 구현 클래스에서 재정의 될 수 있음.
init
블록으로 주 생성자의 특정 기능을 처리할 초기화 블록을 제공함.
추상 클래스 활용
- 추상 클래스를 정의하면 여러 클래스에 동일한 규칙을 제한할 수 있는 공통 기능를 제공함.
abstract class BaseActivity<T : ViewDataBinding>(@LayoutRes private val layoutId: Int) : AppCompatActivity() {
protected val binding: T by lazy(LazyThreadSafetyMode.NONE) {
DataBindingUtil.setContentView(this, layoutId)
}
init {
addOnContextAvailableListener {
binding.notifyChange()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding.lifecycleOwner = this
}
override fun onDestroy() {
binding.unbind()
super.onDestroy()
}
protected inline fun bind(block: T.() -> Unit) {
binding.apply(block)
}
}
- 위
BaseActivity
코드는 데이터바인딩을 초기화 해주는 보일러 플레이트 코드를 해소시키고, 동일한 규칙을 제공함.
인터페이스 알아보기
클래스와 인터페이스의 차이
- 클래스는 객체를 생성해 내부의 속성과 메서드를 사용함.
- 인터페이스는 추상 속성과, 추상 메서드를 기본으로 처리함. 이는 추상 클래스처럼 객체를 생성할 수 없음.
상속과 구현의 차이