4-2. 집합(Set)

🌈 devleeky16498·2022년 4월 11일
0

집합은 콜렉션의 순서에 상관없이 다른 값을 저장한다. 아이템 순서가 중요하지 않거나 아이템이 반복되면 안될 때, 사용 가능하다. 스위프트의 집합은 Foundation모듈의 NSSet클래스와 연결된다.

집합 타입을 위한 해쉬 값(HasheValue for Set)

집합에 저장하기 위한 타입은 반드시 hashable이어야 한다. 즉, 해쉬 값을 계산할 수 있는 방법을 타입은 제공해야 한다. 스위프트의 기본 타입 String, Int, Double, Bool은 기본적으로 hashable이며, 집합의 값 또는 딕셔너리의 키 타입으로 사용이 가능하다. 연관된 값이 없는 열거형의 case값은 기본적으로 hashable이다.

집합 타입의 구문

  1. 집합 타입의 구문은 Set로 작성된다. 배열과 반대로 집합은 짧은 등가형식이 없다. 초기화 구문을 통해서 타입을 포함한 빈 집합 생성이 가능하다.
    var letters = Set<Character>()
    //이는 문자로 구성된 집합으로 초기화 된 변수이다. <>이 안에 집합의 타입을 명시해준다.
  2. 코드에서 타입의 정보를 이미 제공한다면 빈 배열 리터럴을 사용하여 빈 집합 생성이 가능하다.
    letters.insert("a")
    letters = []
    //다음과 같이 타입이 같은 엘리먼트 주입이 가능하며, 또한 빈 배열 리터럴을 사용하여 빈집합 생성이 가능하다.
  3. 배열 리터럴을 통해 집합 생성이 가능하다.
    var favoriteGenres : Set<String> = ["Rock", "Jazz", "Folk"]
    var favoriteGnres : Set = ["Rock", "Jazz", "Folk"]
    //배열 리터럴을 통해 초기화 가능하다.
    //스위프트의 타입유추 때문에 배열 리터럴 초기화 시 타입은 명시하지 않아도 되나, 
    //Set은 반드시 명시해야 집합으로 생성한다.
  4. 집합의 접근과 수정은 배열과 매우 비슷하며 집합의 메서드와 프로퍼티를 통해 가능하다.
    print(favoriteGenres.count)
    //count프로퍼티를 통해서 아이템 갯수를 확인 가능하다.
    if favoriteGenre.isEmpty {
    	print("A")
    }
    //다음과 같이 isEmpty 프로퍼티를 통해서 집합의 비어있는 여부 확인이 가능하다.
    favoriteGenres.insert("POP")
    //insert메서드를 호출해서 아이템을 추가할 수 있다.
    favoriteGenres.remove("Rock")
    favoriteGenres.removeAll()
    //remove메서드를 통해서 아이템을 삭제할 수 있다.
    //removeAll()을 사용하게 되면 모든 아이템을 삭제하게 된다.
    if favoriteGenres.contains("Funk") {
    	print("B")
    }
    //contains메서드 호출을 통해 특정 아이템 포함 여부 조회가 가능하다.
  5. for 루프를 통해서 집합에 값을 반복 가능하다.
    for genre in favoriteGenres {
    	print("\(genre)")
    }
    //다음과 같은 경우, 
    //Rock
    //Jazz
    //Folk
    //다음과 같이 출력된다. 하지만 집합은 인덱스가 없으므로, 
    //출력할 때마다 순서가 랜덤하게 바뀌며 출력된다.
  6. 특정순서를 가지고 집합의 값을 반복하려면 집합의 요소를 연산자를 사용해 정렬 후 반환하는 sorted()메서드를 사용한다.
    for value in favoriteGenres.sorted() {
    	print(value)
    }
    // 다음과 같은 경우 집합이 순서를 가진 배열로 변경되어 인덱스를 가지고 값을 조회하게 된다. 
    //순차적으로 출력이 가능해진다.
    
  7. 교집합, 차집합, 합집합 등에 대해 다양한 메서드로 접근이 가능하다.
    a.intersection(b)  //A교집합B
    a.symmetricDifference(b) // (A합B) - (A교B)
    a.union(b) // A합B
    a.substracting(b) // A-B
profile
Welcome to Growing iOS developer's Blog! Enjoy!🔥

0개의 댓글