어제 enum
에 대한 TIL을 작성했는데, 댓글에 또 공부거리를 제공해주신 팀원님 덕분에 한번 알아볼 겸 오늘의 TIL을 작성해보려한다.
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
을 사용하면 여러 선택지를 자동으로 모아서 사용할 수 있게 해주는 도구다. 그래서 하나씩 다 입력하지 않아도 편리하게 쓸 수 있는 것이고..
class
에서는 CaseIterable
을 사용하지 않는다고 한다. Identifiable
을 사용해서 고유 식별자를 정의하는것이 일반적이라고 하는데.... 그럼 caseIterable
은 allCases
속성으로만 해서 배열처럼 나오게 밖에 못 하는건가?그것의 대한 답은, 결론적으로CaseIterable
프로토콜의 경우 열거형(enum)
에만 적용되고 클래스(class)
나 구조체(struct)
에는 적용되지 않는다고 한다.
CaseIterable
은 열거형의 모든 케이스를 배열처럼 자동으로 제공해주는 역할이라서 열거형의 allCases 속성
을 통해 모든 케이스에 접근할 수 있도록 지원을 하는 것이기 때문이다.
클래스
나 구조체
에 CaseIterable
을 사용할 수 없는건가?클래스
와 구조체
는 각 인스턴스가 서로 다른 속성 값을 가질 수 있는데,열거형
은 고정된 값 집합
을 정의하기 때문에 CaseIterable
을 적용해서 그 값의 목록을 자동으로 생성할 수 있는 것이다. 클래스
와 구조체
는 각각의 인스턴스가 고유한 상태이니.. 모든 인스턴스를 나열하는 방식은 열거형의 케이스 나열과는 다른 것.
아래 코드를 보자.
enum Beverage: CaseIterable {
case coffee, tea, juice
}
// 열거형의 모든 케이스에 배열처럼 접근 가능
let allBeverages = Beverage.allCases
for beverage in allBeverages {
print(beverage)
}
Beverage.allCases
는 coffee
, tea
, juice
의 배열을 반환하고 열거형의 케이스는 고정되어 있기 때문에 CaseIterable
이 이것을 배열처럼 사용할 수 있게 해준다.
클래스
에서는 CaseIterable
을 사용할 수 없지만, 특정 속성의 값을 배열로 관리하고 싶다면 직접 배열을 정의하여 사용할 수는 있는데, 클래스를 여러 개 생성하고 그 인스턴스를 배열로 관리할 수 있다고 한다.
이렇게 보니 CaseIterable
과 클래스
를 이용한 배열의 차이가 확 느껴진다.
forEach
는 배열이나 리스트 안의 모든 항목을 하나씩 꺼내서 그 항목에 대해 어떤 작업을 할 때 사용하는 도구인데, 리스트 안의 항목을 하나씩 반복해서 처리해주는 기능이 CaseIterable
의 for 문
으로 처리할 때와 비슷하게 간결하다.
forEach
의 역할은 마찬가지로 리스트같은 여러 개의 값을 가진 데이터에서 각 값을 차례대로 꺼내고, 그 값에 대해 어떤 동작을 실행할 수 있게 도와주는 것이다. 예로 들자면, 이름 리스트가 있을 때 그 이름들을 하나씩 꺼내서 출력하거나 특정 동작을 할 수 있다는 것.
CaseIterable
은 열거형(enum)
에만 적용되어, 열거형
의 모든 케이스를 배열처럼 사용할 수 있게 해주는 프로토콜이다.
클래스
나 구조체
에서는 CaseIterable
을 사용할 수 없기에 배열처럼 사용하려면 인스턴스를 직접 생성하여 배열로 관리해야 한다.
클래스에서는 CaseIterable
대신 배열을 수동으로 관리하는 것이 일반적이다.
forEach
는 간단하고 깔끔하게 반복 작업을 처리할 수 있다. for문
과 비슷한 역할을 하지만, 더 짧고 명확한 코드로 여러 데이터를 처리할 때 유용하다.
CaseIterable
을 공부하면 할수록 열거형을 더 효율적으로 관리할 수 있다는 것을 점점 알게 되는 듯 하다. 전에는 열거형의 예스들을 보면서 각 케이스를 하나씩 처리하는 것이 번거롭다고 느꼈었는데, 이제는 자동으로 배열처럼 다룰 수 있어 이러한 부분이 필요한 작업을 하게 된다면 굉장히 편하게 사용될 수 있을 것 같다.
특히 많은 케이스를 반복 처리해야 하는 부분에서도 마찬가지로 코드가 훨씬 짧고 깔끔해지니 상황에 따라 유용하게 사용할 수 있을 것 같고, forEach
와 결합하여 사용할 때의 편리함도 알게 됐다. 원래도 깔끔하다고 생각했던 코드였는데 훨씬 더 짧고 명확하니 말이다.
반복 작업을 간소화하고 코드의 가독성을 높여주는 것 또한 개발자로서의 실력이 보이는 부분일텐데, 앞으로도 더 많은 케이스를 다루는 상황에서 스스로 이 프로토콜들을 잘 활용할 수 있길 내심 바래본다.