집합이란??
-같은 타입의 서로 다른 값을 중복 없이 저장하고자 할때 사용하는 집단 자료형
-배열과 매우 유사하지만 순서가 그다지 중요하지 않은 데이터들이거나 중복 없이 한번만 저장되어야 하는 데이터들을 다룰 때 배열 대신
사용하는 자료형
-내부적으로 해시 (Hash)연산의 결과값을 이용해 데이터 저장
*해시 연산(Hash Algorithm)이 뭐임??
- 임의의 입력된 메시지를 고정 길이의 데이터 크기로 변환해주는 알고리즘
즉, 길든 짧든 고정된 길이의 데이터로 변환 함
해시연산의 여러가지 특성이 있는데 맛만 보자
- 해시값은 일련의 정수로 구성
- 대상의 값이 같다면 해시 연산 결과값도 일치함
- 스위프트에서 제공하는 모든 기본 타입은 해시 연산을 할 수 있음
-But 우리가 임의로 만든 타입을 사용하여 집합의 아이템으로 저장하려면,
스위프트 표준 라이브러리에서 제공하는 Hashable 프로토콜을 구현해야 함
(Hashable 프로토콜 - 대강 hashValue라고 불리는 해시값을 만들어 낼 수 있는 기능을 정의해야 한다라고 이해ㅇㅋ?)
해시 연산이 사용되는 경우들
1)입력 값이 변경될 경우 해시 연산의 결과 값도 달라짐
ex) 데이터의 무결성 검증, 메시지 인증 등에 사용됨
딕셔너리처럼 해시 연산값을 기준으로 데이터를 정렬하여 저장하는 데에 사용되기도 함
해시 연산값을 이용한 자료 탐색은 메모리를 낭비하는 단점이 있지만
2)현존하는 자료 탐색 기술 중에서 가장 빠른 기술이라 많이 사용됨
연산처리 과정에서 일정 부분 원본 데이터의 손실이 발생하므로
해시 연산으로 얻은 결과값을 역이용하여 본래의 데이터를 구하는 것은 수학적으로 매우 어려움
때문에 복호화가 필요없는 암호화에 많이 사용됨
해시 충돌
서로 다른 값을 연산했을 때 같은 결과 값이 나올 가능성이 있음
1)해시충돌 가능성이 큰 알고리즘
ex) 나머지 값 구하는 연산 %
겁나게 큰 수도 10으로 나누면 나머지가 0~9 사이의 숫자가 됨
2)해시 충돌 가능성이 낮을수록 좋은 해시 알고리즘으로 평가 받을 수 있음
ex) MD5, SHA1, SHA256 등
때문에 집합에 저장할 데이터 타입은 해시값을 계산하는 방법을 제공해야 함
집합의 정의
두가지 있음
1. 초기값을 사용하여 바로 정의하는 방법과
2. 빈 집합을 선언하고 초기화하는 과정을 거쳐 정의가능
초기값을 사용하여 바로 정의
- 배열 데이터를 사용하여 정의해 값으로 사용되는 데이터 리터럴은 배열과 동일함
하지만 컴파일러는 이것을 배열로 인식하여 타입어노테이션 Set을 기재해주어야 함!!
원래 집합은 저장할 아이템의 타입을 명시해야 하는 것이 원칙임
var genres : Set<String> = ["Classic", "Rock", "Balad"]
초기값이 처음부터 할당되어 타입을 추론할 수 있을때는 생략해도 무방함
var genres : Set = ["Classic", "Rock", "Balad"]
초기값으로 텅빈 배열을 사용하여 집합을 저장할 때는 아이템 타입을 반드시 적어야 함!
var g : Set<String> = []
초기값을 사용하지 않은 빈 집합을 정의할때 Set 객체를 이용하여 직접 정의 할 수 있음
Set <아이템 타입> ()
1. 문자열 타입의 집합 객체를 정의하고 변수 genres 변수에 할당함
2. 빈 문자열 집합이 genres 변수에 할당됨
3. insert(_:)메소드를 사용해 아이템을 세개 추가함
(집합 genres = 아이템 추가 :3개 집합 크기 3개)
.count, .isEmpty를 사용 ( 아이템의 개수를 알고 싶을때, 비었는지 확인하고 싶을때)
- .count를 이용하여 크기를 확인 할 수 있음
- 배열은 중복이 가능하고 집합은 중복이 안되기 때문에
같은 데이터를 저장했어도 크기가 다를 수 있음
- 집합이 비어 있는지 확인 가능할때
보통 .isEmpty 가 true 인지를 사용하여 판단함, .count 가 0인지로 확인도 가능
집합 순회 탐색
인덱스를 이용하여 순회 탐색은 안되지만, 순회 속성이 제공되므로
집합 자체를 for ~ in 구문에 그대로 넣고 순회 처리하는 방식으로 구문을 작성하면 됨
.sort 메소드 ( 메소드의 반환값을 정렬하고 싶을때)
집합은 원래 순서가 없어 3,4,5 행대로 출력을 하게 되면 뒤죽박죽 출력하게 된다.
.sort()메소드를 사용하면 7,8,9 행대로 정렬된 결과를 출력할 수 있음
이때 집합 자체에 순서를 적용하는 것이 아니라 단순히 메소드의 반환값을 정렬하는 것임
집합의 동적 추가와 삭제
insert(_:) 메소드 (아이템을 추가, 인자값을 집합에 추가하고 싶을때)
이미 같은 아이템이 저장되어 있을 때는 아무 처리도 하지 않음
또한, 출력을 해보니 뒤죽박죽 순서와는 상관없이 출력이 됨
한번에 두개의 아이템은 안되는듯...?
remove(_:) 메소드 (집합의 아이템을 삭제 하고 싶을때)
메소드가 호출되면 집합의 내부 저장소를 검색하여 입력된 인자와 일치하는 아이템을 찾고,
있으면 아이템을 삭제하고 반환함, 없으면 nil을 반환함
removeAll()(집합의 아이템 전체를 삭제 하고 싶을때)
contains(_:)( 집합에 특정 아이템이 있는지 확인하고 싶을때)
해당 집합 내에 일치하는 아이템이 있다? true
없다? false를 반환함
연산에 대해서는 다음시간에....
'Swift랑 친해지기 > Swift 책보면서 정리해보기' 카테고리의 다른 글
[집단자료형] 튜플 (Swift) (0) | 2022.01.27 |
---|---|
[집단 자료형] 집합 연산 (Swift) (0) | 2022.01.26 |
배열 아이템 동적 할당 방법 - 스위프트 (0) | 2022.01.24 |
배열정의 및 선언 - 스위프트(swift) (0) | 2022.01.19 |
집단 자료형 4가지, 파운데이션 프레임워크 - 스위프트 (0) | 2022.01.18 |