상세 컨텐츠

본문 제목

[Swift] 스위프트의 집단 자료형에 대해서 알아보자! - 배열과 집합

Swift

by Mr.Garlic 2022. 5. 31. 00:18

본문

배열, 집합, 튜플, 딕셔너리! 스위프트의 집단 자료형을 뽀개보자

안녕하세요 이웃님들 ~ 오늘은 스위프트의 집단 자료형의 종류와 특징, 사용법을 알아보도록 하겠습니다.

스위프트에서 제공하는 집단 자료형은 현재 다음과 같은데요. 

  • 배열(Array) // [1, 3, 8, 8, 8, 0, 11] ["바보", "똥개", "멍청이", "해삼, "해삼"]
  • 집합(Set) // [1, 3, 8, 0, 11] ["바보", "똥개", "멍청이", "해삼"]
  • 튜플(Tuple) // ("바보", 1, 2.5, "해삼)
  • 딕셔너리(Dictionary) // [ "나이" : 70, "키" : 164, "몸무게" : 60 ]

알고리즘을 학습할 때에도 각 언어의 집단 자료형의 특성을 잘 알아야 문제도 수월하게 풀 수 있다는 사실!

모두 알고 계실거라고 생각합니다! 그만큼 중요한 자료형! 

 

오늘은 배열과 집합의 특성은 무엇이고, 어떻게 사용할 수 있는지 알아보도록 하겠습니다.

집단으로 모여서 공명을 하고 계시네요

 

배열(Array)

배열은 순서를 가지는 리스트 형식의 값 입니다. 여기서 중요한 부분은 순서를 가진다는 것 이겠지요!

다른 언어를 학습하셨던 분들도 대부분 배열은 익숙하실 거라고 생각합니다! 

배열 안에 들어있는 아이템들은 인덱스를 가지고 있는데요, 이 인덱스 즉 순서는 변화를 주지 않으면 변하지 않습니다. 

그리고 그 인덱스는 0번부터 시작한다는 점! 

// 배열의 인덱스를 활용해 아이템을 가져오고 싶다면..?

let array = ["똥개", "멍청이", "해삼", "고구마", "사이다"] //타입이 같은 아이템만 넣을 수 있어요.

array[0] // "똥개"
array[1] // "멍청이"

그런데 만약 배열 내의 아이템을 하나 없애버리면 어떻게 될까요?

직관적으로 아래의 코드와 결과를 보면 알 수 있습니다. 

var array = ["똥개", "멍청이", "해삼", "고구마", "사이다"] // 배열에 변화를 주려면 변수로 선언

array[0] // "똥개"
array[1] // "멍청이"

array.remove(at: 0)

print(array) // ["멍청이", "해삼", "고구마", "사이다"]

array[0] // "멍청이"
array[1] // "해삼"

array.append("콜라") // 배열에 아이템 추가
array.insert("똥개", at: 0) // 특정인덱스에 아이템 추가

print(array) // ["똥개", "멍청이", "해삼", "고구마", "사이다", "콜라"]

0번을 지워줬더니 1번~4번까지의 아이템이 하나씩 앞으로 밀리면서 새로운 0번~3번이 되었습니다.

새로운 아이템을 맨 뒤에 넣어주거나, 중간에 삽입하는 것도 가능합니다. 

 

그러면 이 배열들을 순차적으로 돌면서 각각의 원소를 프린트 하는 코드를 작성해볼까요?

var cities = ["Seoul", "Tokyo", "New York", "London"]

for city in cities {
	print(city)
}

---------프린트 결과----------
"Seoul" 
"Tokyo"
"New York"
"London"

집합(Set)

집합은 같은 타입의 서로 다른 값들을 중복 없이 저장하고자 할 때 사용할 수 있는 집단 자료형입니다.

어렸을때 수학시간에 밴다이어그램 그려가면서 집합 공부 해보셨죠~!

바로 그 집합입니다~!!

 

알고리즘 문제 푸실때.. 가끔 중복이 있는 배열을 받아서 중복 없이 뭔가를 처리해야 할 때도 있잖아요?

그때 필히 사용해야 할 자료형이 집합이겠죠~~!

 

