아리의 iOS 탐구생활

[Swift] 이니셜라이저(initalizer) / 기본 개념 [1] 본문

Swift/문법

[Swift] 이니셜라이저(initalizer) / 기본 개념 [1]

Ari Lee 2021. 8. 13. 16:59
반응형
이니셜라이저(initalizer)란?
쉽게 예를 들어본다면 아이폰에서 공장초기화를 하는 것을 생각해보면 된다.
초기에 상품이 나올때의 상태로 세팅하는 것과 같다고 볼 수 있다.

 

 

  • class, struct, enum 등의 Instance를 생성할 때 필요한 값들을 넣어주는 준비 작업이다.
  • Property의 초기값을 설정한다.
  • 초기화 작업이 완료되면 메모리에 Instance가 생성 된다.

 

 

 

가장 기본적인 형태는 매개변수가 없는 형태이다.

init() {
 // 이 곳에서 초기화를 구현
}

struct Say {
    var text = "말"
    init() {
        print(text)
    }
}
let test = Say() // 출력: 말

 

 

 

 

🔍 기본값을 지정하여 초기화

초기화할때 프로퍼티의 선언과 동시에 값을 할당하면 그 값을 초기값으로 사용할 수 있다. 

항상 같은 초기값을 가져야한다면 프로퍼티 선언과 동시에 초기값을 할당하는 것이 좋다.

// 저장 프로퍼티에 기본값을 저장해주면 이니셜라이저 생성을 생략할 수 있다.
struct People {
    var name: String = "LeeAri"
    var height: Int = 164
}

 

그러나 이니셜라이저를 생략하고 기본값으로 초기화할 경우, 초기화와 동시에 프로퍼티에 값을 전달해주기 어려운 상황이 된다. 이러한 경우에는 이니셜라이저를 이용하는 것이 좋겠다.

 

 

 

 

🔍 initalizer를 사용하여 초기화

이니셜라이저는 메서드와 달리 괄호 앞에 식별할 수 있는 이름이 없기 때문에
매개변수 이름타입이 initalizer를 식별하는데에 아주 중요한 역할을 한다.

 

 

 

문법은 흔히 우리가 사용하는 메서드와 같다.

struct Info {
    . . . 
    
    // 키만 출력
    init(tall : Double) { . . . }

    // 키와 몸무게 출력
    init(tall: Double, weight: Double) { . . . }

    // 발사이즈만 출력
    init(_ foot: Int) { . . . }
}

let tall = Info(tall: 164.2) // 키: 164.2cm
let weight = Info(tall: 164.2, weight: 53.2) // 키: 164.2cm, 몸무게: 53.2kg
let foot = Info(245) // 245

 

 

 

 

🖐🏻 이니셜라이저의 역할

  • Swift는 에러에 대한 안전을 최우선시 한다.
  • 빈 메모리에 접근하게 된다면 예기치 못한 에러가 발생할 수 있다.
  • 타입 내부에 프로퍼티가 있다면 해당 프로퍼티에는 무조건 값이 있다는 것을 보장해야 한다.

 

 

 

 

🔍 실패 가능한 initalizer

초기화 과정 중에 실패할 가능성이 있는 initalizer도 만들 수 있다.
반환 값으로 Optional을 반환하고 초기화 실패시 nil을 반환한다.
struct Info {

    let footSize: String
    
    init?(_ foot: String) {
        if foot.isEmpty { return nil }
        self.footSize = foot
    }
}

var ari = Info("") // nil
👉🏻 주의 : initalizer는 매개변수명Type으로 구분하기 때문에
              실패 가능한 initalizer인 경우도 같은 매개변수명과 Type을 사용할 수 없다.

 

 

 

🔍 다양한 종류의 Property

 

상수 프로퍼티


  • 상수는 값을 바꿀 수 없다는 법칙은 initalizer에게 통하지 않는다.
  • 만약 값이 없다면 새 값을 할당하는 것은 가능하지만 할당 이후에 변경하는 것은 불가능 하다.
struct Info {

    let footSize: Int
    
    init(_ foot: Int) {
        self.footSize = foot
    }
}

var ari = Info(245)
// ari.footSize = 240
// error: cannot assign to property: 'footSize' is a 'let' constant

 

 

 

Optional Type 프로퍼티


  • Property를 옵셔널 타입으로 선언한 경우 초기값이 없어도 되고 나중에 추가도 가능하게 된다.
  • 초기값이 없는 경우에는 자동적으로 nil로 초기화 된다.
struct Info {
    var tallSize: Double?
    var weightSize: Double?
    var footSize: Int?
    
    // 키만 출력
    init(tall: Double, foot: Int) {
        self.tallSize = tall
        self.footSize = foot
    }
}

var ari = Info(tall: 164.1, foot: 245)

print(ari)
// Info(tallSize: Optional(164.1), weightSize: nil, footSize: Optional(245))

ari.weightSize = 53.2

print(ari)
// Info(tallSize: Optional(164.1), weightSize: Optional(53.2), footSize: Optional(245))

 

 

 

✔️ Apple 공식문서

 

Initialization — The Swift Programming Language (Swift 5.5)

Initialization Initialization is the process of preparing an instance of a class, structure, or enumeration for use. This process involves setting an initial value for each stored property on that instance and performing any other setup or initialization t

docs.swift.org

 

반응형
Comments