[Swift] Initializer(생성자) 1/ 3

어흥·2024년 5월 30일

Swift

목록 보기
17/28

안녕하세요! 오늘은 생성자 포스팅을 시작해보겠습니다!
생성자는 인스턴스를 초기화해주는 메서드인데요. 먼저 초기화에 대해서 알아보겠습니다.

초기화는 인스턴스를 생성 과정으로 저장 속성에 대한 초기값을 설정하여 사용가능한 상태가 되게 만들어주는 것을 의미합니다. 그 역할을 수행하는 것이 생성자라고 보면 되겠습니다!

생성자

Set the initial values for a type’s stored properties and perform one-time setup.
생성하려는 인스턴스의 저장 속성에 대한 초기값을 설정하여 사용가능한 상태가 되게 만들어주는 것

이처럼 생성자 메서드 실행의 목적은, 모든 저장 속성 초기화를 통한 인스턴스 생성하는 것입니다. 구체적으로 말하자면 초기화는 클래스, 구조체, 열거형의 인스턴스를 생성하는 과정입니다.

다음 예시는 Color 클래스에서 구현된 3개의 생성자입니다. (생성자는 당연히 오버로딩을 지원합니다.) 3개 생성자 모두 Color가 가지고 있는 저장 속성인 red, green, blue를 초기화한 것을 확인할 수 있습니다.

class Color {
    //let red, green, blue: Double    
    let red: Double
    let green: Double
    let blue: Double
    
     
    init() {      // 1번째 생성자  
        red = 0.0
        green = 0.0
        blue = 0.0
    }

    init(white: Double) { //2번째 생성자 
        red   = white
        green = white
        blue  = white
    }

    init(red: Double, green: Double, blue: Double) { // 3번째 생성자
        self.red   = red
        self.green = green
        self.blue  = blue
    }
}

생성자를 실행하는 것은 간단합니다. 생성하려는 타입 뒤에 소괄호를 붙이거나 init()를 작성하면 됩니다.

var color = Color()
var color2 = Color.init()

color = Color(white: <#T##Double#>)
//color = Color.init(white: <#T##Double#>)

//color = Color(red: <#T##Double#>, green: <#T##Double#>, blue: <#T##Double#>)

Designated initializer(지정 생성자)

init( …. ) 형태를 가지는 생성자로 클래스, 구조체, 열거형에서 모두 사용가능합니다.

  • 오버로딩이 가능하므로, 다양한 파라미터 조합으로 지정 생성자 구현 가능
class Color {
    let red: Double
    let green: Double
    let blue: Double 
    
    init(red: Double, green: Double, blue: Double) { /
        self.red   = red
        self.green = green
        self.blue  = blue
    }
}

var color1 = color = Color(red: <#T##Double#>, green: <#T##Double#>, blue: <#T##Double#>)

위 코드와 같이 모든 저장 속성을 초기화할 수 있어야 합니다.

Default Property Value

저장 속성을 선언과 동시에 초기화하거나 optional 타입으로 선언할 수 있습니다. (optional 타입은 nil로 초기화됨) 이처럼 모든 저장 속성이 선언과 동시에 초기화되는 경우, 별도의 지정 생성자를 구현하지 않아도 됩니다.

struct Fahrenheit {
    var temperature = 32.0
}   
struct Fahrenheit {
    var temperature: Double?
}   

이처럼 모든 저장 속성이 초기화 되는 경우, 기본생성자 자동 제공됩니다.

  • 생성자를 1개이상 구현하면 기본 생성자를 제공하지 않음

지정 생성자 외에도 여러 생성자가 존재하며 구조체와 클래스 별로 지원하는 생성자가 다릅니다. 다음편에는 구조체, 클래스에서 사용할 수 있는 생성자에 대해서 알아보겠습니다.

구조체를 위한 Memberwise Initializer

구조체에서 자동적으로 제공하는 생성자가 있습니다. 바로 memberwise 생성자인데요! (클래스에서는 제공하지 않음❌❌)
멤버와이즈 생성자는 만약 개발자가 구조체를 만들고 어떠한 생성자를 생성하지 않았을 때 자동적으로 제공하는 생성자입니다.

  • 저장 속성이 기본값을 가지고 있더라도 멤버와이즈 생성자 제공 (구현된 생성자가 없어야 함)
struct Size {
    var width = 0.0, height = 0.0
}
let twoByTwo = Size(width: 2.0, height: 2.0)

지금까지 기본적인 생성자에 대해서 알아보았습니다. 지정생성자 외에도 여러 종류의 생성자가 있습니다. 다음 편에서는 여러 종류의 생성자에 대해서 알아보겠습니다.

0개의 댓글