열거형(enum) *중요*


compass(열거형이름).을 입력하면 케이스중 하나만 선택가능 (중요)




연관값 = enum의 각 case에 “추가 데이터를 같이 저장하는 기능”

var x : Int? = 20 //.some(20)
var y : Int? = Optional.some(10)
var z : Int? = Optional.none -> .none으로도 쓸 수 있음
var x1 : Optional<Int> = 30
print(x, y, z, x1) //??
->
Optional(20) Optional(10) nil Optional(30)
-> Optional.some(), .some(),
열거형 옵셔널 값이 정의 되어있음으로
값이 nil일 때는 optoinal.none or .none으로 작성
그외 값은 .some(값입력)으로 출력
let age: Int? = 30 //Optional(30)
switch age {
case .none: // nil인 경우
print("나이 정보가 없습니다.")
case .some(let a) where a < 20:
print("\(a)살 미성년자입니다")
case .some(let a) where a < 71:
print("\(a)살 성인입니다")
default:
print("경로우대입니다")
} //30살 성인입니다.
->
30살 성인입니다
구조체(struct)
1. struct 키워드를 직접 사용하는 언어
이건 말 그대로 코드에서 struct를 쓰는 경우입니다.
✔ 대표 언어
- C
- C++
- C#
- Go
- Rust
- Swift
- Zig
- D
- Nim
👉 예 (C)
char name[50];
int age;
};
🔹 2. struct와 거의 동일한 개념 (이름만 다른 경우)
✔ record / type / data 등으로 표현
- Pascal → record
- Ada → record
- Haskell → data
- OCaml → record
- F# → record
- TypeScript → interface / type
👉 예 (TypeScript)
name: string;
age: number;
}
🔹 3. 객체(Object)로 대체되는 언어
이 언어들은 struct 대신 클래스/객체를 사용하지만
역할은 거의 동일합니다.
✔ 대표 언어
- Java
- Python
- JavaScript
- Kotlin
- Ruby
- PHP
👉 예 (Python)
def __init__(self, name, age):
self.name = name
self.age = age
🔹 4. 함수형/특수 언어에서의 구조체 개념
- Elixir → defstruct
- Erlang → record
- Scala → case class
- Julia → struct
👉 예 (Julia)
name::String
age::Int
end
🔹 5. 게임/시스템/저수준에서 많이 쓰는 이유
특히 다음 분야에서 struct가 핵심입니다:
- 시스템 프로그래밍 (C, Rust)
- 임베디드
- 게임 개발 (C++, C# in Unity)
- 네트워크/메모리 최적화
👉 이유:
- 메모리 구조를 직접 제어 가능
- 빠름 (오버헤드 적음)
- 데이터 중심 설계에 유리
🔹 핵심 정리
✔ struct는 거의 모든 언어에 존재
✔ 다만 형태만 다름:
| struct | C 계열 데이터 구조 |
| record | Pascal 계열 |
| class | 객체지향 |
| type/interface | JS/TS |
| data | 함수형 |
🔹 한 줄 결론
👉 struct는 특정 언어 기능이 아니라 "데이터 묶기 개념"이라서 거의 모든 언어에 존재한다.

구조체는 Memberwise Initializer가 자동으로 만들어짐(init) 시험
구조체는 상속불가


class Resolution { //구조체 정의
var width : Int //프로퍼티
var height : Int
init(width: Int, hegiht: Int){
self.width = width
self.height = hegiht
}
}
let myComputer = Resolution(width: 100, hegiht: 200) //인스턴스 생성
print(myComputer.height) //프로퍼티 접근
struct Resolution { //구조체 정의
var width : Int //프로퍼티
var height : Int
}
let myComputer = Resolution(width: 100, height: 200) //인스턴스 생성
print(myComputer.height) //프로퍼티 접근

맴버와이즈 이니셜라이저(Memberwise Initializer )-> 모든 맴버값을 이니셜라이저 할 수 있는 값
| 멤버 | 프로퍼티 (width, height) |
| 와이즈 | 각각 하나씩 |
| 이니셜라이저 | 초기화 함수 |
=> “모든 프로퍼티를 하나씩 받아서 초기화하는 생성자”

클래스내 다른 구조체가 있으면 .을 통해 계속 접근한다.

클래스와 구조체

*차이점*-> class는 상속이 가능하다 (구조체는 상속 x)
struct는 맴버와이즈 이니셜라이저를 자동으로 만들어줌



값타입과 참조타입
값타입 초기 값만 복사가 되고 그 뒤로는 별개로 적용(동작)
주소를 복사하기때문에 2개가 아닌 하나 그럼으로 값이 하나가 바뀌면 값이 공유되어 두개 모두 변경되는것
swift에서 class는 참조타입


🔹 1. 구조체 (값 타입) 실행 흐름
var age: Int = 1
}
var kim = Human()
var lee = kim
👉 여기서 핵심:
- kim을 lee에 넣는 순간 복사(copy)가 일어남
📦 상태:
lee → (age: 1) // 완전히 별개
▶️ 첫 출력
👉 결과:
▶️ lee 변경
print(kim.age, lee.age)
👉 결과:
👉 이유:
- lee만 바뀜 (복사본이기 때문)
▶️ kim 변경
print(kim.age, lee.age)
👉 결과:
👉 완전히 독립적인 데이터
🔹 Int 예제까지 포함한 결과
var y = x
print(x, y) // 1 1
x = 2
print(x, y) // 2 1
y = 3
print(x, y) // 2 3
👉 이것도 동일하게 값 복사
🔥 값 타입 핵심 정리
👉 복사하면:
새로운 데이터가 하나 더 생김
🔹 2. 클래스 (참조 타입) 실행 흐름
var age: Int = 1
}
var kim = Human()
var lee = kim
👉 여기서 핵심:
- 복사가 아니라 “주소 공유”
📦 상태:
kim ──┤ │
│ Human 객체 │ (age: 1)
lee ──┤ │
└──────────────┘
👉 kim과 lee는 같은 객체를 가리킴
▶️ 첫 출력
👉 결과:
▶️ lee 변경
print(kim.age, lee.age)
👉 결과:
👉 이유:
- 같은 객체니까 둘 다 바뀜
▶️ kim 변경
print(kim.age, lee.age)
👉 결과:
🔥 참조 타입 핵심 정리
👉 복사하면:
주소만 복사됨 (같은 데이터 공유)
🧠 값 타입 vs 참조 타입 한방 정리
| 복사 방식 | 데이터 복사 | 주소 복사 |
| 메모리 | 각각 따로 존재 | 하나를 공유 |
| 변경 영향 | 서로 영향 없음 | 서로 영향 있음 |
| 예 | Int, String, struct | class |
🔥 직관적인 비유
📦 값 타입
- 종이 복사
- kim = 원본
- lee = 복사본
👉 서로 따로 수정 가능
🔗 참조 타입
- 같은 구글 문서 링크 공유
- kim, lee 둘 다 같은 문서 열람
👉 한 명이 수정하면 같이 바뀜
🎯 핵심 한 줄
👉 값 타입: “복사해서 사용”
👉 참조 타입: “같이 사용”

