dev._.note

[Swift] 초기화(Initialization) 본문

Dev/SWIFT

[Swift] 초기화(Initialization)

Laena 2023. 11. 30. 16:21

📌 초기화와 생성자

  • 초기화는 클래스, 구조체, 또는 열거형의 인스턴스를 생성하고 속성을 초기화하여 사용할 수 있도록 하는 과정을 의미. Swift에서 초기화는 객체가 메모리에 할당되고 속성이 적절히 설정되어 안정적으로 사용될 수 있도록 하는 중요한 단계.

인스턴스란?

객체 지향 프로그래밍에서, 인스턴스(Instance)는 클래스, 구조체 또는 열거형과 같은 타입의 실제 예시를 나타냄. 클래스나 구조체 등의 템플릿(틀)을 기반으로 생성된 실제 데이터를 가리킴. 즉, 클래스나 구조체를 기반으로 만들어진 객체를 인스턴스라 함.

 

// Person 클래스 정의
class Person {
    var name: String
    var age: Int

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

    func greet() {
        print("Hello, my name is \\(name) and I'm \\(age) years old.")
    }
}

// Person 클래스의 인스턴스 생성
let john = Person(name: "John", age: 30)
let emily = Person(name: "Emily", age: 25)

// 생성된 인스턴스 사용
john.greet() // 출력: Hello, my name is John and I'm 30 years old.
emily.greet() // 출력: Hello, my name is Emily and I'm 25 years old.

 

초기화 방법

기본 초기화(Default Initialization):

클래스의 속성이 기본 값으로 초기화되는 것을 지원하며 이는 클래스의 모든 속성이 기본 값을 가지고 있을 때 자동으로 발생.

 

class Person {
    var name: String = ""
    var age: Int = 0
}

let person = Person() // 기본 초기화

 

 

지정 초기화(Designated Initialization):

init 키워드를 사용하여 클래스의 모든 속성을 초기화.

 

class Person {
    var name: String
    var age: Int

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

let person = Person(name: "John", age: 30) // 지정 초기화

 

 

편의 초기화(Convenience Initialization):

기본 초기화 또는 지정 초기화를 간편하게 호출.

 

class Person {
    var name: String
    var age: Int

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

    convenience init(name: String) {
        self.init(name: name, age: 0)
    }
}

let person = Person(name: "Alice") // 편의 초기화 사용

 

 

강제 해제(Force Unwrapping)되지 않는 옵셔널 초기화:

옵셔널 타입을 가진 속성은 선언과 동시에 초기화되거나 나중에 값을 할당가능.

 

class Person {
    var name: String?
    var age: Int = 0
}

let person = Person()
person.name = "Emily"
person.age = 25

 

 

 

📌 실패 가능 생성자

  • 기존 생성자는 컴파일 시점에 모든 프로퍼티가 초기화 되어야 하기 때문에 초기화 실패의 경우, 컴파일 에러가 발생
  • 하지만 실패 가능 생성자(Failable Initializer)는 초기화에 실패하더라도 에러가 발생하지 않고 nil을 리턴. Optional한 생성자.
// class의 실패 가능 생성자

class UserProfile {
    let username: String

    // 실패 가능 생성자: 유효하지 않은 이름을 사용할 경우 초기화 실패
    init?(username: String) {
        // 유효한 사용자 이름인지 확인
        guard username.count >= 5 else {
            return nil // 입력된 사용자 이름이 유효하지 않을 경우 초기화 실패
        }

        self.username = username
    }
}

// 실패 가능 생성자를 사용하여 인스턴스 생성
if let validProfile = UserProfile(username: "user123") {
    print("Valid username: \(validProfile.username)")
} else {
    print("Invalid username. Username should be at least 5 characters long.")
}

if let invalidProfile = UserProfile(username: "user") {
    print("Valid username: \(invalidProfile.username)")
} else {
    print("Invalid username. Username should be at least 5 characters long.")
}


// struct의 실패 가능 생성자

struct Animal {
    let name: String
    
    init?(name: String) {
        if name.isEmpty {
            return nil    // 생성자 내에서 실패 가능 부분에 nil을 리턴하면 됨
        }
        self.name = name
    }
}

let animal1 = Animal(name: "choco") //인스턴스 생성. 타입은 Animal? 이다

let animal2 = Animal(name: "") // 문자열이기에 유효한 타입이지만 nil이 리턴된다


// enum의 실패 가능 생성자

enum HeightUnit {
    case feet
    case centiMeter
    
    init?(symbol: String) {
        switch symbol {
        case "f":
            self = HeightUnit.feet
        case "cm":
            self = HeightUnit.centiMeter
        default:
            return nil
        }
    }
}


let feet: HeightUnit = HeightUnit.feet // HeightUnit 타입

let centi: HeightUnit? = HeightUnit(symbol: "cm") 

let feet2: HeightUnit? = HeightUnit(symbol: "F") // nil
  •  

'Dev > SWIFT' 카테고리의 다른 글

[Swift] readLine()  (2) 2023.12.02
[Swift] 계산기 만들기  (0) 2023.12.01
[Swift] 상속(Inheritance)  (0) 2023.11.30
[Swift] Class와 Struct, Enum  (0) 2023.11.30
[Swift] radix  (0) 2023.11.29