본문 바로가기

카테고리 없음

iOS 프로그래밍 실무 7주차

열거형(enum) *중요*

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

열거형에서 원시값rawvalue는 0부터 증가한다(green은 2라고 주었음으로 blue는 3)

 

연관값 자료형

 

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

wrapped ->연관값을 갖는 enum(열거형)

 

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)

 
struct Person {
char name[50];
int age;
};
 

🔹 2. struct와 거의 동일한 개념 (이름만 다른 경우)

✔ record / type / data 등으로 표현

  • Pascal → record
  • Ada → record
  • Haskell → data
  • OCaml → record
  • F# → record
  • TypeScript → interface / type

👉 예 (TypeScript)

 
type Person = {
name: string;
age: number;
}
 

🔹 3. 객체(Object)로 대체되는 언어

이 언어들은 struct 대신 클래스/객체를 사용하지만
역할은 거의 동일합니다.

✔ 대표 언어

  • Java
  • Python
  • JavaScript
  • Kotlin
  • Ruby
  • PHP

👉 예 (Python)

 
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
 

🔹 4. 함수형/특수 언어에서의 구조체 개념

  • Elixir → defstruct
  • Erlang → record
  • Scala → case class
  • Julia → struct

👉 예 (Julia)

 
struct Person
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는 맴버와이즈 이니셜라이저를 자동으로 만들어줌

 

 

외간상 차이는 x

값타입과 참조타입

값타입 초기 값만 복사가 되고 그 뒤로는 별개로 적용(동작)

주소를 복사하기때문에 2개가 아닌 하나 그럼으로 값이 하나가 바뀌면 값이 공유되어 두개 모두 변경되는것

swift에서 class는 참조타입

🔹 1. 구조체 (값 타입) 실행 흐름

 
struct Human {
var age: Int = 1
}

var kim = Human()
var lee = kim
 

👉 여기서 핵심:

  • kim을 lee에 넣는 순간 복사(copy)가 일어남

📦 상태:

kim → (age: 1)
lee → (age: 1) // 완전히 별개
 

▶️ 첫 출력

 
print(kim.age, lee.age)
 

👉 결과:

1 1
 

▶️ lee 변경

 
lee.age = 20
print(kim.age, lee.age)
 

👉 결과:

1 20
 

👉 이유:

  • lee만 바뀜 (복사본이기 때문)

▶️ kim 변경

 
kim.age = 30
print(kim.age, lee.age)
 

👉 결과:

30 20
 

👉 완전히 독립적인 데이터


🔹 Int 예제까지 포함한 결과

 
var x = 1
var y = x
print(x, y) // 1 1

x = 2
print(x, y) // 2 1

y = 3
print(x, y) // 2 3
 

👉 이것도 동일하게 값 복사


🔥 값 타입 핵심 정리

👉 복사하면:
새로운 데이터가 하나 더 생김


🔹 2. 클래스 (참조 타입) 실행 흐름

 
class Human {
var age: Int = 1
}

var kim = Human()
var lee = kim
 

👉 여기서 핵심:

  • 복사가 아니라 “주소 공유”

📦 상태:

┌──────────────┐
kim ──┤ │
│ Human 객체 │ (age: 1)
lee ──┤ │
└──────────────┘
 

👉 kim과 lee는 같은 객체를 가리킴


▶️ 첫 출력

 
print(kim.age, lee.age)
 

👉 결과:

1 1
 

▶️ lee 변경

 
lee.age = 20
print(kim.age, lee.age)
 

👉 결과:

20 20
 

👉 이유:

  • 같은 객체니까 둘 다 바뀜

▶️ kim 변경

 
kim.age = 30
print(kim.age, lee.age)
 

👉 결과:

30 30
 

🔥 참조 타입 핵심 정리

👉 복사하면:
주소만 복사됨 (같은 데이터 공유)


🧠 값 타입 vs 참조 타입 한방 정리

구분값 타입 (struct)참조 타입 (class)
복사 방식 데이터 복사 주소 복사
메모리 각각 따로 존재 하나를 공유
변경 영향 서로 영향 없음 서로 영향 있음
Int, String, struct class

