작성
·
41
·
수정됨
1
안녕하세요, 확장 프로퍼티 관련하여 질문이 있습니다!
확장 프로퍼티를 생성자에 추가하는건 어려운 것 같고 내부프로퍼티로 활용하는 정도로 사용하는 것 같은데..
이렇다면 확장 프로퍼티를 주로 사용하는게 isAdult같은 특정 프로퍼티를 이용해 새로운 값을 반환해주는 용도의 프로퍼티를 만드는것 위주로 사용하게 될까요??
사용처가 와닿는게 없어서 실무에서 사용하는경우가 어떤게 있는지 알려주시면 감사하겠습니다!
그리고 추가로 제가 KMan이라는 Person을 상속받는 클래스를 임의로 만들어서 거기에 test2라는 확장 프로퍼티를 만들었는데요,
코드를 찍어보니 아래처럼 KMan에 받아온 value를 대입해주는 것 같은데 KMan이라는 클래스에는 test2라는 프로퍼티가 선언되있는게 없으니 역시나 에러가 나더라구요
커스텀 프로퍼티에서 setter를 만들 수 있는건 그냥 ide에서 대응을 못할 뿐 사실상 불가능한게 맞는건가요? @_@..
public static final void setTest2(@NotNull KMan $this$test2, @NotNull String value) {
Intrinsics.checkNotNullParameter($this$test2, "<this>");
Intrinsics.checkNotNullParameter(value, "value");
setTest2($this$test2, value);
}
답변 1
0
안녕하세요 영욱님~ 🙂 좋은 질문 감사드립니다.
이렇다면 확장 프로퍼티를 주로 사용하는게 isAdult같은 특정 프로퍼티를 이용해 새로운 값을 반환해주는 용도의 프로퍼티를 만드는것 위주로 사용하게 될까요??
라고 표현해 주신 부분이 맞습니다. 결국 확장 프로퍼티나~ 확장 함수나~ 둘은 본질적으로 동일하기에 기존에 존재하는 프로퍼티를 이용해 새로운 값을 반환해주는 용도로 많이 활용됩니다.
다만 어쨌거나 "확장" 이기 때문에 다음과 같이 컬렉션에 대해서도 활용할 수 있는데요,
예를 들어 List<Data>에서 name만 모으고 싶다면..
val List<Data>.names: List<String>
get() = this.map { it.name }
과 같은 식으로 코드를 작성할 수 있고 이를 제네릭과 적절히 활용하면 편리한 유틸 프로퍼티를 많이 만들어 둘 수도 있습니다.
추가로 커스텀 프로퍼티 확장 프로퍼티에서도 setter를 만들 수 있습니다! 🙂
간단한 예시로 아래 코드를 확인해보시면 좋을 것 같습니다.
var Person.myName: String
get() = name.plus("3")
set(value) {
name = value
}
다만 잘 아시겠지만, setter 자체를 사용할 일은 극히 드물다 보니 개인적으로 실무에서 사용해본적은 없습니다! 감사합니다. 🙇