1. 집합
집합(Sets)은 같은 타입의 서로 다른 값을 중복 없이 저장하고자 할 때 사용하는 집단 자료형이다.
집합은 배열과 매우 유사하지만, 배열을 사용하기에는 순서가 그다지 중요하지 않은 데이터 들이거나 중복 없이 한 번만 저장되어야 하는 데이터를 다룰 때 배열 대신 사용할 수 있는 자료형이다.
집합은 내부적으로 *해시(Hash) 연산의 결과값을 이용하여 데이터를 저장하므로 집합에 저장할 데이터 타입은 해시 연산을 할 수 있는 타입이어야 한다.
📝 집합에 저장할 데이터 타입은 반드시 해시값을 계산하는 방법을 제공해야 한다는 뜻
해시 연산의 결과로 얻을 수 있는 해시값은 일련의 정수로 구성되며, 대상의 값이 같다면 해시 연산에 의한 결과값도 마찬가지로 일치하는 특성이 있다.
📝 해시연산이란?
해시 연산은 보통 해시 알고리즘(Hash Algorithm)이라 불리는 것으로서, 임의의 입력된 메세지를 고정 길이의 데이터 크기로 변환해 주는 알고르짐이다. 해시 알고르짐을 사용하면 아무리 긴 데이터나 아무리 짧은 길이의 데이터라 할지라도 고정 길이의 데이터로 변환할 수 있다.
스위프트에서 제공하는 모든 기본 타입은 기본적으로 해시 연산을 할 수 있다.
만약 스위프트에서 기본으로 제공하는 타입이 아니라 우리가 임의로 만든 타입을 사용하여 집합의 데이터로 저장하려면, 스위프트 표준 라이브러리에서 제공하는 Hashable 프로토콜을 구현해야 한다.
2. 집합의 정의
집합을 정의할 때는 초기값을 사용하여 바로 정의하거나 빈 집합을 선언하고 초기화하는 과정을 거쳐 정의할 수 있다.
초기값을 사용하여 집합을 정의할 때, 값으로 사용되는 데이터 리터럴은 배열과 동일하다.
📝 집합을 정의할 때에는 배열 데이터를 사용하여 정리한다는 거다 🐥
하지만 단순히 배열 데이터를 사용하여 정의하게 되면 컴파일러는 이 데이터들을 집합이 아닌 배열로 인식한다. 이 같은 상황을 방지하고 집합 타입이라는 것을 컴파일러에 직접 알려주기 위해 타입 어노테이션 Set을 기재해야 한다.
📝 Set은 집합을 정의할 때 사용하는 구조체
// 집합의 정의
var genres : Set = ["Classic", "Rock", "Balad"]
위 구문은 음악 장르 데이터들을 집합 타입으로 정의하는 예시다.
초기값으로 사용된 오른쪽 리터럴은 배열이다. 따라서 genres 변수에 대한 타입 어노테이션이 없다면 이 데이터는 배열로 선언될 것이다. 이를 막기 위해 타입 어노테이션 Set을 붙여주고 있다.
집합은 배열처럼 저장할 아이템의 타입을 명시해야 하는 것이 원칙이다. 초기값이 처음부터 할당되어 타입을 추론할 수 있을때는 생략해도 무방하다. 만약 초기값으로 텅 빈 배열을 사용하여 집합을 저장해야 한다면, 타입 어노테이션에서 데이터 타입을 반드시 작성해 주어야 한다.
// 빈 배열 예시
var genres : Set<String> = []
// 전체 타입 어노테이션 예시
var genres : Set<String> = ["Classic", "Rock", "Balad"]
초기값을 사용하지 않은 빈 집합을 정의할 때는 다음과 같은 형식으로 Set 객체를 이용하여 직접 정의할 수 있다.
Set <데이터 타입> ()
// 빈 집합을 정의
var genres = Set<String>()
// 집합에 데이터 추가
genres.insert("Classic")
genres.insert("Rock")
genres.insert("Balad")
배열 리터럴을 초기값으로 이용하여 집합을 정의하였던 앞의 예제와 완전히 동일한 구문이다.
맨 처음 문자열 타입의 집합 객체를 정의하고 genres 변수에 할당한다.
빈 문자열 집합이 genres 변수에 할당되고 난 다음에는 집합에서 데이터를 추가할 때 사용되는 insert(_:) 메소드를 사용하여 개별적으로 세 개를 추가한다.
이를 통해 집합에는 모두 세 개의 데이터가 추가되며 칩합의 크기는 3이 된다.
'메모장' 카테고리의 다른 글
Swift 집합의 동적 추가와 삭제 (3) | 2023.03.24 |
---|---|
Swift 집합 순회 탐색 (2) | 2023.03.22 |
Swift 범위 연산자를 이용한 인덱스 참조 (1) | 2023.03.20 |
Swift 배열 데이터 동적 추가 (1) | 2023.03.16 |
Swift 배열의 동적 선언과 초기화 (1) | 2023.03.15 |