카테고리 없음

202208026 iOS프로그래밍 7주차 수업과제

jong133 2026. 4. 20. 16:03

4개의 케이스가 있고 열거형으로 하나를 선택할수있다. 시험에 무조건 나옴
열거형에서 .을 찍으면 그다음에는 열거형에 있는 4개의 case에 접근할수있다. 을 찍어서 접근할때 f라는 case가 4개라는 것이다. 이것도 시험엔아ㅗㅁ
열거형에서 rawvalue라는 것은 int값을 잡아주면 0부터 3까지 차례대로 증가한다.
주석처리하면 4월 30일이 나온다.
옵셔널이니까 자료형을 안다고하면 optional을 열거형이름을 생략하고 .을 치면 결과가 똑같이 나온다. none과 some의 값을 기본적으로 받는다.
이거는몰라도되지만
이건 시험에 꼭 나온다.
애플에서는 구조체를 굉장히 좋아하고 memberwise initializer가 자동으로 만들어진다.

struct를 사용하는 프로그래밍언어를 모두다 알려줘

오후 3:08
 

struct를 지원하는 프로그래밍 언어

 

카드를 클릭하면 각 언어별 struct 코드 예제를 볼 수 있어요!

언어별 struct 핵심 차이 요약:

구분언어특징
struct 키워드 그대로 사용 C, C++, C#, Swift, Rust, Go, Zig, V 키워드 동일
struct 대신 다른 방식 사용 Kotlin (data class), Python (@dataclass), TypeScript (interface), Scala (case class) 키워드 다름
class가 아예 없고 struct만 있음 Go, Rust struct가 유일한 객체 표현
값 타입 struct Swift, C, C++, C#, Rust, Go 복사 시 독립적인 복사본 생성
참조 타입 struct 대용 Kotlin, Python, Scala 복사 시 같은 객체를 가리킴

Swift에서 class 대신 struct를 더 많이 쓰는 이유가 바로 값 타입이라서 예상치 못한 데이터 변경을 막아주기 때문이에요! 🛡️

프로퍼티의 초기값이라고 말한다.
class은 int을 지정해줘야된다.
struct는 에러가 안뜬다. 멤버롸이즈로 그 멤버들을 다 초기화 시켜주는 이니셜라이저를 자동으로 만들어준다. 어차피 구조체는 항상 얘내들을 접근해서 초기화하는게 원칙이여서,swift의 구조체에는 멤버라이즈이니셜라이저가 자동으로 만들어준다. 주석으로 해준 부분처럼 멤버라이즈 이니셜라이저라는 것은 멤버들의 값을 초기화할수있는 이니셜라이저이다.
인터뷰할때 class만 상속이되고 구조체는 상속이 될수 없다. 구조체는 멤버라이저이니셜라이저를 자동으로 만들어준다.

 

var x = 1 var y = x //처음에 초기값만정해진거고 값타입을 정해준것이다. 그다음에 x나 y에 넣는다고 위에 대칭으로 값이 똑같이 나오지 않는다, print(x,y) x = 2 print(x,y) y = 3 print(x,y)

x와 y은 전혀 별개라는 것이다.

클래스로 바꾸면은 말도안되는 결과가 나오는데 우리가 지금 바꾼거는 구조체에서 클래스로 바꾼건데 프로그래밍언어에서 레퍼런스는 주소를 의미하고있고, 스트럭트는 값타입이라 처음값만 복사해주고 바이바이였는데 클래스가 레퍼런스라는 kim을 복사해주면 kim의 주소가 복사가 되는것이다. kim의 값이 아닌,

스위프트에서 왜 이런 결과가 나온지 이해가 안되서 그런데 설명해줘

오후 3:38
 
 
 
 

class는 참조 타입! 이게 핵심이에요

코드 분석

 
 
swift
class Human {
    var age: Int = 1
}

var kim = Human()
var lee = kim    // ⚠️ 값 복사가 아니라 "같은 객체를 가리킴"!

