CaseIterable 에 대하여( feat. forEach )

sonny·2024년 9월 26일
1

TIL

목록 보기
6/48

어제 enum에 대한 TIL을 작성했는데, 댓글에 또 공부거리를 제공해주신 팀원님 덕분에 한번 알아볼 겸 오늘의 TIL을 작성해보려한다.

CaseIterable이란?

CaseIterable은 영어 단어로 "Case""Iterable"이라는 두 단어로 이루어져 있다.

  • Case : 선택지나 항목을 의미하는 것, 열거형(enum)에서 우리가 만든 여러 선택지(월요일, 화요일 등)를 케이스라고 부른다.
  • Iterable : 반복할 수 있는이란 뜻. 무언가를 하나씩 순서대로 반복할 수 있을 때 사용한다.

그래서 CaseIterable은 열거형의 케이스들을 하나씩 반복할 수 있게 해주는 것을 뜻하는데CaseIterable은 열거형(enum)을 쉽게 사용할 수 있게 해주는 도구이고, 열거형은 여러 개의 선택지를 만들 때 사용하는 것,CaseIterable을 사용하면 그 선택지들을 자동으로 모두 불러와서 사용할 수 있게 도와준다.

만약 우리가 일주일의 요일을 나타내고 싶다고 해보면 월요일부터 일요일까지의 요일이 있을 것이다.

만약 우리가 일주일의 요일을 나타내고 싶다면?

enum Weekday: CaseIterable {
    case monday, tuesday, wednesday, thursday, friday, saturday, sunday
}

이렇게 요일을 만들어 볼 수 있고, 만약 이 요일들을 모두 다 한 번에 보고 싶으면 CaseIterable을 사용하면 되는 것이다.

for day in Weekday.allCases {
    print(day)
}

해당 코드를 추가했더니 아래처럼 나왔다.

CaseIterable을 사용하면 여러 선택지를 자동으로 모아서 사용할 수 있게 해주는 도구다. 그래서 하나씩 다 입력하지 않아도 편리하게 쓸 수 있는 것이고..

궁금증.1

  • class에서는 CaseIterable을 사용하지 않는다고 한다. Identifiable을 사용해서 고유 식별자를 정의하는것이 일반적이라고 하는데.... 그럼 caseIterableallCases 속성으로만 해서 배열처럼 나오게 밖에 못 하는건가?

그것의 대한 답은, 결론적으로CaseIterable 프로토콜의 경우 열거형(enum)에만 적용되고 클래스(class)구조체(struct)에는 적용되지 않는다고 한다.

CaseIterable은 열거형의 모든 케이스를 배열처럼 자동으로 제공해주는 역할이라서 열거형의 allCases 속성을 통해 모든 케이스에 접근할 수 있도록 지원을 하는 것이기 때문이다.

궁금증.2

  • 클래스구조체CaseIterable을 사용할 수 없는건가?

클래스구조체는 각 인스턴스가 서로 다른 속성 값을 가질 수 있는데,열거형고정된 값 집합을 정의하기 때문에 CaseIterable을 적용해서 그 값의 목록을 자동으로 생성할 수 있는 것이다. 클래스구조체는 각각의 인스턴스가 고유한 상태이니.. 모든 인스턴스를 나열하는 방식은 열거형의 케이스 나열과는 다른 것.

아래 코드를 보자.

enum Beverage: CaseIterable {
    case coffee, tea, juice
}

// 열거형의 모든 케이스에 배열처럼 접근 가능
let allBeverages = Beverage.allCases
for beverage in allBeverages {
    print(beverage)
}

Beverage.allCasescoffee, tea, juice의 배열을 반환하고 열거형의 케이스는 고정되어 있기 때문에 CaseIterable이 이것을 배열처럼 사용할 수 있게 해준다.

만약 클래스(class)에서 배열처럼 사용하려 한다면 ..

클래스에서는 CaseIterable을 사용할 수 없지만, 특정 속성의 값을 배열로 관리하고 싶다면 직접 배열을 정의하여 사용할 수는 있는데, 클래스를 여러 개 생성하고 그 인스턴스를 배열로 관리할 수 있다고 한다.

이렇게 보니 CaseIterable클래스를 이용한 배열의 차이가 확 느껴진다.

그런데 또 이렇게 공부하다보니 forEach 라는 것을 듣게 되었다.

forEach는 배열이나 리스트 안의 모든 항목을 하나씩 꺼내서 그 항목에 대해 어떤 작업을 할 때 사용하는 도구인데, 리스트 안의 항목을 하나씩 반복해서 처리해주는 기능이 CaseIterablefor 문 으로 처리할 때와 비슷하게 간결하다.

forEach의 역할은 마찬가지로 리스트같은 여러 개의 값을 가진 데이터에서 각 값을 차례대로 꺼내고, 그 값에 대해 어떤 동작을 실행할 수 있게 도와주는 것이다. 예로 들자면, 이름 리스트가 있을 때 그 이름들을 하나씩 꺼내서 출력하거나 특정 동작을 할 수 있다는 것.

요약하자면

  • CaseIterable열거형(enum)에만 적용되어, 열거형모든 케이스를 배열처럼 사용할 수 있게 해주는 프로토콜이다.

  • 클래스구조체에서는 CaseIterable을 사용할 수 없기에 배열처럼 사용하려면 인스턴스를 직접 생성하여 배열로 관리해야 한다.

  • 클래스에서는 CaseIterable 대신 배열을 수동으로 관리하는 것이 일반적이다.

  • forEach는 간단하고 깔끔하게 반복 작업을 처리할 수 있다. for문 과 비슷한 역할을 하지만, 더 짧고 명확한 코드로 여러 데이터를 처리할 때 유용하다.

느낀 점

CaseIterable을 공부하면 할수록 열거형을 더 효율적으로 관리할 수 있다는 것을 점점 알게 되는 듯 하다. 전에는 열거형의 예스들을 보면서 각 케이스를 하나씩 처리하는 것이 번거롭다고 느꼈었는데, 이제는 자동으로 배열처럼 다룰 수 있어 이러한 부분이 필요한 작업을 하게 된다면 굉장히 편하게 사용될 수 있을 것 같다.

특히 많은 케이스를 반복 처리해야 하는 부분에서도 마찬가지로 코드가 훨씬 짧고 깔끔해지니 상황에 따라 유용하게 사용할 수 있을 것 같고, forEach와 결합하여 사용할 때의 편리함도 알게 됐다. 원래도 깔끔하다고 생각했던 코드였는데 훨씬 더 짧고 명확하니 말이다.

반복 작업을 간소화하고 코드의 가독성을 높여주는 것 또한 개발자로서의 실력이 보이는 부분일텐데, 앞으로도 더 많은 케이스를 다루는 상황에서 스스로 이 프로토콜들을 잘 활용할 수 있길 내심 바래본다.

profile
iOS 좋아. swift 좋아.

0개의 댓글