클래스에서의 필수적인 초기화 과정이 헷갈렸던 적이 많았는데
강의를 통해 객체를 만들기 위한 여러 가지 초기화 방법에 대해 학습했다.
☑️ 초기화와 생성자
- 초기화는 클래스, 구조체, 또는 열거형의 인스턴스를 생성하고 속성을 초기화하여 사용할 수 있도록 하는 과정을 의미한다.
- Swift에서 초기화는 객체가 메모리에 할당되고 속성이 적절히 설정되어 안정적으로 사용될 수 있도록 하는 중요한 단계이다.
- 인스턴스란?
- 객체 지향 프로그래밍에서, 인스턴스(Instance)는 클래스, 구조체 또는 열거형과 같은 타입의 실제 예시를 나타낸다.
(ex_틀로 찍어낸 무언가) - 클래스나 구조체 등의 템플릿(틀)을 기반으로 생성된 실제 데이터를 가리킨다.
- 즉, 클래스나 구조체를 기반으로 만들어진 객체를 인스턴스라고 한다.
- 객체 지향 프로그래밍에서, 인스턴스(Instance)는 클래스, 구조체 또는 열거형과 같은 타입의 실제 예시를 나타낸다.
- 인스턴스란?
// Person 클래스 정의
class Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
func greet() {
print("Hello, my name is \(name) and I'm \(age) years old.")
}
}
// Person 클래스의 인스턴스 생성
let john = Person(name: "John", age: 30)
let emily = Person(name: "Emily", age: 25)
// 생성된 인스턴스 사용
john.greet() // 출력: Hello, my name is John and I'm 30 years old.
emily.greet() // 출력: Hello, my name is Emily and I'm 25 years old.
☑️ 초기화 방법
1. 기본 초기화(Default Initialization):
- Swift에서는 클래스의 속성이 기본 값으로 초기화되는 것을 지원
- 이는 클래스의 모든 속성이 기본 값을 가지고 있을 때 자동으로 발생
class Person {
var name: String = ""
var age: Int = 0
}
let person = Person() // 기본 초기화
2. 지정 초기화(Designated Initialization):
- init 키워드를 사용하여 클래스의 모든 속성을 초기화하는 메서드
- 속성의 타입만 지정, 값을 init에서 넣어주어야 함!
class Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
let person = Person(name: "John", age: 30) // 지정 초기화
3. 편의 초기화(Convenience Initialization):
- 기본 초기화 또는 지정 초기화를 간편하게 호출하는 보조 메서드
class Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
convenience init(name: String) {
self.init(name: name, age: 0)
// age에 항상 0을 넣고 싶을 때
}
}
let person = Person(name: "Alice") // 편의 초기화 사용
4. 강제 해제(Force Unwrapping)되지 않는 옵셔널 초기화:
- 옵셔널 타입을 가진 속성은 선언과 동시에 초기화되거나 나중에 값을 할당 가능
- 자동으로 nil이 할당되어 있는 상태이다.
class Person {
var name: String?
var age: Int = 0
}
let person = Person()
person.name = "Emily"
person.age = 25
☑️ 실패 가능 생성자
- 기존 생성자는 컴파일 시점에 모든 프로퍼티가 초기화 되어야 하기 때문에 초기화 실패의 경우, 컴파일 에러가 발생
- 하지만 실패 가능 생성자(Failable Initializer)는 초기화에 실패하더라도 에러가 발생하지 않고 nil을 리턴한다.
- 즉, Optional한 생성자로 보면 된다.
1. class의 실패 가능 생성자
// class의 실패 가능 생성자
class UserProfile {
let username: String
// 실패 가능 생성자: 유효하지 않은 이름을 사용할 경우 초기화 실패
init?(username: String) {
// 유효한 사용자 이름인지 확인
guard username.count >= 5 else {
return nil // 입력된 사용자 이름이 유효하지 않을 경우 초기화 실패
}
self.username = username
}
}
// 실패 가능 생성자를 사용하여 인스턴스 생성
if let validProfile = UserProfile(username: "user123") {
print("Valid username: \(validProfile.username)")
} else {
print("Invalid username. Username should be at least 5 characters long.")
}
if let invalidProfile = UserProfile(username: "user") { // nil이 되고 바인딩 실패 -> else문 실행
print("Valid username: \(invalidProfile.username)")
} else {
print("Invalid username. Username should be at least 5 characters long.")
}
2. struct의 실패 가능 생성자
// struct의 실패 가능 생성자
struct Animal {
let name: String
init?(name: String) {
if name.isEmpty {
return nil // 생성자 내에서 실패 가능 부분에 nil을 리턴하면 됨
}
self.name = name
}
}
let animal1 = Animal(name: "choco") //인스턴스 생성. 타입은 Animal? 이다
let animal2 = Animal(name: "") // 문자열이기에 유효한 타입이지만 nil이 리턴된다
- Optional 타입 이유? nil이 나올 수 있기 때문에!
- 빈문자열이기 때문에 return nil
3. enum의 실패 가능 생성자
// enum의 실패 가능 생성자
enum HeightUnit {
case feet
case centiMeter
init?(symbol: String) {
switch symbol {
case "f":
self = HeightUnit.feet
case "cm":
self = HeightUnit.centiMeter
default:
return nil
}
}
}
let feet: HeightUnit = HeightUnit.feet // HeightUnit 타입
let centi: HeightUnit? = HeightUnit(symbol: "cm")
let feet2: HeightUnit? = HeightUnit(symbol: "F") // nil
- feet : case feet을 직접적으로 넣어줌
- centi : 초기화 시 symbol을 넣어주기 → Optional 타입 이유? nil이 나올 수 있기 때문에!
- feet2: return nil
💬 느낀 점
- 문법 공부는 다시 할 수록 더 잘 보이고 많이 보이는 것 같다!
- 그래서 n회독째인 지금 하는 문법 공부가 더 재밌다. (전보다 속 시원하게 공부되고 알게되는 느낌)
'Devlog👩🏻💻 > Swift' 카테고리의 다른 글
[Swift] Optional (3) | 2024.03.08 |
---|---|
[Swift] 컬렉션 타입(Collection Type) - Dictionary, Set (2) | 2024.01.24 |
[Swift] 컬렉션 타입(Collection Type) - Array (3) | 2024.01.23 |
[Swift] String 문자열에서 Index 접근하기(String.Index) (2) | 2024.01.18 |
[Swift] 타입 추론(Type Inference)과 타입 어노테이션(Type Annotation) (2) | 2024.01.17 |