핵심 개념 — 참조 타입 시각화

 
 
kim ──┐
      ├──→ [ Human 객체: age = 1 ]  ← 메모리 어딘가에 딱 하나 존재
lee ──┘

var lee = kim 은 kim을 복사한 게 아니라 kim이 가리키는 곳을 lee도 같이 가리키게 된 것! 즉 kim과 lee는 같은 객체를 공유해요


한 줄씩 실행 추적

 
 
swift
var kim = Human()
var lee = kim
// kim → [age: 1]
// lee → [age: 1]  (같은 객체!)

print(kim.age, lee.age)
// 결과: 1 1  ← 당연히 둘 다 같음


lee.age = 20
// lee를 통해 나이를 바꿨는데...
// kim과 lee가 같은 객체라서 kim.age도 바뀜!
//
// kim → [age: 20]
// lee → [age: 20]  (여전히 같은 객체!)

print(kim.age, lee.age)
// 결과: 20 20  ← lee만 바꿨는데 kim도 20!


kim.age = 30
// 이번엔 kim을 통해 바꿔도 마찬가지
// kim → [age: 30]
// lee → [age: 30]  (같은 객체!)

print(kim.age, lee.age)
// 결과: 30 30

class vs struct 비교

 
 
swift
// ❌ class = 참조 타입 (같은 객체 공유)
class HumanClass {
    var age: Int = 1
}
var kim = HumanClass()
var lee = kim          // 같은 객체를 가리킴
lee.age = 20
print(kim.age)   // 20  ← kim도 바뀜!!


// ✅ struct = 값 타입 (복사본 생성)
struct HumanStruct {
    var age: Int = 1
}
var kim2 = HumanStruct()
var lee2 = kim2        // 완전히 독립된 복사본 생성
lee2.age = 20
print(kim2.age)  // 1   ← kim2는 그대로!!

메모리 구조로 이해하기

 
 
[ class 참조 타입 ]

kim  →  주소: 0x001
lee  →  주소: 0x001  ← 같은 주소를 가리킴!

메모리 0x001: [ age: 1 → 20 → 30 ]
                         ↑
              lee가 바꿔도 kim에 반영
              kim이 바꿔도 lee에 반영


[ struct 값 타입 ]

kim2  →  [ age: 1 ]   ← 독립된 공간
lee2  →  [ age: 1 ]   ← 독립된 복사본
                ↑
         lee2를 바꿔도 kim2는 절대 안 바뀜!

한 줄 요약

타입var lee = kimlee 변경 시
class (참조) 같은 객체를 함께 가리킴 kim도 같이 바뀜 😱
struct (값) 독립된 복사본 생성 kim은 그대로 ✅

💡 핵심: class는 변수에 객체 자체가 담기는 게 아니라 객체가 있는 주소가 담겨요. 그래서 lee = kim 하면 주소를 복사하는 거라 둘 다 같은 객체를 건드리게 되는 거예요! 

 

23페이지에 있는 예제는 제외

1차적으로는 왠만한 구조체를 쓰고 상속해야되거나 공유해야되는 일이 있으면 구조체를 써야된다.

iOS앱 개발에서 클래스와 구조체를 선택하는 기준이 머야?

오후 3:45
 

iOS 앱 개발 — class vs struct 선택 기준

핵심 차이 한 줄 요약

 
struct = 값 타입  →  복사 시 독립적인 복사본
class  = 참조 타입 →  복사 시 같은 객체 공유

struct를 선택하는 경우 ✅

1. 단순한 데이터 묶음

 
swift
// ✅ 좌표, 크기, 색상 같은 단순 데이터
struct Point {
    var x: Double
    var y: Double
}

struct Size {
    var width: Double
    var height: Double
}

struct Color {
    var red: Double
    var green: Double
    var blue: Double
}

