Contents

Java Tuple, Reactor의 Tuples

2개의 데이터를 가지는 원소를 묶어서 하나의 변수 인스턴스로 나타내고 싶을 경우가 있다. 대표적인 예시로는 2차원 상의 좌표를 나타내는 예시가 있을 것이다.

좌표를 x, y 라는 두 개의 서로 다른 변수 데이터로 나타내는 것보다 Pair<Double, Double> coordinate 로 나타내는 것이 훨씬 깔끔하고, ‘좌표’ 라는 데이터를 표현하기 직관적이다.

다른 언어와 마찬가지로, 자바에서도 이러한 형태의 데이터 묶음을 제공한다.

https://www.geeksforgeeks.org/pair-class-in-java-tuples/

Pair

JavaTuples 라이브러리에는 2개의 원소를 묶을 수 있는 Pair가 존재한다.

Pair는 몇 가지 특징을 가진다.

  • Typesafe 하다.
  • Immutable 하다.
  • Iterable하다.
  • Serializable 하다.
  • Comparable 하다. (Comparable<Tuple>의 구현체이다)
  • equal()hashCode()를 구현한다.
  • toString()을 구현한다.

즉, Pair 자체만으로도 객체의 거의 모든 것을 사용할 수 있도록 준비를 다 해놓은 상태인 것이다.

인스턴스 생성

  1. new Pair<T, T>(v1, v2);로 생성
  2. Pair.with() 로 생성
  3. Pair.fromCollection()으로 생성 (컬렉션에서 생성 시)

어떤 것을 사용해도 상관 없지만. static한 메서드를 사용하는 것이 더 깔끔해 보이긴 한다.

값 꺼내기

  • x.getValue0()으로 첫 번째 원소를
  • x.getValue1()으로 두 번째 원소를 꺼낼 수 있다.

값 설정

  • x.setAt0()으로 첫 번째 원소를
  • x.setAt1()으로 두 번째 원소를 설정할 수 있다.

앗.. 여기서 잠깐 헷갈렸다. 분명 Tuple은 Immutable 하다고 하지 않았나? 왜 값 변경이 가능할까?

Mutable한 대표적인 컬렉션에는 List가 있다. List는 가변 길이의 원소를 저장할 수 있다.

  • 하지만 Tuples 는 그렇지 않다. 미리 정해진 원소 개수만큼만 저장할 수 있다는 점이 다르다.
  • 때문에 Tuples가 Immutable하다고 한다.

말 나온 김에 List와의 차이점을 정리하자면,

https://www.upgrad.com/blog/list-vs-tuple/

  • TupleList보다 iteration이 빠르고, 메모리 소모도 적다.
    • 하지만 TupleList보다 내장 메서드들이 적다.
  • List에서는 삽입과 삭제가 보다 잘 수행된다.
    • Tuple은 대신 읽기 연산에 더 유리하다.

값 검색

x.contains() 를 통해서 값이 존재하는지 찾을 수 있다.

값 삽입

원하는 위치에 원소를 삽입하는 것은 x.addAt0(), x.addAt1()… 을 통해 할 수 있다.

다른 Tuple 구현체

Pair는 원소의 개수가 두 개인 Tuple 구현체이다. Pair에 값을 더하면 원소의 개수가 3개가 되고, 이는 Triplet이라고 부른다.

https://www.wpr.org/what-s-difference-between-quintet-septet-and-octet

  • 2개면 Pair
  • 3개면 Triplet
  • 4개면 Quartet
  • 5개면 Quintet
  • 6개면 sextet
  • 7개면 septet
  • 8개면 octet
  • 9개면 nonet
  • 10개면 dectet

Reactor의 Tuples

Webflux를 사용하다 보면 이전 파이프라인의 결과 값을 다음 파이프라인에 넘겨주고 싶은 경우가 있다.

데이터 aggregation의 결과 값을 이후 파이프라인에서 사용해야 하는데, 당장은 필요 없는 경우도 사용할 수 있는 것이 Tuples 이다.

https://projectreactor.io/docs/core/release/api/index.html?reactor/util/function/Tuples.html

Reactor의 Tuples는 다음 특징들을 가진다.

  • immutable 하다.
  • 임의의 타입을 가지는 객체의 Collection이다.

Java Tuple과의 차이점

원소의 개수에 따라 Java Tuple은 부르는 명칭이 다 달라졌다. septet, quartet 등..

Reactor의 Tuples는 원소의 개수를 단순히 Tuple 뒤에 명시한다.

Java Tuple과 Reactor의 Tuples, 어떤 걸 언제 써야 할까?

Pair를 쓰는 경우로 이전에 ‘2차원 공간에서의 좌표를 나타날 때’ 를 말했었는데, 데이터가 확실하게 쌍을 이루는 경우에는 Pair를 쓰는 것이 좋다고 느껴진다.

반면 reactor의 Tuples는 단순히 데이터의 컬렉션을 나타낸다. 다음 파이프라인에서 소비되길 바라는 데이터의 집합체이다.

때문에 Webflux를 사용한다면 (애초에 Webflux를 사용하지 않으면 선택지가 Java Tuple 밖에 없다)

  • 2차원 공간의 좌표계처럼 특정 데이터의 쌍을 나타날 때에는 Pair와 같은 Java Tuple을 쓴다.
  • 이외의 모든 경우에서는 reactor의 Tuples를 사용하는 것이 좋다고 생각한다.