튜플은 컴퓨터 분야에서 특별한 의미를 가지며, 이 이름은 다소 낯설게 들릴 수 있고, 코드를 작성할 때 실제로 적용되는 시나리오는 거의 없습니다. 하지만 놀랍게도 튜플은 프로그래밍과 밀접한 관련이 있습니다. 일부 학생들은 관계형 데이터베이스에서 '레코드'의 또 다른 학술적 명칭이 '튜플'이라는 사실을 모를 수도 있습니다. 레코드는 튜플, 테이블은 관계, 레코드는 테이블로 구성되고, 튜플은 관계를 생성합니다. 이것이 관계형 데이터베이스의 핵심 개념입니다.
튜플은 관계형 데이터베이스에서 분리할 수 없는 부분이지만, 프로그래밍에서는 꼭 필수적이지는 않습니다. 파이썬, F#, haskell, scala 등과 같이 자체 튜플 문법을 가진 프로그래밍 언어도 있지만, Java, JavaScript, C++, C# 등 튜플 문법이 없는 더 인기 있는 언어들도 있습니다.
튜플은 배열이나 객체처럼 필수적인 프로그래밍 요소는 아니지만, 특히 함수가 여러 값을 반환해야 할 때 코드를 작성할 때 매우 편리하게 사용할 수 있습니다. 이 경우 일반적인 관행은 객체를 정의하고, 함수가 반환해야 할 값을 객체의 속성으로 설정한 후, 함수의 반환 값 타입을 객체의 타입으로 설정하는 것입니다. 또는 이 함수가 특정 데이터가 존재하는 매핑 데이터 구조를 반환하도록 할 수도 있습니다. 하지만 두 방법 모두 단점이 있으며, 첫 번째 방법은 신뢰할 수 있지만 코드가 유난히 방대합니다. 요구사항 자체는 함수가 여러 값을 반환하는 한 매우 간단하지만, 이 방법은 미리 타입을 정의하고, 인스턴스화한 뒤 인스턴스 속성을 설정한 뒤 마지막으로 반환해야 하므로 너무 비효율적입니다. 두 번째 방법은 빠르지만 충분히 안전하지 않지만, 함수 내부에서는 맵에 어떤 값이 저장되어 있는지 알 수 있지만, 함수 외부에서는 이 함수의 반환값이 맵임만 알 수 있습니다. 맵에 어떤 값이 저장되는지, 어떤 타입이 있는지는 다인자 개발 프로젝트에서 알 수 없습니다. 이 단점은 특히 명백하며, 안타깝게도 이 방식은 일부 동적 타입 언어에서 선호되는 해결책이며, 이것이 동적 타입 언어가 보안성과 가독성이 떨어진다는 불만을 제기하는 근본적인 이유 중 하나입니다. 따라서 이 유형의 문제에 대한 최선의 해결책은 튜플을 사용하는 것입니다.
문법 자체가 튜플을 지원하는 언어에서는 튜플이 괄호로 표현되며, 예를 들어 (int, bool, string)는 삼중 타입이며, 그 값은 (1, true, "abc")일 수 있습니다. 각 튜플 타입은 고유하며, (int, bool), (bool, int), (string, double)은 모두 이진이지만 서로 다른 튜플입니다. 여기서 특정 튜플을 함수의 반환 값으로 취하면, 가독성과 보안 면에서 앞서 언급한 맞춤 타입을 사용하는 첫 번째 솔루션만큼 좋지는 않지만, 맵을 사용하는 두 번째 솔루션보다는 훨씬 낫습니다. 적어도 튜플을 사용하면 함수가 반환할 값의 수를 알 수 있습니다. 이 값들은 어떤 종류의 가치이며, map을 사용해 두 번째 스킴을 간단하고 빠르게 코딩할 수 있다는 장점이 있습니다.
다행히도 이 프로그래밍 언어들은 이제 제네릭을 지원하며, 내장 튜플이 아닌 튜플 구현이 매우 간단해졌지만, 결국 튜플은 비언어 내장 문법 요소이기 때문에 네이티브 튜플만큼 편리하게 사용하지는 않습니다.
다음은 공식 홈페이지와 수백 개의 깃허브 별을 가진 서드파티 Java 튜플 라이브러리인 Javatuples를 소개합니다. 이 라이브러리는 Java 튜플 분야에서 거의 독점적인 위치를 차지하고 있습니다.
자바튜플은 최대 길이가 10인 튜플을 정의하지만, 10개 튜플에 포함된 요소 수는 이미 너무 많고, 사실상 가독성이 거의 없다고 생각합니다. 튜플 클래스는 다음과 같이 정의됩니다:
단위<A> (1요소)
쌍<A,B> (2 원소)
트리플<A, B, C> (3가지 원소)
사중주<A, B, C, D> (4요소)
퀸텟<A, B, C, D, E> (5가지 요소)
6중주<A, B, C, D, E, F> (6요소)
7중< A, B, C, D, E, F, G> (7 원소)
8중주<A, B, C, D, E, F, G, H> (8 요소)
에네아드<A, B, C, D, E, F, G, H, I> (9가지 원소)
10년<A, B, C, D, E, F, G, H, I, J> (10가지 원소) 이 원형 클래스들은 일반 클래스이므로 괄호 안의 글자는 임의의 타입으로 대체할 수 있습니다. 아래는 이진 코드의 예시입니다
추론을 그리면 나머지 튜플 유형도 같은 방식으로 사용됩니다.
자바의 튜플은 언어 자체에서 지원되지 않기 때문에, 코드가 자바어처럼 보이고 덜 우아해 보입니다. 하지만 코드를 작성할 때는 작성의 편리함이 효율성을 높일 수 있을 뿐만 아니라, 코드 자체가 표현하는 의미, 즉 튜플 자체의 의미(함수)를 사용해 코드를 향상시키는 데 더 많은 주의를 기울여야 하며, 어떻게 작성하는지는 사실상 부차적인 문제일 뿐입니다.
마지막으로, 일반적인 괄호 안의 타입은 Java의 기본 타입이 될 수 없다는 점을 유념해야 합니다. 기본 타입을 사용하려면 박스에 갇힌 기본 타입이어야 합니다. 예를 들어 int 타입은 정수로 변환해야 하며, bool 타입은 불리언 타입에 대응해야 합니다. |