본문 바로가기

Swift '문법'

객체를 만들기 위한 초기화

객체를 만들기 위해 초기화하는 과정은 클래스의 인스턴스를 생성하는 과정입니다. 초기화는 클래스의 init 메서드를 사용하여 객체의 속성(프로퍼티)을 설정하는 데 사용됩니다. Swift에서는 여러 가지 초기화 방법을 제공하며, 기본 초기화 메서드, 사용자 정의 초기화 메서드, 편의 초기화 메서드 등이 있습니다.

초기화 기본 개념

  1. 기본 초기화: Swift는 모든 속성이 초기값을 가지고 있다면 기본 초기화를 자동으로 제공합니다.
  2. 사용자 정의 초기화: 직접 init 메서드를 정의하여 속성을 초기화합니다.
  3. 편의 초기화: 클래스에서 추가적인 초기화 로직을 제공할 때 사용합니다.

기본 초기화 예제

class Car {
    var color: String = "Red"
    var model: String = "Sedan"
    
    // 기본 초기화 메서드가 자동으로 제공됨
}

let myCar = Car()
print(myCar.color)  // "Red"
print(myCar.model)  // "Sedan"

사용자 정의 초기화 예제

class Car {
    var color: String
    var model: String
    
    // 사용자 정의 초기화 메서드
    init(color: String, model: String) {
        self.color = color
        self.model = model
    }
}

let myCar = Car(color: "Blue", model: "SUV")
print(myCar.color)  // "Blue"
print(myCar.model)  // "SUV"

편의 초기화 예제

편의 초기화는 주로 상속받은 클래스에서 부모 클래스의 초기화를 돕거나 여러 가지 초기화 방법을 제공할 때 사용됩니다.

class Car {
    var color: String
    var model: String
    
    init(color: String, model: String) {
        self.color = color
        self.model = model
    }
    
    // 편의 초기화 메서드
    convenience init() {
        self.init(color: "Red", model: "Sedan")
    }
}

let defaultCar = Car()
print(defaultCar.color)  // "Red"
print(defaultCar.model)  // "Sedan"

let customCar = Car(color: "Green", model: "Convertible")
print(customCar.color)  // "Green"
print(customCar.model)  // "Convertible"

상속과 초기화

상속을 사용하는 경우, 서브클래스는 슈퍼클래스의 초기화 메서드를 호출해야 합니다.

class Vehicle {
    var speed: Int
    
    init(speed: Int) {
        self.speed = speed
    }
}

class Car: Vehicle {
    var color: String
    var model: String
    
    init(color: String, model: String, speed: Int) {
        self.color = color
        self.model = model
        super.init(speed: speed)  // 슈퍼클래스의 초기화 메서드 호출
    }
}

let myCar = Car(color: "Black", model: "Coupe", speed: 120)
print(myCar.color)  // "Black"
print(myCar.model)  // "Coupe"
print(myCar.speed)  // 120

예제 - 객체 지향 프로그래밍으로 랜덤 이미지 생성 앱 만들기

위에서 다룬 객체 지향 개념을 바탕으로, 랜덤 이미지를 생성하는 앱의 초기화 과정을 포함한 예제를 작성해 보겠습니다.

RandomImageManager 클래스

import UIKit

class RandomImageManager {
    private let imageUrlString = "https://source.unsplash.com/random/300x300"
    
    func downloadRandomImage(completion: @escaping (UIImage?) -> Void) {
        guard let url = URL(string: imageUrlString) else {
            completion(nil)
            return
        }
        
        let task = URLSession.shared.dataTask(with: url) { data, response, error in
            guard let data = data, error == nil else {
                print("Error downloading image: \(String(describing: error))")
                completion(nil)
                return
            }
            completion(UIImage(data: data))
        }
        task.resume()
    }
}

ViewController 클래스

import UIKit

class ViewController: UIViewController {
    let randomImageManager = RandomImageManager()
    
    let imageView: UIImageView = {
        let imgView = UIImageView()
        imgView.contentMode = .scaleAspectFit
        imgView.translatesAutoresizingMaskIntoConstraints = false
        return imgView
    }()
    
    let generateButton: UIButton = {
        let button = UIButton(type: .system)
        button.setTitle("랜덤 이미지 생성", for: .normal)
        button.setTitleColor(.white, for: .normal)
        button.backgroundColor = .systemBlue
        button.layer.cornerRadius = 10
        button.translatesAutoresizingMaskIntoConstraints = false
        return button
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
    }
    
    func setupUI() {
        view.addSubview(imageView)
        NSLayoutConstraint.activate([
            imageView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            imageView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            imageView.widthAnchor.constraint(equalToConstant: 300),
            imageView.heightAnchor.constraint(equalToConstant: 300)
        ])
        
        view.addSubview(generateButton)
        NSLayoutConstraint.activate([
            generateButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            generateButton.topAnchor.constraint(equalTo: imageView.bottomAnchor, constant: 20),
            generateButton.widthAnchor.constraint(equalToConstant: 150),
            generateButton.heightAnchor.constraint(equalToConstant: 50)
        ])
        
        generateButton.addTarget(self, action: #selector(fetchRandomImage), for: .touchUpInside)
    }
    
    @objc func fetchRandomImage() {
        randomImageManager.downloadRandomImage { [weak self] image in
            DispatchQueue.main.async {
                self?.imageView.image = image
            }
        }
    }
}

결론

객체 지향 프로그래밍의 초기화 과정은 클래스를 정의하고, 인스턴스를 생성하며, 속성을 설정하는 과정입니다. 이를 통해 코드의 재사용성, 유지보수성, 확장성을 높일 수 있습니다. 위의 예제는 이러한 객체 지향 개념을 활용하여 랜덤 이미지를 생성하는 앱을 구현한 것입니다.

 

'Swift '문법'' 카테고리의 다른 글

while  (0) 2024.07.23
Swift 함수의 기본형태  (0) 2024.07.22
클래스 상속  (0) 2024.07.17
상속  (0) 2024.07.16
Struct  (2) 2024.07.15