ios권장은 구조체 사용
iOS앱개발에서 class와 구조채를 선택하는 기준
🔥 핵심 기준 한 줄
👉 데이터를 안전하게 복사해서 쓰고 싶으면 struct
👉 여러 곳에서 같은 상태를 공유해야 하면 class
🔹 1. struct를 선택해야 하는 경우 (값 타입)
Swift에서 struct는 값 타입이라 복사 기반이야.
✔️ 이런 상황이면 struct
- 단순 데이터 모델
- 변경이 다른 곳에 영향 주면 안 될 때
- SwiftUI 같은 상태 관리
- thread-safe(동시성 안전성)가 중요할 때
📌 예시
var name: String
var age: Int
}
👉 이런 건 struct가 정석
👍 장점
- 버그 적음 (사이드 이펙트 없음)
- 멀티스레드에서 안전
- 예측 가능
❗ 실제 iOS에서 많이 쓰는 곳
- 네트워크 응답 모델(JSON)
- ViewModel (특히 SwiftUI)
- 설정값, 상태값
🔹 2. class를 선택해야 하는 경우 (참조 타입)
class는 참조 타입이라 여러 곳에서 같은 데이터를 공유함.
✔️ 이런 상황이면 class
- 상태를 여러 화면에서 공유해야 함
- 객체의 “정체성(identity)”이 중요
- 변경이 전체에 반영되어야 함
- 상속이 필요
📌 예시
var currentUser: User?
}
👉 앱 전체에서 공유되는 객체
👍 장점
- 데이터 공유 쉬움
- 상태 관리 용이
- UIKit과 자연스럽게 맞음
❗ 실제 iOS에서 많이 쓰는 곳
- ViewController
- 싱글톤 (UserManager 등)
- 데이터 매니저 / 서비스 객체
🔥 가장 중요한 판단 기준 4가지
1️⃣ 공유 필요성
| 값이 독립적 | struct |
| 값이 공유됨 | class |
2️⃣ 변경 영향 범위
| 변경이 퍼지면 안 됨 | struct |
| 변경이 반영되어야 함 | class |
3️⃣ 정체성(identity)
👉 struct
👉 class
4️⃣ 상속 필요 여부
- 필요 없음 → struct
- 필요 있음 → class
🔥 실무에서 자주 쓰는 공식
👉 Apple 권장 스타일 (매우 중요)
“가능하면 struct를 먼저 고려하고, 필요할 때만 class 사용”
🔹 왜 struct를 기본으로 쓰냐?
- 버그 줄어듦
- 예측 가능
- SwiftUI와 궁합 좋음
- 성능도 대부분 문제 없음
🔥 실전 판단 예시
✅ struct 써야 하는 경우
let id: Int
let name: String
}
👉 단순 데이터
✅ class 써야 하는 경우
func fetchData() { }
}
👉 앱 전체에서 공유되는 객체
⚠️ 초보자가 자주 하는 실수
❌ 모든 걸 class로 만듦
👉 사이드 이펙트 폭발
❌ 상태 객체를 struct로 만들어서 값 안 바뀜
👉 UI 업데이트 안됨
🎯 최종 정리
👉 struct:
- 안전, 독립, 데이터 중심
👉 class:
- 공유, 상태, 객체 중심