Swift - Initialization(구조체 초기화)

이원석·2024년 11월 26일

Swift

목록 보기
17/38

Initialization

초기화(Initializers)란
구조체/열거형/클래스의 인스턴스를 생성하는 것이 초기화로, 초기화의 역할은 모든 프로퍼티를 기본값으로 초기화 하는 것이다. 인스턴스 내 기본값이 존재하지 않는 프로퍼티가 있을 경우, 초기화에 실패하고 인스턴스는 생성되지 않는다.

구조체를 초기화 하는 방법

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

struct Human {
	let name: String = "abc"
    let age: Int = 123
}

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

  • 값이 있을지 없을지 모를 경우 옵셔널 타입으로 설정
  • 초기화를 할때 옵셔널 타입인 name과 age는 자동으로 nil로 초기화
struct Human {
	let name: String?
    let age: Int?
}

init함수에서 값을 설정해주기

  • init 함수(생성자) 안에서 해당 프로퍼티 초기화
  • init(초기화) 함수가 종료되기 전까진 모든 프로퍼티가 기본 값을 가져야 한다.
struct Human {
	let name: String
    let age: Int
    
    init(name: String){
    	self.name = name
        self.age = 123
    }
}

Memberwise Initializers

구조체가 자동으로 제공하는 생성자로, 파라미터를 통해 모든 프로퍼티의 초기화를 가능하게 한다 => 프로퍼티의 초기화를 따로 지정하지 않을 경우, 초기화 되지 않은 프로퍼티를 초기화할 수 있는 init함수를 자동으로 제공

memberwise initializers로 제공되는 생성자의 파라미터는, 프로퍼티가 선언된 순서와 갯수에 맞추어 생성된다. 이때 파라미터의 이름은 프로퍼티의 이름으로 설정된다.

struct Human {
	let name: String
    let age: Int
}

Human.init(name: "abc", age: 123)
Human.init(age: 123, name: "abc") //에러

프로퍼티가 let으로 선언 되어 있고, 이미 초기화가 되어있는 상태면 생성자 목록에서 제외된다.

struct Human {
	let name: String = "abc"
    let age: Int
}
Human.init(age: 123)

프로퍼티가 var로 선언 되어 있고, 이미 초기화가 되어있는 상태면 해당 프로퍼티를 초기화 하는 생성자와, 제외된 생성자 두 개를 제공한다

struct Human {
	var name: String = "abc"
    let age: Int
}
Human.init(age: 123)
Human.init(name: "abc", age: 123)

생성자를 직접 생성한 경우, memberwise initalizers는 더이상 제공되지 않는다.

  • 만약 사용하고 싶다면 extension사용
struct Human {
    var name: String
    var alias: String
}
 
extension Human {
    init(name: String) {
        self.name = name
        self.alias = name
    }
}
 
Human.init(name: "abc")
Human.init(name: "abc", alias: "efg")

프로퍼티 중 하나라도 private일 경우, memberwise initializers의 접근제어자 또한 private이다.

선언된 프로퍼티 중 하나라도 private 접근 제어자를 가질 경우, 해당 memberwise initializers 또한 접근 제어자가 private가 됨. 따라서 내부에서만 사용할 수 있고, 외부에서 더이상 사용할 수 없음.

참조
개발자 소들이

0개의 댓글