집합은 내부적으로 해시(Hash) 연산의 결과값을 이용해서 데이터를 저장하기 때문에 

저장할 데이터는 반드시 해시 연산이 가능한 타입이어야 합니다. 어차피 Swift 내에는 모든 데이터 타입이 해셔블 하답니다. (해쉬는 숫자로 데이터를 표현하는 방식중에 하나인데, 아무 Int나 String의 hashValue를 프린트해보세요!)

 

집합의 선언

집합을 선언하실때는 타입 어노테이션을 해주어야 배열과 구분됩니다. <> 안에 데이터 타입을 명시해주세요. 암시적으로 알 수 있으면 생략해도 되긴 합니다만, 비어있는 집합을 선언할때는 타입을 꼭 알려주셔야겠죠~~!

var movies: Set<String> = ["horror", "comedy", "romcom"] // 타입 어노테이션을 안해주면 배열이랑 구분이 안되니 꼭 타입을 명시하셔용

 

집합의 순회탐색

집합은 배열과 달리 순서가 따로 없습니다. 그래도 순회 탐색은 순서와 상관없이 가능합니다. 

정렬을 하고 싶다면 sort() 메서드를 활용해 정렬이 됩니다. 

var movies: Set<String> = ["horror", "comedy", "romcom"]

for movie in movies {
	print(movie)
}

// "romcom"
// "comedy"
// "horror"

 

집합에 원소 추가, 삭제하기

var movies: Set<String> = ["horror", "comedy", "romcom"]

movies.insert("musical")
movies.insert("horror")
movies.insert("horror")
movies.insert("horror")

print(movies) // ["horror", "comedy", "romcom", "musical"]

movies.remove("horror")

print(movies) // ["comedy", "romcom", "musical"]

movies.removeAll()

print(movies) // []

if movies.contains("comedy") { // movies내에 "comedy" 원소가 있는지 여부 확인 -> true, false 반환
	print("comedy is there")
} else {
	print("comedy is not there")
}

// "comedy is not there"

 

집합을 쓰는 이유! 집합끼리 연산 (중요)

밴다이어그램 그릴때 우리는 합집합, 여집합, 교집합 등등 다양한 집합의 형태를 배웠잖아요? 이러한 연산을 할 수 있어야 진정한 집합이라고 볼 수 있겠죠?

 

var movies: Set = ["horror", "comedy", "romcom", "action", "fantasy"]
var novels: Set = ["horror", "romance", "fantasy", "thriller"]

// 교집합 찾기
movies.intersection(novels) // ["horror", "fantasy"] 

// 대칭차집합 찾기
movies.symmetricDifference(novels) // ["romcom", "action", "romance", "thriller"]

// 합집합 찾기
movies.union(novels) // ["horror", "comedy", "romcom", "action", "fantasy", "romance", "thriller"]

//차집합 찾기
movies.subtract(novels) // ["comedy", "romcom", "action"]

 

부분집합과 포함관계 판단하기

배열 내부나 집합 내부에 특정 원소가 있는지 확인하는 contains() 메서드 기억하시죠?

집합끼리도 다른 집합을 포함하는 관계가 있는지 확인할 수 있는 간단한 메서드가 있답니다.

var genres: Set = ["horror", "comedy", "romcom", "action", "fantasy", "romance", "thriller"]
var movies: Set = ["horror", "comedy", "romcom", "action", "fantasy"]
var novels: Set = ["horror", "romance", "fantasy", "thriller"]
var babies: Set = ["Anna", "Jamie", "Jack", "Hue", "Jeffrey"]

//장르가 무비의 상위집합인가요?
genres.isSuperset(of: movies) // true

//무비가 장르의 부분집합인가요?
movies.isSubset(of: genres) // true

//공통값이 없는 사이인가요?
genres.isDisjoint(with: babies) // true

 

이것으로 배열과 집합, Swift의 대표적인 자료구조 두가지를 먼저 확인해보았는데요!

다음 포스팅에서는 튜플과 딕셔너리에 대해서 다루도록 하겠습니다!

 

감사합니다~!!

관련글 더보기