상세 컨텐츠

본문 제목

[Dev_Pathway] Customize views with properties : Structures and Classes

Swift&SwiftUI

by (방울)도마토 2024. 7. 3. 13:27

본문

Structures

- 관련된 코드들을 함께 패키징하도록 코드를 구성하는 방법

- 앱의 어느 곳에서나 재사용할 수 있도록 이름을 가짐 

// DayForecast 구조체 
struct DayForecast: View {
    
    let day: String
    let isRainy: Bool
    let high: Int
    let low: Int
    
    var iconName: String {
        if isRainy {
            return "cloud.rain.fill"
        } else {
            return "sun.max.fill"
        }
    }
    
    var iconColor: Color {
        if isRainy {
            return Color.blue
        } else {
            return Color.yellow
        }
    }
    
    
    var body: some View {
        VStack {
            Text(day)
            Image(systemName: iconName)
                .foregroundStyle(iconColor)
                .font(.largeTitle)
                .padding()
            Text("High: \(high)")
                .fontWeight(.semibold)
            Text("Low: \(low)")
                .fontWeight(.medium)
                .foregroundStyle(.secondary)
        }
    }
}

 

 

Structure와 Class의 비교 

 

Documentation

 

docs.swift.org

 

Structures and Classes

- 데이터를 저장하고, 이 데이터를 조작할 수 잇는 메서드를 가질 수 있는 타입 

- 설계도 같은 역할 

예) 자동차 → 바퀴, 엔진, 색상 등의 속성(properties) / 가속하고 멈추는 등의 동작(methods)

⇒ 해당 설계도를 사용해 여러 대의 실제 자동차를 만들 수 있음 

 

 

Comparing Structures and Classes 

in Commons

  • 프로퍼티: 데이터를 저장합니다.
  • 메서드: 데이터를 조작합니다.
  • 서브스크립트: 컬렉션, 리스트, 시퀀스 등의 멤버 요소에 접근할 수 있게 합니다.
  • 초기화 함수: 새로운 인스턴스를 만들 때 초기값을 설정할 수 있습니다.
  • 익스텐션: 기존의 클래스나 구조체에 기능을 추가할 수 있습니다.
  • 프로토콜 준수: 특정 기능을 갖추기 위해 약속된 메서드나 프로퍼티를 구현할 수 있습니다.

 

Differences

  • 상속(Inheritance)
    • 클래스는 상속을 지원합니다. 즉, 다른 클래스로부터 상속받아 새로운 클래스를 만들 수 있습니다.
    • 구조체는 상속을 지원하지 않습니다.
  • 참조 타입 vs. 값 타입
    • 클래스는 참조 타입(reference type)입니다. 이는 클래스 인스턴스가 변수나 상수에 할당되거나 함수에 전달될 때, 실제 데이터가 아닌 데이터의 참조(주소)가 전달된다는 의미입니다.
    • 구조체는 값 타입(value type)입니다. 이는 구조체 인스턴스가 변수나 상수에 할당되거나 함수에 전달될 때, 데이터의 복사본이 전달된다는 의미입니다.
  • 디이니셜라이저(Deinitializer)
    • 클래스는 디이니셜라이저를 가질 수 있습니다. 이는 클래스 인스턴스가 메모리에서 해제될 때 실행되는 코드입니다.
    • 구조체는 디이니셜라이저를 가질 수 없습니다.
    • Deinitializer : 클래스 인스턴스가 메모리에서 해제되기 직전에 호출되어 필요한 정리 작업을 수행할 수 있게 해주는 메서드
  • 자동 메모리 관리(Automatic Reference Counting, ARC)
    • 클래스 인스턴스는 ARC를 통해 메모리가 관리됩니다.
    • 구조체는 ARC의 영향을 받지 않습니다.

 

// class 예시
class Car {
    var color: String
    var speed: Int

    init(color: String, speed: Int) {
        self.color = color
        self.speed = speed
    }

    func accelerate() {
        speed += 10
    }

    func brake() {
        speed -= 10
    }
}

let myCar = Car(color: "Red", speed: 0)
myCar.accelerate()
print(myCar.speed) // 출력: 10

 

// struct 예시
struct Bicycle {
    var color: String
    var speed: Int

    // mutating : struct나 enum 내부에서 method가 자신의 프로퍼티를 수정할 수 있도록 허용하는 property
    mutating func accelerate() {
        speed += 5
    }

    mutating func brake() {
        speed -= 5
    }
}

var myBike = Bicycle(color: "Blue", speed: 0)
myBike.accelerate()
print(myBike.speed) // 출력: 5

 

- 클래스는 참조 타입으로 상속이 가능하고, 메모리 관리를 위해 ARC 사용. 데이터 참조를 전달하여 공유 가능

- 구조체는 값 타입으로 상속이 불가능하고, ARC의 영향을 받지 않음. 데이터를 복사하여 독립적인 인스턴스 생성 

⇒ 클래스는 인스턴스 간의 데이터 공유가 필요할 때, 구조체는 독립적인 데이터가 필요할 때 유용함 

'Swift&SwiftUI' 카테고리의 다른 글

[Swift] 좋은 데이터 구조 (feat. chatGPT)  (0) 2024.07.06
[Swift] ERD(Entity Relationship Diagram)  (0) 2024.07.06
[Dev_Pathway] Hello, SwiftUI  (0) 2024.07.03
[Swift] MVVM  (0) 2024.06.28
[Framework] WidgetKit  (0) 2024.06.16

관련글 더보기

댓글 영역