궁금한 내용을 검색해보세요!
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
서근 개발노트
티스토리에 팔로잉
SWIFT/Grammar

Swift : 기초문법 [튜플 - TUPLES] 배열과의 차이점

서근
QUOTE THE DAY

-
Written by SeogunSEOGUN

반응형

본 게시글은 yagom님의 Swift 프로그래밍 3판을 참고하여 작성되었습니다.

 

튜플 TUPLES

튜플은 타입의 이름이 따로 지정되어 있지 않은, 프로그래머 마음대로 만드는 타입입니다. '지정된 데이터의 묶음' 이라고 표현할 수 있죠.

 

Swift의 튜플은 파이썬의 튜플과 유사합니다. 튜플은 타입 이름이 따로 없으므로 일정 타입의 나열만으로 튜플 타입을 생성해줄 수 있습니다. 튜플에 포함될 데이터의 개수는 자유롭게 정할 수 있습니다. 

 

튜플을 사용하면 여러 값을 단일 값에 함께 저장할 수 있습니다. array처럼 들릴 수 있지만 튜플은 다릅니다.

  • 튜플에서는 항목을 추가하거나 제거할 수 없고, 크기가 고정되어 있습니다.
  • 튜플의 항목 유형은 변경할 수 없습니다.
  • 숫자의 위치나 이름을 지정하여 튜플에 있는 항목에 액세스 할 수 있지만, Swift는 존재하지 않는 숫자나 이름을 읽지 못하게 합니다.

튜플은 다음과 같이 여러 항목을 괄호 안에 배치하여 생성됩니다.

var name = (first: "서근", last: "김")

그런 다음 0부터 시작하는 숫자 위치를 입력하여 항목에 액세스 합니다.

name.0

또는 이름을 사용하여 항목에 액세스 할 수 있습니다.

name.first

TIP
 
 

주의
튜플을 만든 후에는 값을 변경할 수 있지만 값의 유형은 변경할 수 없습니다. 만약, 사용자가 이름을 아래와 수정 또는 입력하려고 한다면 Xcode는 에러를 주게 됩니다.

(first: "Justin", age: 25)  //error

튜플 기본 예시

// String, Int, Double 타입을 가지고있는 튜플
var person: (String, Int, Double) = ("서근", 26, 60.5)

// 인덱스를 통해서 값을 빼오는 방법
print("이름: \(person.0), 나이: \(person.1), 몸무게: \(person.2)") // 이름: 서근, 나이: 26, 몸무게: 60.5

person.0 = "포뇨" //인덱스를 통해 값을 할당할 수 있음
person.2 = 70.5

print("이름: \(person.0), 나이: \(person.1), 몸무게: \(person.2)") // 이름: 포뇨, 나이: 26, 몸무게: 70.5

튜플의 각 요소를 이름 대신에 숫자로 표현했기 때문에 간편해 보일 수 있지만, 만약 다른 프로그래머가 코드를 볼 때 각 요소가 어떠한 의미가 있는지 유추하기 쉽지 않겠죠?

 

이름 없이 인덱스로만 각 요소의 데이터가 무엇을 나타내는지 쉽게 파악하기가 어렵기 때문이죠.

 

그래서 튜플의 요소마다 숫자가 아닌 이름을 붙여줄 수도 있습니다. 방법은 아래와 같습니다.

// String, Int, Double 타입을 가지고있는 튜플
var person: (name: String, age: Int, weight: Double) = ("서근", 26, 60.5)

// 인덱스를 통해서 값을 빼오는 방법
print("이름: \(person.name), 나이: \(person.age), 몸무게: \(person.weight)") 
// 이름: 서근, 나이: 26, 몸무게: 60.5

person.0 = "포뇨" //인덱스를 통해 값을 할당할 수 있음
person.2 = 70.5

print("이름: \(person.name), 나이: \(person.age), 몸무게: \(person.weight)") 
// 이름: 서근, 나이: 26, 몸무게: 60.5

또, 튜플에는 타입 이름에 해당하는 키워드가 따로 없다 보니 사용하는데 불편함을 겪기도 합니다. 매번 같은 모양의 튜플을 사용하고 싶은데 선언해줄 때마다 긴 튜플 타입을 모두 써줘야 하는 불편함이 생길 수 있죠. 이럴 때는 타입 별칭 typealias를 사용해서 조금 더 깔끔하고 안전하게 코드를 작성할 수 있습니다.

typealias PersonTuple = (name: String, age: Int, weight: Double)

var Seogun: PersonTuple = ("서근", 26, 60.5)
var Mijin: PersonTuple = ("미진", 19, 53.3)

print("이름: \(Seogun.name), 나이: \(Seogun.age), 몸무게: \(Seogun.weight)") // 이름: 서근, 나이: 26, 몸무게: 60.5
print("이름: \(Mijin.name), 나이: \(Mijin.age), 몸무게: \(Mijin.weight)") // 이름: 미진, 나이: 19, 몸무게: 53.3

튜플은 배열과 어떻게 다른가요?

Swift를 처음 배우면 튜플과 배열이 같다고 보여질 수 있습니다. 하지만 실제로는 차이가 많이 있습니다.

 

튜플과 배열 모두 하나의 변수에 여러 값을 보유 할 수 있지만 튜플은 변경할 수 없는 고정된 집합을 보유하는 반면, 변수 배열은 항목을 무기한 추가할 수 있습니다. 예를 들어, 웹 사이트를 저장할 변수 튜플을 원하면 다음과 같이 작성할 수 있습니다.

var website = (name: "서근블로그", url: "https://seons-dev.tistory.com/")

만약 사용자가 마지막으로 방문한 사이트를 추가하고 싶다면 튜플에서는 더이상 추가할 수 없습니다. 왜냐하면 'name' 과 'url' 만 지정해줬기 때문입니다. 다시한번 튜플은 유형을 변경할 수 없습니다. 'website.name'과 'website.url'로 읽어볼 수 있습니다.

 

튜플 대신 배열을 원했다면 다음과 같이 작성했을 수 있습니다.

var website = ["서근블로그", "https://seons-dev.tistory.com/"]  //배열

배열에는 이름(유형)이 없으므로, website[0]website[1]과 같이 정수를 사용하여 값을 읽어야 합니다.

 

또한, 우리가 지정한 두 개의 문자열이 아닌 임의의 수의 문자열을 포함할 수 있기 때문에 더 많은 항목을 자유롭게 추가할 수 있습니다.

튜플의 장점

튜플의 또 다른 장점은 각 값을 사용자가 생성하므로 이름을 제공할 뿐만 아니라 유형도 제공한다는 것입니다

var person = (name: "서근", age: 26, isMarried: false)

위 코드에서 튜플은 String, IntBool의 단일 값으로 결합되었습니다. 만약 이것을 배열에서 사용했다면 매우 보기 안 좋았겠죠? :)

 

TUPLES TEST :  문제를 풀려면 이곳을 클릭해주세요.

 

 

읽어주셔서 감사합니다🤟

 

 


잘못된 내용이 있으면 언제든 피드백 부탁드립니다.


서근


위처럼 이미지 와 함께 댓글을 작성할 수 있습니다.