swift에서 튜플이라는 자료구조형을 지원하는 것은 알고는 있었지만,
사실 나는 코딩할때 튜플을 잘 사용하지 않았다.
실무에서 주 사용 언어가 objective-c여서 그런가....
튜플이라는 자료구조형 존재 자체를 잊고 살았던 것 같다.

그런데 이번에 꼼꼼한 재은씨의 스위프트 문법편을 읽으며 튜플이 이런 자료구조형이었구나! 라고 새롭게 느끼게 되어
멘토님의 과제도 할겸 튜플에 대해 좀더 파고들어보기로 했다.

그렇다면 먼저 그놈의 튜플이란 과연 무엇인가!



튜플의 특징

파이썬에서도 지원하는 집단 자료구조형으로
보통 배열과 많이 비교되곤 한다.
일단 배열과 튜플의 가장 큰 차이점은
튜플은 선언되고 나면 값을 추가, 삭제할 수 없다.
그리고 대괄호가 아닌 소괄호를 사용한다는 점~!

튜플과 배열의 공통점

  1. 인덱스가 있다.

튜플과 배열의 차이점

  1. 배열은 원소의 추가 삭제가 가능하지만 튜플은 선언되고 나면 값을 추가, 삭제 할 수 없다.
  2. 선언시 소괄호를 사용한다.
    3. 여러가지 타입의 아이템을 저장할 수 있다. (배열도 [Any]면 여러타입 저장 가능..)
  3. 튜플은 점으로 인덱스를 연결한다.
  4. 바인딩 처리를 통해 인덱스 대신 속성 형식으로 사용할 수 있다.

//  여러타입 저장 가능
let tuple1 = (1, "a")

// 점으로 인덱스 연결
let tuple2: (Int, String) = (1, "abc")
print(tuple2.0) // 1
print(tuple2.1) // "abc"

// 인덱스 바인딩
let tuple3: (name: "hogang", age: 32)
print(tuple3.name) // "hogang"
print(tuple3.age) // 32

튜플의 장점

1. 함수나 메서드에서 여러개의 값 반환이 가능하다

튜플을 사용하면 별도의 자료형 객체를 만들지 않고도 바로 전달할 수 있어 편리하다!

func myInformation() -> (String, Int, float) {
	return ("hogang", 32, 187.7)
}

let (name, age, height) = myInformation()

// 필요 없는 아이템이 발생한다면?! -> 언더바로 대체 가능
let (name, age, _) = myInformation()


튜플이 없는 언어에서는 어떤 방식으로 함수의 반환값을 두개 이상 전달하는가?!

자바

  1. Class 이용
final class Person {
    public String name;
    public int age;
    public float height;

    public Person(String name, int age, float height) {
        this.name = name
        this.age = age
        this.height = height
    }
}

class Main {
    public static Person getMyInformation() {
        return new Person("hogang", 32, 187.7);
    }

    public static void main(String[] args) {
        Person person = getMyInformation()
        System.out.println(person.name); // "hogang"
        System.out.println(person.age); // 32
        System.out.println(person.height); // 187.7
    }
}

  1. 리스트 이용
import java.util.Arrays;
import java.util.List;

public class Person {
    public static void main(String[] args) {
        List<Object> person = method1();
        System.out.println(person); // ["hogang", 32, 187.7]
    }

    private static List<Object> getMyInformation() {
        String name = "hogang";
        int age = 32;
        float height = 187.7

        return Arrays.asList(name, age, height);
    }
}


C언어

  1. 구조체 이용
struct values
{
  int a;
  int b;
};

values func(int a, int b)
{
  values v;
  v.a = a;
  v.b = b;
  return v;
}

int main()
{
  values v;
  
  v = func(1,2);

  printf("%d\n",v.a); // 1
  printf("%d\n",v.b); // 2

  return 0;
}

  1. 포인터 이용
void calc(int, int, int *, int *);

void calc(int a, int b, int *add, int *mul)
{
  *add = a + b;
  *mul = a * b;
  return 0
}

int main() {
  int a = 2, b = 5;
  int add, mul;
  calc(a, b, &add, &mul);

  printf("%d + %d = %d\n",a, b, add); // 2 + 5 = 7
  printf("%d * %d = %d\n",a, b, mul); // 2 * 5 = 10
}


코드들을 보니 세상 swift의 튜플이 얼마나 감사한 존잰지 깨닫게 된다..... ㅠ
profile
Cogito, ergo sum

0개의 댓글