티스토리 뷰

Swift

Swift ) tuple

Zedd0202 2017. 10. 2. 18:00
반응형

안녕하세요 :) Zedd입니다.

오늘은 어떤분이 Collection시리즈에 tuple은 없냐고 하셔서, tuple을 써볼까 해서 여기저기 찾아봤어요.

사실 tuple은 Swift의 Collection Type이 아니랍니다.  

Swift의 Collection Type에는 배열(Array), 사전(Dictionary), 집합(Set).이 있어요.

tuple은..음..tuple을 아직 모르시는 분들이 계실 수 있으니까 지금 자세하게 설명을 드리진 않을게요 :)

tuple의 원소들은 서로 다른 타입일 수 있기때문에 Collection취급을 하지 않는 것 같아요.

그래도 tuple은 Type이랍니다.

이 tuple글을 읽기 전에, < Types > 글을 읽고오시는 것을 추천드릴게요. ㅎㅎ

읽고 오신다면, 이글이 더 이해가 잘 가실거에요. 




tuple




사실 Swift에서 tuple은 큰 힘?을 가지고 있지 않아요. 아니 음....덜 유명하달까

다른분들은 어떤지 모르겠지만, 저는 tuple을 거의 쓰지 않아요.

제가 tuple을 잘 몰라서!!!! 그럴수도 있겠죠? 

저와 같은 분들을 위해, tuple을 어떻게 쓰는건지 천천히 알아가봅시다. 


tuple은 아주아주 간단한 Struct(구조체)라고 생각하시면 편합니다. 

여러가지 "타입"을 한꺼번에 묶어서 사용할 수 있어요. 


var tuple = (1, "Hello, world!", true)

이렇게요!

그리고 우리 저번시간에 < Types >글에서 배웠죠? 

tuple은 compound type으로, named type뿐만아니라, compound type도 담을 수 있다고!!

즉, tuple은 Int, String, Bool과 같은 named type을 담을 수 있지만, 

compound type인 tuple type이나, function type을 담을 수 있답니다.

먼저 tuple type을 담아볼까요? 


var tuple = (1, "Hello, world!", true)

var anotherTuple = (1, (tuple))

anotherTuple에, 위에서 선언했던 tuple이 들어간 것을 볼 수 있죠?


자, 이렇게 볼 수 있듯이 tuple은 괄호()를 통해 만들 수 있습니다. 

(※하나의 타입만을 괄호로 묶는건 아무 소용이 없다고 저번시간에 배웠죠?)


compound type중 tuple type을 담아봤는데요, 이제 function type을 담아볼까요? 

func a() -> Int { return 1 }

func b() -> String { return "Zedd" }

func c() -> Bool { return false }

var functionTuple = (a(), b(), c())

이렇게 function type도 담을 수 있다는 걸 보여드리고 싶었어요 :)




자, 그러면 저 tuple안에 있는 값을 어떻게 쓰느냐!




이렇게 tuple의 이름과 점(.)을 찍으면, 저렇게 숫자들이 나오는데요!!인덱스라고 생각하시면 됩니다. 


var tuple = (1, "Hello, world!", true)

tuple.0 //1

tuple.1 //"Hello, world!"

tuple.2 //true

인덱스만 찍어주면 바로 그 값에 접근이 가능하답니다 :)

tuple안에  tuple을 넣은 예제도 한번 같이 볼까요? 



오 역시 점을 찍으니까! 0번째 인덱스는 그냥 Int였으니까 그냥 Int라고 나오죠?

하지만 1번째 인덱스는 tuple이었으니까, tuple타입이 나오는 것을 알 수 있어요.


anotherTuple에서 tuple의 값을 접근하려면,



이렇게 하면 된답니다. 

var tuple = (1, "Hello, world!", true)

var anotherTuple = (1, (tuple))

anotherTuple.0 //1

anotherTuple.1.0 //1

anotherTuple.1.1 //"Hello, world!"

anotherTuple.1.2 //true

짱편하죠?


또 다른 tuple의 사용법을 알려드릴게요 :)

위 예제에서는 tuple의 원소에 "이름"을 주지 않았는데, "이름"을 줄 수 있답니다. 

var namedTuple = (name: "Zedd", age: 999, likes : ["Swift","iOS"])

짠! 이렇게 원소에 이름을 줄 수 있어요. 

그럼 어떤것이 변하느냐.. 




아까는 튜플이름하고 점을 찍으면, 인덱스 "번호"가 나왔었죠? 이제는 우리가 줬던 "이름"이 나오게 된답니다.


var namedTuple = (name:"Zedd", age:999, likes: ["Swift","iOS"])

namedTuple.name //"Zedd"

namedTuple.age //999

namedTuple.likes //["Swift","iOS"]

바로 이렇게 쓸 수 있다는 점에서 tuple은 아주 간단한 struct(구조체)라고 하는 것 같아요.

마치 namedTuple이라는 구조체가 있고, 구조체 변수로 name, age, likes가 있는 것 같죠.


어 그럼 구조체말고 tuple쓰면 되자나?

..는 조심해야합니다. Swift문서에 따르면,


Tuples are useful for temporary groups of related values. (…) If your data structure is likely to persist beyond a temporary scope, model it as a class or structure (…) 


튜플은 관련된 값들을 임시로 그룹지을때 유용합니다 (...) 만약 데이터구조가 임시범위를 넘어서 존속할 가능성이 있는 경우에는 클래스나 구조체로 모델링하십시오.



라고하네요 :)






tuple에 이름을 주는 것에 대해 더 알아보면,