🔥 직관적인 비유

📦 값 타입

  • 종이 복사
  • kim = 원본
  • lee = 복사본
    👉 서로 따로 수정 가능

🔗 참조 타입

  • 같은 구글 문서 링크 공유
  • kim, lee 둘 다 같은 문서 열람
    👉 한 명이 수정하면 같이 바뀜

🎯 핵심 한 줄

👉 값 타입: “복사해서 사용”
👉 참조 타입: “같이 사용”

클래스는 같은 인스턴스를 공유할때 ,구조체는 간단한 데이터

ios권장은 구조체 사용

 

iOS앱개발에서 class와 구조채를 선택하는 기준

🔥 핵심 기준 한 줄

👉 데이터를 안전하게 복사해서 쓰고 싶으면 struct
👉 여러 곳에서 같은 상태를 공유해야 하면 class


🔹 1. struct를 선택해야 하는 경우 (값 타입)

Swift에서 struct는 값 타입이라 복사 기반이야.

✔️ 이런 상황이면 struct

  • 단순 데이터 모델
  • 변경이 다른 곳에 영향 주면 안 될 때
  • SwiftUI 같은 상태 관리
  • thread-safe(동시성 안전성)가 중요할 때

📌 예시

 
struct User {
var name: String
var age: Int
}
 

👉 이런 건 struct가 정석


👍 장점

  • 버그 적음 (사이드 이펙트 없음)
  • 멀티스레드에서 안전
  • 예측 가능

❗ 실제 iOS에서 많이 쓰는 곳

  • 네트워크 응답 모델(JSON)
  • ViewModel (특히 SwiftUI)
  • 설정값, 상태값

🔹 2. class를 선택해야 하는 경우 (참조 타입)

class는 참조 타입이라 여러 곳에서 같은 데이터를 공유함.


✔️ 이런 상황이면 class

  • 상태를 여러 화면에서 공유해야 함
  • 객체의 “정체성(identity)”이 중요
  • 변경이 전체에 반영되어야 함
  • 상속이 필요

📌 예시

 
class UserManager {
var currentUser: User?
}
 

👉 앱 전체에서 공유되는 객체


👍 장점

  • 데이터 공유 쉬움
  • 상태 관리 용이
  • UIKit과 자연스럽게 맞음

❗ 실제 iOS에서 많이 쓰는 곳

  • ViewController
  • 싱글톤 (UserManager 등)
  • 데이터 매니저 / 서비스 객체

🔥 가장 중요한 판단 기준 4가지

1️⃣ 공유 필요성

상황선택
값이 독립적 struct
값이 공유됨 class

2️⃣ 변경 영향 범위

상황선택
변경이 퍼지면 안 됨 struct
변경이 반영되어야 함 class

3️⃣ 정체성(identity)

 
user1 == user2 ? // 값이 같은가?
 

👉 struct

 
user1 === user2 ? // 같은 객체인가?
 

👉 class


4️⃣ 상속 필요 여부

  • 필요 없음 → struct
  • 필요 있음 → class

🔥 실무에서 자주 쓰는 공식

👉 Apple 권장 스타일 (매우 중요)

“가능하면 struct를 먼저 고려하고, 필요할 때만 class 사용”


🔹 왜 struct를 기본으로 쓰냐?

  • 버그 줄어듦
  • 예측 가능
  • SwiftUI와 궁합 좋음
  • 성능도 대부분 문제 없음

🔥 실전 판단 예시

✅ struct 써야 하는 경우

 
struct Product {
let id: Int
let name: String
}
 

👉 단순 데이터


✅ class 써야 하는 경우

 
class NetworkManager {
func fetchData() { }
}
 

👉 앱 전체에서 공유되는 객체


⚠️ 초보자가 자주 하는 실수

❌ 모든 걸 class로 만듦
👉 사이드 이펙트 폭발

❌ 상태 객체를 struct로 만들어서 값 안 바뀜
👉 UI 업데이트 안됨


🎯 최종 정리

👉 struct:

  • 안전, 독립, 데이터 중심

👉 class:

  • 공유, 상태, 객체 중심