• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

구조 분해는 componentN으로 순서에 의존하는거같은데 이 의존을 없앨 수 없나요?

23.05.28 20:56 작성 조회수 316

1

구조분해가 순서에 의존하는 것 같은데,

이러한 순서에 대한 의존성을 제거할 수는 없는 것인가요?

 

data class Foo(
    var a:String,
    var b:Int,
    var c:Long,
    var d:String
)

fun main(){
    val foo = Foo("hello", 33, 44L, "Bye")

    //기존 방식
    val (a, b, c, d) = foo

    //원하는 방식
    val (c, a) = foo
}

답변 2

·

답변을 작성해보세요.

2

이한솔님의 프로필

이한솔

질문자

2023.05.30

답변 감사합니다! 이번에 배치 프로젝트의 언어를 코틀린으로 바꾸려고하는데 많은 도움이 되었습니다!

김시윤님의 프로필

김시윤

2023.09.28

스프링 배치 기술 사용하시나요?

2

안녕하세요 한솔님! 좋은 질문 감사드립니다! 👍

 

음... 제 생각에는 두 가지 방법이 있을 것 같습니다~~!

 

첫 번째는 a / b / c / d 순서 중에 a와 c만 가져오고 싶다면...

val (a, _, c, _) = foo

와 같이 사용하지 않을 변수를 _ 처리하는 방법이에요!

물론 원하시는 것처럼 a와 c만 가져오는 방식은 아닙니다 ㅎㅎㅎ.. 느낌만 흉내내는거죠...!!

 

두 번째는 componentN을 직접 구현하는 방식입니다.

val (c, a) = foo

class Foo( // 자세히 보시면 data가 빠졌습니다!! data class에서 componentN을 오버라이드 할 수는 없습니다!
  val a: String,
  val b: Int,
  val c: Long,
  val d: String
) {
  operator fun component1(): Long {
    return c // component1로 c를 반환한다
  } 

  operator fun component2(): String {
    return a // component2로는 a를 반환한다
  }
}

이렇게 되면 원하시는대로 c와 a만 정확히 가져올 수는 있지만... 반대로 (d, b)를 가져온다거나... (a, d)를 가져온다거나 이렇게 유연하게 조합을 구성할 수는 없습니다! 😭

 

이 두 방법 외에, 순수하게 구조분해의 원리 (componentN) 를 이용해 (c, a)를 가져오기는 어려울 것 같습니다! 궁금증이 해소되셨으면 좋겠네요~ 감사합니다!! 🙏