[swift] 데이터 모델링

데이터 모델링은 소프트웨어 개발 과정 중 가장 중요한 단계 중 하나입니다. 데이터 모델링은 어떻게 데이터를 구조화하고 조직화할지 결정하는 과정을 의미합니다. Swift에서도 데이터 모델링을 위한 다양한 방법과 도구를 제공하고 있습니다.

1. 클래스와 구조체

Swift에서 데이터 모델링을 위해 주로 사용되는 것은 클래스와 구조체입니다. 클래스와 구조체는 속성과 메서드를 가지며, 데이터를 표현하는 데 사용됩니다. 클래스는 참조 타입이고 구조체는 값 타입이기 때문에 상황에 따라 적절한 타입을 선택해야 합니다.

class Person {
    var name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

struct Car {
    var brand: String
    var model: String
    var year: Int
}

위의 예제에서 Person 클래스는 이름과 나이 속성을 가지며, Car 구조체는 브랜드, 모델, 연식 속성을 가지고 있습니다.

2. 프로퍼티 관찰자

Swift의 프로퍼티 관찰자(property observer)를 사용하면 속성의 값이 변경될 때 추가적인 작업을 수행할 수 있습니다. 데이터 모델링에서 속성 값의 유효성 검사나 값 변경에 따른 다른 속성 갱신 등을 프로퍼티 관찰자를 통해 처리할 수 있습니다.

class BankAccount {
    var balance: Double = 0 {
        willSet {
            print("잔액이 \(balance)에서 \(newValue)로 변경됩니다.")
        }
        
        didSet {
            if balance < 0 {
                print("잔액이 부족합니다.")
                balance = 0
            }
        }
    }
}

위의 예제에서 BankAccount 클래스의 balance 속성은 변경 전에 willSet 블록에서 이전 값과 변경될 값이 출력되며, 변경 후에 didSet 블록에서 잔액이 부족한 경우 0으로 설정합니다.

3. 프로토콜과 상속

Swift의 프로토콜(protocol)과 상속(inheritance)을 사용하여 데이터 모델링을 더욱 유연하게 할 수 있습니다. 프로토콜은 속성과 메서드의 요구사항을 정의하고, 클래스나 구조체에서 이를 구현할 수 있습니다. 상속을 통해 클래스의 계층 구조를 만들어 공통된 속성과 메서드를 재사용할 수 있습니다.

protocol Playable {
    var title: String { get set }
    
    func play()
}

class Movie: Playable {
    var title: String
    
    init(title: String) {
        self.title = title
    }
    
    func play() {
        print("영화를 재생합니다: \(title)")
    }
}

class Song: Playable {
    var title: String
    
    init(title: String) {
        self.title = title
    }
    
    func play() {
        print("노래를 재생합니다: \(title)")
    }
}

위의 예제에서 Playable 프로토콜은 title 속성과 play 메서드를 요구하고 있습니다. Movie 클래스와 Song 클래스는 Playable 프로토콜을 구현하고, 각각의 play 메서드에서 다른 방식으로 재생합니다.

결론

Swift에서의 데이터 모델링은 클래스와 구조체, 프로퍼티 관찰자, 프로토콜과 상속 등 다양한 기능을 활용하여 유연하고 구조화된 데이터 모델을 만들 수 있습니다. 데이터 모델링을 올바르게 수행하면 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.

참고 문서: