Home 오버라이딩과 추상화
Post
Cancel

오버라이딩과 추상화

오버라이딩

역할

  • 이미 구현이 끝난 함수의 기능을 서브 클래스에서 변경해야 할 때 사용
  • 원칙적으로 서브 클래스에서 수퍼 클래스에 있는 같은 이름과 형태로 된 함수를 선언할 수 없지만 오버라이딩을 통해 이를 가능하도록 해준다.

기본 형태

  • 수퍼 클래스에서 open이 붙은 함수는 서브 클래스에서 override를 붙여 재구현 하면 됨
    • 수퍼 클래스: open fun 함수명() {}
    • 서브 클래스: override fun 함수명() {}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
open class Animal(){ 
    open fun eat(){
        println("음식을 먹습니다.")
    }
}

class Cat : Animal(){
    override fun eat(){ 
        println("생선을 먹습니다.")
    }
}

fun main(){
  var t = Cat()
  t.eat()
}

추상화

역할 및 구성

  • 형식만 선언하고 실제 구현은 서브클래스에 일임할 때 사용하는 기능
  • 선언부만 있고 기능이 구현되지 않은 추상함수, 추상함수를 포함하는 추상클래스로 구성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
abstract class Person(){
    abstract fun eat()
    fun introduce(){
        println("안녕하세요.")
    }
}

class woman: Person(){
    override fun eat(){
        println("밥을 먹습니다.")
    }
}

fun main(){
  var w = woman()
  w.eat()
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
abstract class Person(){
    //abstract fun eat()
    open fun introduce(){
        println("안녕하세요.")
    }
}

class woman: Person(){
    override fun introduce(){
        println("밥을 먹습니다.")
    }
}

fun main(){
  var w = woman()
  w.introduce()
}
  • 위와 같이 open 사용해서 override 가능

인터페이스

  • 추상화의 또 다른 방법
    • 추상함수: 생성자를 가질 수 있다.
    • 인터페이스: 생성자를 가질 수 없다.
  • 한 번에 여러 인터페이스 상속 가능
    • 서로 다른 기능들을 여러개 물려주어야 할 때 유용한 기능
  • 구현부가 있는 함수는 open 함수로, 구현부가 없는 함수는 abstract 함수로 간주한다.
    • 별도의 키워드가 없어도 서브 클래스에서 구현 및 재정의가 가능
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
interface Runner{
    fun run()
}

interface Eater{
    fun eat(){
        println("음식을 먹습니다.")
    }
}

class Dog: Runner, Eater{
    override fun run(){
        println("폴짝 폴짝")
    }
    override fun eat(){
        println("간식을 먹습니다.")
    }
}

fun main(){
  var d = Dog()
  
  d.run()
  d.eat()
 
}