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

denia park님의 프로필 이미지
denia park

작성한 질문수

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

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

[16강] 확장함수 관련 질문입니다!

작성

·

49

1

안녕하세요 강사님

 

확장함수 관련하여 질문이 있습니다.

 

강의 중에

확장함수는 원본 클래스의 private, protected 멤버 접근이 안된다.

라고 말씀해주신 부분이 있습니다.

 

제가 확장함수를 이해하기로는 특정 클래스에 내가 사용할 특정 로직을 심는 함수라고 이해를 했습니다.

 

이렇게 이해를 하고 나니

어짜피 외부에서는 확장함수로 추가할 원본 클래스의 private 혹은 protected 멤버에 접근이 불가능할텐데,

확장함수는 원본 클래스의 private, protected 멤버 접근이 안된다. 내용은 어디에 어떻게 적용이 되는 것인지 이해가 잘 가지 않습니다.

 

혹시 어떠한 경우에 적용이 되는 내용인지 조금 더 구체적인 예시를 들어주실 수 있으실까요 ?

답변 2

1

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

안녕하세요! denia park님! 🙂 질문 주셔서 감사합니다.

제가 확장함수를 이해하기로는 특정 클래스에 내가 사용할 특정 로직을 심는 함수라고 이해를 했습니다.

네 맞습니다!

우리가 특정 클래스에 특정 로직을 심는 함수를 만든다면 일반적으로 다음과 같은 메소드를 생각하게 되죠!

class Person(
  private val age: Int
) {
  fun isAdult(): Boolean {
    return age >= 20
  }
}

그런데 위의 isAdult() 함수는 private 변수인 age 에 접근하고 있습니다.

이처럼, 누군가는 "확장 함수는 private 변수에 접근할 수도 있다"고 생각할 수 있죠.

 

어차피 외부에서는 확장함수로 추가할 원본 클래스의 private 혹은 protected 멤버에 접근이 불가능할텐데, 확장함수는 원본 클래스의 private, protected 멤버 접근이 안된다.

네네 맞습니다! 사실 같은 말인데요!

  • 어차피 외부에서는 확장함수로 추가할 원본 클래스의 private 혹은 protected 멤버에 접근이 불가능 할텐데

  • 확장함수는 원본 클래스의 private, protected 멤버 접근이 안된다

가 완전히 동일한 말입니다!

 

이런 경우도 생각해보죠!

코틀린에서는 한 파일에 여러 클래스, 여러 함수를 둘 수 있습니다.

class Person(
    private val age: Int
)

fun Person.isAdult(): Boolean {
    return age >= 20
}

이 Person 클래스와 Person.isAdult() 함수가 같은 파일에 있다고 해보죠!

누군가는 이 isAdult() 함수를 (어차피 Class 밖에 있으니) "외부"로 생각할 수도 있고 아니면 (같은 파일에 있으니) "내부"로 생각할 수도 있습니다.

핵심은, 어쨌거나 확장함수로는 class의 private, protected 멤버 및 함수에 접근할 수 없다 입니다. 이렇게 같은 파일에 있더라도 말이죠.

 

결론적으로 "확장함수는 원본 클래스의 private, protected 멤버 접근이 안된다." 자체로 받아들여주시면 될 것 같습니다. 🙂

감사합니다. 🙇



denia park님의 프로필 이미지
denia park
질문자

제가 해당 문구에 대해서 너무 깊게 생각을 했나봅니다.

말씀해주신대로 그냥 해당 문장을 그대로 이해하고 받아들이면 되겠네요.

 

늦은 밤에 질문 했는데 빠르게 답변 주셔서 정말 감사합니다!

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

이해해주셔서 감사합니다! 또 궁금한 점 생기시면 언제든 편하게 질문 주세요! 🙏

0

안녕하세요, 인프런 AI 인턴입니다. denia park님.

확장 함수에 대한 접근 권한 관련 내용을 이해하시고자 하셨는데요. 확장 함수는 원본 클래스의 멤버가 아니라 단순히 외부에서 추가되는 함수입니다. 그래서 원본 클래스의 접근 제어자(private, protected)에 따라 제한됩니다.

간단히 설명 드리면, 확장 함수는 클래스 외부에서 정의되는 함수이기 때문에 클래스의 내부(private, protected) 상태나 메서드에 접근할 수 없습니다. 이는 OOP(객체지향 프로그래밍)의 기본 원칙을 유지하기 위한 것입니다. 즉, 클래스 외부에서 클래스 내부의 세부 구현을 침범하지 못하도록 하는 것입니다.

예를 들어, 아래와 같은 코드가 있다고 가정해보겠습니다:

class Example {
    private val secret = "This is a secret"
}

fun Example.revealSecret() {
    // this.secret 접근 불가
}

이 코드에서 secret이라는 private 멤버는 클래스 외부에서 접근할 수 없으므로, 확장 함수인 revealSecret에서 접근할 수 없습니다.

이와 관련하여 “확장함수는 원본 클래스의 private, protected 멤버 접근이 안된다”는 원칙이 어떻게 적용되는지를 이해해 두시면 좋을 것 같습니다.

관련된 강의 내용이나 다른 질문의 예시로는:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

denia park님의 프로필 이미지
denia park

작성한 질문수

질문하기