2. 데이터 모델 (서버에서 받아오는 JSON)

 
swift
// ✅ 서버 응답 데이터는 struct가 적합
struct User: Codable {
    let id: Int
    let name: String
    let email: String
}

struct Post: Codable {
    let title: String
    let content: String
    let author: User
}

3. SwiftUI 뷰 모델

 
swift
// ✅ SwiftUI는 struct 기반
struct ContentView: View {
    var body: some View {
        Text("안녕!")
    }
}

class를 선택하는 경우 ✅

1. UIKit 뷰 / 뷰컨트롤러

 
swift
// ✅ UIKit은 class 기반
class MainViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

class CustomButton: UIButton {
    // UIButton 상속 → 반드시 class!
}

2. 상속이 필요할 때

 
swift
// ✅ 상속 구조가 필요하면 class
class Animal {
    var name: String
    init(name: String) { self.name = name }
    func speak() { }
}

class Dog: Animal {
    override func speak() {
        print("\(name): 멍멍!")
    }
}

class Cat: Animal {
    override func speak() {
        print("\(name): 야옹!")
    }
}

// ❌ struct는 상속 불가!
struct Animal { }
struct Dog: Animal { }  // 컴파일 에러!

3. 여러 곳에서 같은 객체를 공유해야 할 때

 
swift
// ✅ 앱 전체에서 하나만 존재해야 하는 것
class UserSession {
    static let shared = UserSession()  // 싱글톤
    var isLoggedIn: Bool = false
    var currentUser: User?
    private init() { }
}

// 어디서든 같은 객체 접근
UserSession.shared.isLoggedIn = true

4. 생명주기 관리가 필요할 때

 
swift
// ✅ 네트워크, 데이터베이스 등 리소스 관리
class NetworkManager {
    private var session: URLSession
    
    init() {
        session = URLSession.shared
    }
    
    deinit {
        // 메모리 해제될 때 정리 작업
        print("NetworkManager 해제됨")
    }
    
    func fetchData(url: String) { }
}

Apple 공식 권장 기준

 
다음 중 하나라도 해당하면 class 사용:

1. ☑️ Objective-C 코드와 함께 써야 할 때
2. ☑️ 상속이 필요할 때
3. ☑️ 참조를 공유해야 할 때
4. ☑️ deinit이 필요할 때

나머지는 전부 struct 사용! ✅

실전 iOS 프로젝트 예시

 
swift
// ✅ struct — 데이터 모델
struct Product: Codable {
    let id: Int
    let name: String
    let price: Int
}

// ✅ struct — UI 상태
struct CartState {
    var items: [Product] = []
    var totalPrice: Int {
        items.reduce(0) { $0 + $1.price }
    }
}

// ✅ class — 뷰컨트롤러
class CartViewController: UIViewController {
    var state = CartState()
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

// ✅ class — 싱글톤 매니저
class CartManager {
    static let shared = CartManager()
    private var cart = CartState()
    private init() { }
    
    func addItem(_ product: Product) {
        cart.items.append(product)
    }
}

한눈에 비교 정리

기준structclass
데이터 모델 (JSON 등) ✅ 적합 가능
SwiftUI 뷰 ✅ 필수
UIKit 뷰/뷰컨트롤러 ✅ 필수
상속 ❌ 불가 ✅ 가능
싱글톤 ✅ 적합
데이터 공유 ❌ 복사됨 ✅ 공유됨
성능 ✅ 빠름 (스택) 보통 (힙)
멀티스레드 안전 ✅ 비교적 안전 ⚠️ 주의 필요

💡 결론:

  • SwiftUI 개발 → struct 위주로 작성
  • UIKit 개발 → UIViewController, UIView 등은 class 필수
  • 데이터 모델 → 거의 항상 struct
  • 공유·상속·UIKit → class

모르겠으면 일단 struct 로 만들고, 컴파일러가 class 쓰라고 하거나 상속이 필요해지면 그때 class로 바꾸면 돼요! 🎯