var namedTuple = (name: "Zedd", age:999, likes: ["Swift","iOS"])

var namedTuple2: (name: String, age: Int, likes: [String]) = ("Zedd", 999, ["Swift","iOS"])

naemdTuple2처럼 아예 이름과 타입을 처음부터 주고 값만 할당해줘도



이름으로 접근이 가능하답니다 :)





또한, 여기서, likes를 보시면서 궁금증이 드시는분들도 계실지도??

tuple에 배열이 들어갈 수 있나요? 

네!! 배열도 named Type이기 때문이에요. 배열은 struct로 구현되어 있죠?


※ 나는 이 tuple로 loop를 돌리고 싶다!!하시는 분들이 있을지도 몰라요 :)

하지만..tuple로 for문을 돌리게 되면, 

does not conform to protocol 'Sequence'

이러한 에러메세지를 볼 수 있어요. 

tuple이 Sequence라는 프로토콜을 준수하고 있지 않기 때문이에요.

그러니까 tuple에 대해서 루프를 돌릴 수 있는 방법은 없습니다. 

주의하세요 :)



하지만!!!!!tuple을 Sequence프로토콜을 따르는 녀석?..에게 넣어주면 루프를 돌 수 있다는 말이 됩니다.

Sequence프로토콜을 따르는 대표적인 것은 바로 배열!!


"배열"안에 tuple을 넣어줄 수 있답니다 :)


var tupleArr = [(1, "Hello, world!", true),(2, "Hello, world!",false)]

이렇게요!

하지만, 배열에 tuple을 넣을 때는 주의할 점이 있습니다. 

바로, 넣어주는 tuple의 타입과 순서가 모두 같아야합니다. 

처음에 Int를 넣어주면 다른 모든 tuple들도 처음에 Int가 들어가야합니다. 

역시나 개수도 맞춰줘야하는건 당연하겠죠?


var tuple = (1, "Hello, world!", true)

var anotherTuple = (1,(tuple))


var tupleArr = [tuple,tuple]//OK

var errorTupleArr = [tuple,anotherTuple]//error!!!!

이렇게요.

그럼 루프를 한번 돌려볼까요? 



오..역시 인덱스 숫자들로 접근이 가능해지네요 :)


var tupleArr = [(1, "Hello, world!", true) ,(2, "Hello, world!",false)]

for index in tupleArr{

    print(index.0)//1 2

    print(index.1)//"Hello, world!" "Hello, world!"

    print(index.2)//true false

}

이렇게 출력되게 됩니다 XD

원소에 이름을 넣게 되면 index.(이름)이 나오겠죠? :)



자, tuple을 더 알아봅시다.


var tuple = (1, "Hello, world!", true)


var (a,b,c) = tuple

print(a)//1

print(b)//"Hello, world!"

print(c)//true

이렇게!!!! 특정한 이름이 아니더라도, 괄호안에 해당 tuple 개수와 맞게 선언해주면,

이렇게도 쓸 수 있답니다.

제가 선언한 순서대로 tuple에 있는 값이 차례대로 들어가게 되죠XD


아 나는 저 tuple에 있는 값중에 하나만 받아올랭

var (_,b,_) = tuple

print(b)//"Hello, world!"

이렇게 하면, 딱 하나만 받아온답니다 :)


이런식으로 변수 "이름"을 선언안하고, tuple에 tuple을 넣는식으로 할때는, 

꼭 넣어주려는 tuple의 개수만큼 tuple개수를 잡아줘야한답니다.

주의하세요 :)





tuple에서 가장 좋은 점은 바로 이제부터 말할 특징이 아닐까 싶은데요,

주로 우리는 함수를 만들 때, 리턴타입이 하나인것을 만들죠? 

하지만 tuple은 여러가지 타입을 한번에 리턴할 수 있답니다.

예제를 한번 볼까요?

func someFunction() -> (Int,String,Bool){

    return (1,"Zedd",true)

}

짠! 이렇게 tuple을 리턴할 수 있답니다. 

그럼 이 someFunction을 사용해볼까요? 


func someFunction() -> (Int,String,Bool){

    return (1,"Zedd",true)

}

var someTuple = someFunction()

someTuple.0//1

someTuple.1//"Zedd"

someTuple.2//true

var (a,b,c) = someFunction()

print(a)//1

print(b)//"Zedd"

print(c)//true

ㅎㅎㅎㅎ신기하죠?

이렇게 여러 타입들을 한번에 리턴할 수 있다는것이 정말 tuple의 장점인것 같아요XD


이렇게 tuple을 배워보았는데요,

tuple은 typealias와 같이 쓰면 깔끔하게 쓸 수 있답니다.

typealias People = (name:String,age:Int, likes:[String])

People이라는 "타입"을 tuple로 만들어주었어요.


var person : People = ("Zedd",999,["Swift","iOS"])

그럼 이렇게 변수가 "People타입"이라고 해주면, tuple을 받을 수 있게됩니다. 

한가지 형식을 가지는 tuple을 여러개 만들 때 유용하겠죠?


var peopleArr : [People] = [("Zedd",999,["Swift","iOS"]),("Your_Name",123,["Piano","Poet"])]

이렇게 People"타입"으로 배열도 만들 수 있겠죠?ㅎㅎ



자..어떠신가요!!

저도 정말 공부가 많이됐어요!!!!!

tuple이 이렇게나 유용했다니XD

이 글이 Swift의 tuple을 이해하는데 도움이 되었으면 좋겠습니다 :)


반응형