클래스를 더욱 구조화 하기 위해서는 특수한 목적을 가진 여러 클래스를 정의해야 한다. 오늘은 추상클래스를 메인으로 정리해보려고 한다. kotlin 강의를 들으면서 가장 이해하기 힘들었던게 추상클래스이다. 오늘 정리로 개념과 실제 쓰임에 대해 알아가는 시간을 가져야겠다.
추상 클래스는 대략적인 설계의 명세와 공통의 기능을 구현한 클래스이다. 추상클래스를 상속하는 하위 클래스는 추상클래스의 내용을 더 구체화 해야한다.
여기서 추상클래스와 인터페이스가 비슷한 것을 볼 수 있는데 따지고 보면 다르다.
대략적인 설계 명세를 구현하고 하위클래스에서 구체화하는 것은 동일하나, 인터페이스에서는 프로퍼티의 상태 정보를 저장할 수 없다.
fun main() {
var r = Rabbit()
r.eat()
r.sniff()
}
abstract class Animal {
abstract fun eat()
fun sniff(){
println("킁킁")
}
}
class Rabbit : Animal(){
override fun eat(){
println("당근을 먹습니다")
}
}
실행결과
당근을 먹습니다
킁킁
서브 클래스는 수퍼 클래스에 존재하는 속성과 같은 이름의 속성을 가질 수 없다.
서브 클래스 생성자 호출 시 반드시 수퍼클래스 생성자가 먼저 호출된다.
서브 클래스는 파라미터를 받을 때 var, val을 붙이지말고 일반 파라미터로 받는다.
일반 파라미터로 받은 값들을 수퍼 클래스 생성자에 직접 넘겨준다.
서브 클래스() : 수퍼 클래스() 방식으로 상속받는다. (수퍼 클래스의 생성자를 호출한다.)
fun main() {
var a = Animal("별이", 5, "개")
var b = Dog("별이", 5)
var c = Cat("루어", 1)
a.introduce()
b.introduce()
b.bark()
c.meow()
}
open class Animal(var name:String, var age:Int, var type:String){
fun introduce() {
println("저는 ${type} ${name}이고, ${age}살 입니다.")
}
}
class Dog (name:String, age:Int) : Animal(name, age, "개"){ // var, val을 쓰지않고 Animal 클래스 생성자에 직접 넘겨준다.
fun bark(){ // Dog만 가능하다.
println("멍멍")
}
}
class Cat(name:String, age:Int) : Animal(name, age, "고양이"){
fun meow(){
println("야옹")
}
}
상속시 Super class에 있는 메서드와 같은 이름과 형태를 가진 함수는 Sub class 에서는 만들 수 없지만 허용만 한다면 overriding 이라는 방법으로 같은 이름과 형태로 된 함수의 내용을 다시 구현 할 수 있다.
fun main(){
var a = Animal()
var b = Tiger()
a.eat()
b.eat()
}
open class Animal{
open fun eat(){
println("음식을 먹는다.")
}
}
class Tiger : Animal(){
override fun eat() {
println("고기를 먹는다.")
}
}
실행결과:
음식을 먹는다.
고기를 먹는다.