해당 챌린지에서 연결된 심화 개념..? 이라고 하자 🧃
Enum 열거형 기초 개념을 다시 새겨보자 - 1일1챌린지
Enumeration Model custom types that define a list of possible values. 관련 값들을 정의하는 커스텀 타입관련된 값들의 그룹에 대한 공통 타입을 정의한다.코드 내에서 type-safe한 방식으로 값들을 사용할 수 있다
guryss.tistory.com
열거형은 값 타입이다 (like Struct)
값 타입은 메모리에 저장될 때 크기가 컴파일 시점에 반드시 고정되어야 한다.
⭐️ 왜 컴파일 시점에 고정되어야 할까?
컴파일러는 코드를 기계어로 변환할 때, 각 변수가 메모리의 어느 위치에 저장될지 미리 계산해야 한다. 크기를 알아야 "이 변수는 100번지, 다음 변수는 108번지..." 처럼 주소를 순서대로 배정할 수 있기 때문이다.
문제 발생: 열거형이 자기 자신을 포함한다면?
enum ArithmeticExpression {
case number(Int)
case addition(ArithmeticExpression, ArithmeticExpression)
}
크기 계산이 불가능하다!
ArithmeticExpression의 크기를 알고 싶다 → addition 안에 ArithmeticExpression이 2개 있다 → 그 안에 또 ArithmeticExpression이 있다 → 또 그 안에... 안에 .. 안에 .. 안에 .. 무한반복 발생
Swift는 데이터 크기를 알 수 없기 때문에 컴파일 에러가 발생한다.
해결책: indirect 키워드
indirect를 붙이면 해당 케이스를 직접 저장하지 않고, 힙(Heap) 메모리에 저장한 뒤 그 주소(포인터)만 갖는다.
⭐️ 틈새 CS 지식
여기선, 스택 메모리와 힙 메모리의 개념에 대해 알아야 한다.
Stack
크기가 컴파일 시점에 고정된 데이터를 저장한다.
함수가 실행될 때 생성되고, 끝나면 자동으로 사라진다.
매우 빠르다!
Heap
크기가 런타임에 동적으로 결정되는 데이터를 저장한다.
직접 할당/해제를 관리한다. → Swift는 ARC가 자동으로 관리한다.
스택보단 느리다.
→ 핵심 기준: 데이터의 크기를 미리 알 수 있는지 없는지!
⭐️ 틈새 CS 지식 - Pointer란?
포인터: 메모리 주소를 저장하는 변수
현대 64비트 컴퓨터에서 메모리 주소를 표현하고 싶다.
→ 64bits = 8bytes 이므로 딱 8바이트가 필요하다.
즉, 포인터가 가르키는 대상이 Int, String, Enum이든 주소 값 자체의 크기는 항상 8 바이트로 동일하다.
결론!
따라서 indirect 키워드가 존재하면, 포인터만 저장
→ Heap 메모리에 실제 데이터(ArithmeticExpression)를 저장
→ 각 메모리에 적절한 데이터가 들어갔기 때문에, 컴파일 성공!

(indirect enum을 언젠간 실무에 사용할 수 있겠지?)
'Swift' 카테고리의 다른 글
| Enum 열거형 기초 개념을 다시 새겨보자 - 1일1챌린지 (0) | 2026.04.01 |
|---|---|
| Struct vs Class 를 완벽하게 새겨보기 - 1일1챌린지 (0) | 2026.03.30 |