안녕하세요! 피피아노입니다🎵
이번 포스팅에서는 저번 포스팅에 이어서 초기화(Initializer)에 대해서 정리를 해볼 건데 이번에는 구조체와 클래스의 초기화에 대해서 한 번 정리를 해보려고 합니다. 저번 포스팅이 궁금하신 분들은 여기를 참고해주세요!
그럼 바로 시작하겠습니다.
Swift에서 클래스와 구조체는 둘 다 인스턴스를 초기화하는 initializer를 가지고 있습니다. Initializer는 특별한 메소드로, 클래스나 구조체의 인스턴스가 생성될 때 호출됩니다. 이를 통해 모든 속성이 적절한 초기값으로 설정됩니다.
구조체의 Initializer
구조체는 기본적으로 Memberwise Initializers를 제공합니다. 이는 구조체가 자동으로 제공하는 생성자로, 파라미터를 통해서 모든 프로퍼티의 초기화를 제공합니다.
조금 더 쉽게 설명하자면, 구조체의 각 속성에 대해 인수를 받는 초기화를 자동으로 제공하는 기능인데, 이렇게 되면 개발자가 따로 초기화 메소드를 작성하지 않아도, 구조체의 모든 속성을 초기화할 수 있게 해줍니다.
예를 들어, 다음과 같은 구조체가 있다고 해봅시다.
struct Student {
var name: String
var age: Int
}
이 구조체를 이용하여 인스턴스를 생성할 때, Swift는 자동으로 각 속성에 대한 인수를 받는 초기화를 제공합니다.
즉, 다음과 같이 간단하게 인스턴스를 생성할 수 있게 됩니다.
let student = Student(name: "John", age: 16)
위 코드에서 Student(name: "John", age: 16) 부분이 바로 Memberwise Initializers를 사용한 것입니다. "John"과 16은 각각 name과 age 속성을 초기화하는 값입니다.
이 Memberwise Initializers를 통해, 각 속성에 원하는 초기값을 쉽고 빠르게 설정할 수 있습니다. Memberwise Initializers를 사용하면 코드의 간결성을 높이고, 개발 시간을 단축하는 데 도움이 됩니다.
Memberwise Initializers
Memberwise Initializers는Swift 언어의 특징 중 하나로, 구조체(struct)에 자동으로 제공되는 초기화 메소드입니다. 이 초기화 메소드는 구조체의 각 속성에 대해 인수를 받아, 각각의 속성을 초기화하는 역할을 합니다.
구조체를 선언할 때, 개발자가 별도의 초기화 메소드(init)를 작성하지 않더라도 Swift는 자동으로 Memberwise Initializers를 제공합니다. 이를 통해, 개발자는 각 속성에 대해 원하는 값을 인수로 전달하여 구조체의 인스턴스를 초기화할 수 있습니다.
클래스의 Initializer
클래스는 구조체와 달리 Memberwise Initializers를 제공하지 않습니다. 따라서 클래스의 모든 속성이 초기값을 가지고 있지 않다면, 사용자 정의 이니셜라이저를 제공해야 합니다. 예를 들어, 다음과 같은 클래스가 있다고 해봅시다.
class Point {
var x: Double
var y: Double
init(x: Double, y: Double) {
self.x = x
self.y = y
}
}
이 경우, 사용자 정의 이니셜라이저를 사용하여 인스턴스를 생성할 수 있습니다.
let origin = Point(x: 0.0, y: 0.0)
또한 클래스는 상속받을 경우 부모 클래스의 initializer를 상속받거나 override를 할 수 있습니다.
이와 관련하여 '지정 이니셜라이저(Designated Initializers)'와 '편의 이니셜라이저(Convenience Initializers)'라는 개념이 있습니다.
지정 이니셜라이저(Designated Initializers)
지정 이니셜라이저(Designated Initializers)는 클래스의 주요한 이니셜라이저로, 필요에 따라 부모 클래스의 이니셜라이저를 호출할 수 있으며, 이니셜라이저가 정의된 클래스의 모든 프로퍼티를 초기화해야 하는 역할을 갖고 있습니다.
지정 이니셜라이저는 클래스의 이니셜라이저 중 기둥과 같은 역할이므로 클래스에 하나 이상 정의해야 합니다. 즉, 다시 말해서 모든 클래스는 하나 이상의 지정 이니셜라이저를 갖습니다.
편의 이니셜라이저(Convenience Initializers)
편의 이니셜라이저(Convenience Initializers)는 초기화를 더 쉽게 할 수 있도록 하는 보조적인 역할을 하며, 자신의 클래스 내부의 다른 이니셜라이저를 호출합니다. 일반적으로 편의 이니셜라이저는 특정 상황에 맞는 초기값을 제공하는데 사용됩니다.
지정 이니셜라이저를 사용하면 인스턴스를 생성할 때마다 전달인자로 초깃값을 전달해야 하지만 편의 이니셜라이저를 사용하면 항상 같은 값으로 초기화가 가능합니다. 편의 이니셜라이저는 필수 요소는 아닙니다. 클래스 설계자의 의도대로 외부에서 사용하길 원하거나 인스턴스 생성 코드를 작성하는 귀찮음을 덜 때 유용하게 사용됩니다.
이 내용들에서 중요한 점은 클래스와 구조체가 초기화 과정에서 다르게 동작한다는 것입니다. 클래스는 참조 타입이고 구조체는 값 타입이기 때문에, 이 둘은 서로 다른 방식으로 메모리에 저장되고 관리됩니다. 따라서 이들의 초기화 방법도 서로 다른 것입니다!
감사합니다.
잘못된 내용이 있거나 더 좋은 내용 피드백은 언제나 환영합니다!
궁금하신 부분은 댓글로 질문 부탁드립니다!
'Apple > Swift' 카테고리의 다른 글
[Swift] 초기화(Initializers) 알아보기 (4) - 이니셜라이저의 상속 재정의와 자동 상속 (10) | 2024.02.13 |
---|---|
[Swift] 초기화(Initializers) 알아보기 (3) - 2단계 초기화 (0) | 2024.02.06 |
[Swift] 초기화(Initializers) 알아보기 (1) - 초기화의 개념과 사용 방법, 규칙 (0) | 2024.01.29 |
[Swift] Combine의 Operator 알아보기 (0) | 2024.01.28 |
[Swift] Combine 개념과 사용방법 이해하기 (0) | 2024.01.17 |