열거형(enum)
- 관련있는 데이터들이 멤버로 구성되어 있는 자료형 객체
- 원치 않는 값이 잘못 입력되는 것 방지
- 입력 받을 값이 한정되어 있을 때
- 특정 값 중 하나만 선택하게 할 때
열거형 멤버별 기능 정의
열거형 멤버에는 메서드도 가능
열거형의 rawValue
String형 값을 갖는 열거형의 rawValue
연관 값(associated value)을 갖는 enum
옵셔널은 연관 값(associated value)을 갖는 enum
구조체 : Memberwise Initializer 자동 생성
기존에 배운 init과 class를 사용한
지금 배우고있는 구조체 - Memberwise Initializer가 자동으로 만들어짐
swift에서 구조체를 사용할 때와 class를 사용할 때의 차이점
구분 | 구조체 | 클래스 |
메모리 영역 | 주로 스택(Stack)에 저장 (단, 클래스 내부 포함 시 힙 사용) | 힙(Heap)에 저장 |
상속 | 불가능 | 가능 |
타입 캐스팅 | 불가능 | 가능 (is/as 연산자 사용) |
생성자 | 기본 생성자 자동 제공 (사용자 정의 생성자 추가 가능) | 기본 생성자 없음 (직접 구현 필요) |
소멸자 | 불가능 | deinit 사용 가능 |
ARC 관리 | 미적용 | 참조 카운팅(ARC) 적용 |
스레드 안전성 | 값 복사 특성으로 인해 안전 | 참조 공유로 인해 주의 필요 |
Mutating 메서드 | 프로퍼티 변경 시 mutating 키워드 필수 | 필요 없음 |
표준 라이브러리 예시 | String, Int, Array 등 대부분의 기본 타입 | NSObject, UIView 등 UIKit/Foundation 클래스 |
타입 | 값 타입 (Value Type) - 복사 시 전체 값이 복제됨 | 참조 타입 (Reference Type) - 복사 시 메모리 주소 공유 |
사용 사례
구조체 | 클래스 |
- 간단한 데이터 모델링 (좌표, 사용자 정보) - 멀티스레드 환경에서 안전성 요구 시 - 상속 불필요 시 |
- 상속이 필요한 경우 - Objective-C 호환성 필요 시 - 인스턴스 생명주기 제어 필요 시 (deinit 활용) |
클래스 내에 구조체
class가 struct보다 더 갖는 특징
- 상속이 가능
- 타입 캐스팅(is as as? as!)을 통해 실행 시점에 클래스 인스턴스의 타입을 검사하고 해석 가능
- deinitializer(deinit{})로 사용한 자원을 반환 가능
- 참조 카운팅을 통해 한 클래스 인스턴스를 여러 곳에서 참조(사용) 가능
구조체는 값 타입(value type) 클래스는 참조 타입(reference type)
Value Type vs Reference Type 비교표
구분 | Value Type (값 타입) | Reference Type (참조 타입) |
저장 방식 | 변수에 실제 값 저장 (스택 메모리 주로 사용) | 변수에 메모리 주소(참조) 저장 (힙 메모리 사용) |
할당 시 동작 | 값 복사 (독립적인 복사본 생성) | 참조 복사 (동일 메모리 주소 공유) |
변경 영향 | 복사본 변경 시 원본 영향 없음 | 복사본 변경 시 원본 함께 변경 |
메모리 관리 | 스택 기반 자동 해제 | 힙 기반 (참조 카운팅/GC 등으로 관리) |
스레드 안전성 | 복사 특성으로 인해 안전 | 공유 참조로 인해 동시성 문제 발생 가능 |
주요 예시 | Int, Double, Struct (Swift), struct (C#), 기본 원시 타입 | Class (Swift/C#), Object, 배열(참조 타입으로 동작하는 경우), 문자열(일부 언어에서 참조 타입) |
함수 전달 시 | 값 복사 전달 (원본 보존) | 참조 전달 (원본 수정 가능) |
사용 사례 | 단순 데이터 모델링, 멀티스레드 환경 | 상속 필요, 대규모 객체 관리 |
구조체는 값 타입(value type) 클래스는 참조 타입(reference type)
언제 클래스를 쓰고 언제 구조체를 쓰나?
- 클래스는 참조타입, 구조체는 값 타입
- 구조체는 간단한 데이터 값들을 한데 묶어서 사용하는 경우
- 전체 덩어리 크기가 작은 경우, 복사를 통해 전달해도 좋은 경우 구조체
- 멀티 쓰레드 환경이라면 구조체가 더 안전
- 구조체는 상속할 필요가 없는 경우
- 너비, 높이를 표현하는 기하학적 모양을 처리할 경우
- 시작값, 증분, 길이 등으로 순열을 표현할 경우
- 3차원 좌표 시스템의 각 좌표
참고자료 : 한성현 교수님 수업자료
'iOS프로그래밍실무 (3학년 1학기)' 카테고리의 다른 글
250508 iOS프로그래밍실무 10주차 (0) | 2025.05.08 |
---|---|
250501 iOS프로그래밍실무 9주차 (1) | 2025.05.07 |
240410 iOS프로그래밍실무 6주차 (0) | 2025.04.10 |
250403 iOS프로그래밍실무 5주차 (0) | 2025.04.03 |
250327 iOS프로그래밍실무 4주차 (0) | 2025.04.02 |