객체를 만들기 위해 초기화하는 과정은 클래스의 인스턴스를 생성하는 과정입니다. 초기화는 클래스의 init 메서드를 사용하여 객체의 속성(프로퍼티)을 설정하는 데 사용됩니다. Swift에서는 여러 가지 초기화 방법을 제공하며, 기본 초기화 메서드, 사용자 정의 초기화 메서드, 편의 초기화 메서드 등이 있습니다.
초기화 기본 개념
- 기본 초기화: Swift는 모든 속성이 초기값을 가지고 있다면 기본 초기화를 자동으로 제공합니다.
- 사용자 정의 초기화: 직접 init 메서드를 정의하여 속성을 초기화합니다.
- 편의 초기화: 클래스에서 추가적인 초기화 로직을 제공할 때 사용합니다.
기본 초기화 예제
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 |