inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Hướng dẫn dành cho người mới bắt đầu sử dụng Java và Kotlin

Bài 16. Cách sử dụng các hàm khác nhau trong Kotlin

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

130

denia park

23 câu hỏi đã được viết

1

안녕하세요 강사님

 

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

 

강의 중에

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

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

 

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

 

이렇게 이해를 하고 나니

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

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

 

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

java kotlin 객체지향

Câu trả lời 2

1

lannstark

안녕하세요! 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 멤버 접근이 안된다." 자체로 받아들여주시면 될 것 같습니다. 🙂

감사합니다. 🙇



1

denia park

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

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

 

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

0

lannstark

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

0

communityai8509

안녕하세요, 인프런 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 멤버 접근이 안된다”는 원칙이 어떻게 적용되는지를 이해해 두시면 좋을 것 같습니다.

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

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

수업노트

0

52

1

싱글톤과 스프링

0

71

2

get() = 3

0

49

2

강사님

0

74

1

강의 복습하면서 생긴 질문

1

93

1

Kotlin과 Java의 현업에서의 활용

0

121

2

data class와 자바의 Lombok을 이용한 DTO 클래스 차이 질문

0

71

1

코틀린에서 상속 시, 주의점에 대한 질문

1

95

3

내용 이해 질문

0

56

1

자바와 코틀린의 함수형 프로그래밍,

1

91

1

플랫폼 타입 설명 문의

2

73

2

널 아님 단언 관련 질문

0

83

1

강의 중 질문

0

79

2

범위 비교 질문

1

91

2

타입캐스팅 궁금한점 질문드립니다.

1

239

2

코틀린 val 질문

0

166

2

완강 후 Kotlin 이런저런 질문 드려봅니다!

3

408

2

확장함수 스타일 질문

0

138

2

확장 프로퍼티 질문

1

156

1

update 함수를 만든다는게 어떤 의미인지 예시가 궁금합니다!

1

283

1

java class의 NotNull 어노테이션 인식

1

260

1

리턴타입 사용시 any를 사용해도 괜찮은가요?

1

138

1

안녕하세요 scope function 에 receiver 가 없는 경우

1

168

1

코틀린 싱글톤 질문

1

218

1