인프런 커뮤니티 질문&답변

an622911님의 프로필 이미지
an622911

작성한 질문수

자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)

16강. 코틀린에서 다양한 함수를 다루는 방법

확장 함수의 오버라이드에 대해서 궁금한 점이 있습니다.

작성

·

208

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

 

예로 들어주신 Train, Srt 클래스에 존재하는 isExpensive() 확장 함수에 대해서 의문이 생겼습니다.

코틀린의 경우 오버라이드의 경우 override 키워드를 사용해서 정의를 한다고 강의에서 배웠는데요, Srt의 isExpensive() 함수를 함수 오버라이딩이라고 볼 수 있는지 궁금합니다.

궁금해서 찾아본 결과 오버라이딩의 경우 상속 관계가 핵심이고, 상위 클래스의 함수를 하위 클래스가 재정의 하는 것이라고 표현할 수 있을 것 같습니다.

Train과 Srt의 확장 함수는 각 클래스에 정의가 되어 있긴 하지만, 내부에서도 상속 관계가 되어 오버라이딩에 대한 바인딩이 처리되어 있을까? 하는 의문이 들었습니다.

확장 함수의 오버라이딩이 어떻게 진행되는지 궁금합니다..!

답변 1

0

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요! an622911님! 🙂 좋은 질문 감사드립니다.

Train과 Srt의 확장 함수는 각 클래스에 정의가 되어 있긴 하지만, 내부에서도 상속 관계가 되어 오버라이딩에 대한 바인딩이 처리되어 있을까? 하는 의문이 들었습니다.

확장 함수의 오버라이딩이 어떻게 진행되는지 궁금합니다..!

 

결론부터 말씀드리면, 확장함수는 확장하려는 클래스에 존재하는 함수를 선언하건, 존재하지 않는 함수를 선언하건, static method로 처리됩니다! 예를 들어,

fun Parent.hello() {
    print("Hello Parent extension function")
}

와 같이 Parent 클래스에 hello() 확장함수를 만들면, 컴파일 되었을 때

public static final void hello(@NotNull Parent this$hello) {
  String var1 = "Hello Parent extension function";
  System.out.print(var1);
}

와 같은 느낌으로 컴파일 되는거에요!

 

따라서 원래 존재하던 함수와 동일한 시그니처를 갖는 함수를 확장함수로 만들게 되면

엄밀히는 상속관계의 오버라이딩이 아니라, 수신객체를 매개변수로 받는 static 함수가 생기는 것 뿐입니다.

 

강의에서 "오버라이딩"으로 표현드렸던 것은, 마치 상속에서 특정 함수를 재정의할 수 있는 것처럼, 확장 함수도 재정의가 가능하다는 것을 보여드리기 위함으로 봐주시면 될 것 같습니다! 🙏 물론, 확장 함수는 같은 시그니처를 썼을 경우, 원본 함수에 우선권이 있죠!

답변이 도움이 되었으면 좋겠습니다. 감사합니다! 🙇

an622911님의 프로필 이미지
an622911
질문자

감사합니다.
궁금증이 해소 되었습니다!

an622911님의 프로필 이미지
an622911

작성한 질문수

질문하기