달나라 노트

Kotlin - super() (parent class의 method 그대로 쓰기) 본문

Kotlin

Kotlin - super() (parent class의 method 그대로 쓰기)

CosmosProject 2021. 3. 19. 00:57
728x90
반응형

 

 

 

 

 

상속이란 개념은 이미 글을 올린 적이 있습니다.

class의 상속 링크 -> cosmosproject.tistory.com/211

 

open class Test1() { // 1
    val name: String = "Bella"
    val team: String = "Team 1"

    fun comment(): String {
        return "Test 1 class function"
    }
}

class Test2(): Test1() { // 2

}

fun main() {
    val testing = Test2() // 3

    println(testing.name) // 4
    println(testing.team) // 4
    println(testing.comment()) // 4
}


-- Result
Bella
Team 1
Test 1 class function

위 코드를 봐봅시다.

 

1. Test1 class 생성.

 

2. Test2 class 생성하고 Test1으로부터 상속받음.

 

3. Test2 class로 testing이라는 변수를 객체로 만듦.

 

4. testing 객체는 Test2 class의 attribute나 method를 가지게 됨. -> Test2 class 자체에는 아무 내용도 없지만 Test1으로부터 상속받았기 때문에 Test1의 내용을 그대로 물려받았기 때문.

 

자 위 내용은 상속의 기본적인 내용입니다.

 

 

 

 

그럼 위 코드를 약간 변형시켜봅시다.

아래 예시를 봅시다.

open class Test1() {
    val name: String = "Bella"
    val team: String = "Team 1"

    open fun comment(): String { // 1
        return "Test 1 class function"
    }
}

class Test2(): Test1() {
    override fun comment(): String { // 2
        return "Test 2 class function"
    }
}

fun main() {
    val testing = Test2()

    println(testing.name)
    println(testing.team)
    println(testing.comment()) // 3
}



-- Result
Bella
Team 1
Test 2 class function

1. Test2 class에서 comment function을 override할 것이기 때문에 open 키워드를 추가했습니다.

 

2. Test2 class는 Test1 class를 상속받고 있지만 comment function은 override 키워드를 이용하여 Test1 comment function을 덮어씌우고 있습니다.

 

3. 따라서 Test2 class에 의해 만들어진 testing 객체가 가지는 comment function은 Test 2 class function이라는 문구를 return합니다.

 

 

 

위 예시를 보면 Test2 class에서 Test1으로부터 받은 comment function을 덮어씌웠기 때문에 더 이상 Test1 class의 comment function은 Test1 class function이라는 값을 return할 수 없습니다.

 

근데 만약 위처럼 Test2 class에서 comment를 덮어씌움과 동시에 Test1 class 본연의 comment function도 사용하고 싶으면 어떻게 해야할까요?

 

자 이제 super 함수가 나올 차례입니다.

아래 코드를 봅시다.

 

 

 

open class Test1() {
    val name: String = "Bella"
    val team: String = "Team 1"

    open fun comment(): String {
        return "Test 1 class function"
    }
}

class Test2(): Test1() {
    override fun comment(): String {
        return "Test 2 class function"
    }

    fun comment_from_test1(): String { // 1
        return super.comment()
    }
}

fun main() {
    val testing = Test2()

    println(testing.name)
    println(testing.team)
    println(testing.comment()) // 2
    println(testing.comment_from_test1()) // 3
}



-- Result
Bella
Team 1
Test 2 class function
Test 1 class function

1. Test2 class에서 새로운 함수를 만들고 해당 함수가 super.comment()를 return하도록 만듭니다.

여기서 super.function_name의 형태로 사용한 것을 해석해보면

부모 class에 있는 function_name이라는 method의 내용을 그대로 가져오라는 뜻입니다.

따라서 super.comment()라는 것은 Test1 class에 있는 comment() method의 기능을 변형 없이 그대로 실행시키라는 뜻이죠.

이 경우엔 comment_from_test1 method의 결과는 Test1 class의 comment()를 그대로 실행시켜 "Test 1 class function"을 return할 것입니다.

 

2. Test2 class의 comment()는 override되었으니 Test 2 class function을 return합니다.

 

3. comment_from_test1()은 1번에서 얘기했던대로 Test 1 class function이라는 Test1 class의 comment() method의 내용을 그대로 return합니다.

 

 

 

위처럼 super라는 기능은 class의 상속을 진행한 후 부모 class의 내용을 그대로 가져오고 싶을 때 사용합니다.

 

 

 

 

 

 

 

 

728x90
반응형
Comments