[야우쓰] 3주차(2) 클래스 초기화

hello_hidi·2022년 11월 29일
0

야우쓰

목록 보기
15/20
post-thumbnail

초기화

구조체 / 열거형 / 클래스의 인스턴스를 생성하는 것

초기화의 역할은 모든 프로퍼티를 기본값으로 초기화 하는 것이다.
인스턴스 내 기본값이 존재하지 않는 프로퍼티가 있을 경우 초기화에 실패하고 인스턴스는 생성되지 않는다!

왜 초기화를 해야 되나?

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

클래스 초기화 방법

1) 선언과 동시에 프로퍼티에 기본값 넣어주기

class Human {
    let name : String = "희재"
    let age : Int = 23
}

let ryu = Human()
dump(ryu)

// - name : "희재"
// - age : 23

2) 프로퍼티의 타입을 옵셔널 타입으로 설정하기

값이 있을지 없을지 모르는 경우 옵셔널 타입으로 선언, 그러면 초기화할 때 옵셔널 타입인 name, age는 자동으로 nil로 초기화
=> 옵셔널 타입으로 선언하지 않으면 nil값을 받지 못함
var로 선언해야한다!

class Human {
    var name : String?
    var age : Int?
}

let ryu = Human()
dump(ryu)
//  - name: nil
//  - age: nil

3) init 함수에서 값 설정해주기

초기화를 진행 하는 함수인 init함수 즉 생성자를 사용하여 생성자 안에서 해당 프로퍼티들을 초기화 시킬 수 있음.

  • 다양하게 선언할 수 있다.
  • 중요한건 init함수가 종료되기 전까진 모든 프로퍼티가 기본 값을 가져야한다!!!
class Human {
    var name : String?
    let age : Int
    let nickName : String = "hidi"
    
    init(name: String) {
        self.age = 23
    }
}
    
//but.. init함수 종료 전까지 모든 프로퍼티가 기본값을 가져야함
let ryu = Human(name : "ryu")
dump(ryu)
// - name: nil
//  - age: 23
//  - nickName: "hidi"

Q. 클래스도 구조체처럼 암것도 초기화 안해도 에러 안나나요?

A. 아니요. 나요 무조건 나요! 그 이유는 Memberwise Initializers를 제공하지 않기 때문!

why? '자동화된 초기화가 존재할 경우 상속의 상황에서 발생할 수 있는 오류를 개발자가 직접 변경하는 작업이 더 번거롭기 때문에'라고 정의할 수 있습니다. 자세한건 여기서

클래스의 Initializers

1) Desigated Initializers (지정 생성자)

클래스의 모든 프로퍼티를 초기화 하는 생성자
우리가 지금까지 쓰고 있던 ini함수가 바로 지정 생성자이다!!!
두가지의 특징을 설명하자면!

1. 해당 생성자 메서드가 종료되기 전까지, 생성자 안에 모든 프로퍼티는 "초기값"을 지니고 있어야 한다!

옵셔널 변수로 안되거나, 기본 값을 갖지 않는 프로퍼티가 있을 경우엔 생성자를 추가하여 초기값을 지정해줘야 한다!

2. 반드시 super 클래스의 생성자를 호출해야 한다!

만약 부모 클래스의 프로퍼티 중 초기값을 가지지 않는다면 초기화가 안되겠죠?

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

class Ryu: Human {
    var nickName : String
    
    init(nickName: String){
        self.nickName = nickName
        super.init(name: "희재", age: 23)
    }
}

var ryu = Ryu(nickName: "hidi")
dump(ryu)

2) Convenience Initializers

모든 프로퍼티를 초기화 할 필요 없는 생성자로, 반드시 다른 초기화를 호출시켜야 한다.
이때 슈퍼 클래스의 생성자는 호출 시킬 순 없고, 같은 클래스 내에 Conveninece Initializers나 Designated Initializers를 호출 시켜야 한다
최종ㅈ거으로 같은 클래스 내의 Designated Initializers가 호출되어야 한다

한 마디로 말해서!!! Designated Initializers를 도와주는 역할이다!

같은 클래스에 있는 다른 초기화 놈을 또 호출 시키는 것!!!
따라서 최종적으로 같은 클래스 내에 Designated Initializers를 도와준다!

class Human {
    var name : String
    var nickName : String
    
    init(name: String, nickName : String) {
        self.name = name
        self.nickName = nickName
    }
    
    convenience init(name: String) {
        self.init(name: name, nickName: "unknown")
    }
    
    convenience init() {
        self.init(name: "unknown")
    }
}

profile
안뇽희디

0개의 댓글