본문 바로가기
Programming/Kotlin

[Kotlin] 코틀린 뽀개기 - 오버라이딩 (Overriding)

by 코딩의성지 2019. 12. 1.

코틀린 공부를 계속하다 보니 예전에 자바 공부하던 시절이 생각난다. 오버로딩, 오버라이딩 등 무슨 말인지 모르는 것들 투성이 었는데 ㅎㅎ 그래도 지금 코틀린 글을 작성할 때는 이러한 개념들이 그리 어렵게 느껴지지는 않는다.

 

잘난 척은 이만하고...!!

 

오늘은 오버라이딩 (Overriding) 이라는 것에 대해 공부해 볼 것이다.

 

공부하기전에 !! Overriding을 이해하기 위해서는 상속의 개념을 좀 잘 알고 올 필요가 있다.

 

https://devkingdom.tistory.com/51

 

[Kotlin] 코틀린 뽀개기 - 코틀린에서 상속(Inherit)을 사용해보자

하이~~!! 오랜만에 코틀린 글을 쓴다 !! 오늘 배울 개념은 바로바로 !! 상속(Inherit) 이라는 개념이다. ㅎㅎ 상속(Inherit) 프로그래밍이 아니더라도 상속이라는 말은 많이 들어봤을 것이다. 코틀린에서 상속은..

devkingdom.tistory.com

기억이 잘 안나면 !! 위의 링크를 통해 공부를 좀 하고 오자.

 

코틀린에서 모든 객체는 부모클래스 (Super Class) 타입의 참조 변수에 자식 (Sub Class) 객체를 담을 수 있다.

이때 해당 참조 변수는 부모클래스에 정의되어 있는 기능만 사용가능하다는 것을 알아두자 !

 

아래 예를 보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
fun main(args : Array<String>) {
    var temp1 = SubClass()
    temp1.superMethod()
    temp1.subMethod()
 
    var temp2 : SuperClass = SubClass()
    temp2.superMethod()
    //사용불가
    //temp2.subMethod()
}
 
open class SuperClass {
    fun superMethod() {
        println("슈퍼클래스의 메소드 입니다.")
    }
}
 
class SubClass : SuperClass() {
    fun subMethod() {
        println("서브클래스의 메소드 입니다.")
    }
}
 
 

temp1 의 경우 별다른 타입설정을 해주지 않았기 때문에 타입이 SubClass 이다.

따라서 자신이 가지고있는 subMethod() 뿐만아니라 부모 클래스인 SuperClass의 superMethod() 도 사용할 수가 있다.

 

위의 소스를 돌려보면

이런 결과가 나온다.

 

temp2 는 SuperClass를 별도의 타입으로 지정해줬다. 이때는 SuperClass의 superMethod() 만 사용할 수가 있다.

 

아니 그러면 ...!! 그냥 SubClass를 사용하면 되지 ... 왜 이렇게 불편하게 SuperClass를 타입으로 지정하느냐고 물어보시는 분들이 있을것이다. ㅎㅎ

 

바로 오늘 배울 Overriding 때문이다.

 

오버라이딩 (Overriding)

 

오버라이딩은 객체지향 언어에서 굉장히 많이 쓰는 것이니 꼼꼼하게 공부하길 권한다.

 

부모클래스 (Super Class) 의 메서드를 자식클래스(Super Class) 에서 재정의( 수정 or 추가) 해서 사용할 수 있는데 이걸 오버라이딩(Overriding)이라고 부른다.

 

이 오버라이딩을 사용해 재정의를 해놨다면 부모클래스 타입의 참조변수에서 메서드를 콜하면 자식클래스에서 재정의한 메서드가 호출된다.

 

정말 이해하기 쉽게 예제를 한번 짜봤다.

 

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
27
28
29
fun main(args : Array<String>) {
    var person : Animal = Person()
    person.eat()
}
 
open class Animal {
    open fun walk() {
        println("네발로 걷기!")
    }
 
    open fun eat() {
        println("먹기!")
    }
}
 
open class Person : Animal() {
 
    //walk() 재정의(수정)
    override fun walk() {
        println("두발로 걷기!")
    }
 
    //eat() 재정의(추가)
    override fun eat() {
        print("요리를 해서 ")
        super.eat()
    }
}
 
 

위의 예제를 보면 Animal 이라는 부모클래스와 Person 이라는 자식클래스가 존재한다. 

Animal 은 네발로 걷고, 그냥 먹는다.

Person 은 두발로 걷고, 요리를 해서 먹는다.

 

이렇게 Animal 에 있는 기능은 Person에서 재정의해서 사용될 수 있다. 이 소스를 돌려보면 

 

이렇게 재정의 된 메서드의 결과가 나온다. 쉽지??

 

자 Overriding은 이정도 공부하자 !! 그럼 오늘도 즐거운 코딩하자 !! ㅎㅎ

반응형

댓글