Kotlin 기초문법(6)

박재원·2023년 12월 6일
0

TIL

목록 보기
8/50
post-thumbnail

클래스를 더욱 구조화 하기 위해서는 특수한 목적을 가진 여러 클래스를 정의해야 한다. 오늘은 추상클래스를 메인으로 정리해보려고 한다. 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("당근을 먹습니다")
    }
}
실행결과
당근을 먹습니다
킁킁
  • Rabbit의 인스턴스를 만들어 eat와 sniff를 수행하도록 한다.
  • 추상클래스 안에 구현부가 없는 eat() 메서드와 구현부가 있는 sniff() 함수를 같이 쓸 수 있다.
  • 추상클래스는 일부 함수가 구현되지 않은 '미완성' 클래스이기 때문에 단독으로 인스턴스를 만들 수 없고 반드시 서브클래스에서 상속을 받아 abstract 표시가 된 함수를 구현해줘야 한다.

상속

  • 상속하는 쪽은 Super class 상속 받는 쪽을 Sub class라고 한다.
  • open 상태가 상속 가능 상태로 클래스 선언시 붙일 수 있는 키워드이다.

상속규칙

  1. 서브 클래스는 수퍼 클래스에 존재하는 속성과 같은 이름의 속성을 가질 수 없다.

  2. 서브 클래스 생성자 호출 시 반드시 수퍼클래스 생성자가 먼저 호출된다.

  3. 서브 클래스는 파라미터를 받을 때 var, val을 붙이지말고 일반 파라미터로 받는다.

  • var, val을 붙이면 속성으로 선언된다.
  1. 일반 파라미터로 받은 값들을 수퍼 클래스 생성자에 직접 넘겨준다.

  2. 서브 클래스() : 수퍼 클래스() 방식으로 상속받는다. (수퍼 클래스의 생성자를 호출한다.)

e.g.

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("고기를 먹는다.")
    }
 
}

실행결과:
음식을 먹는다.
고기를 먹는다.
  • 'open'이 붙은 함수는 서브클래스에서 'override'를 붙여 재구현하면 된다.
  • a.eat()에서는 "음식을 먹는다." 가 출력되지만 b.eat() 에서는 "고기를 먹는다." 가 출력된다.

0개의 댓글