문법

[iOS]2025.04.04 문법(옵셔널)

ioskkt 2025. 4. 4. 16:32

옵셔널

  • Swift는 기본적으로 nil(값없음)을 허용하지 않지만 개발을 하다보면 값이 없는 경우가 생김.
  • 이것을 방지하기 위해 사용할 수 있는 것이 Optional.
  • Optional을 사용하면 값이 없는 상황을 개발할 수 있음.

 

struct Person {
    var name: String
    var age: Int
    var car: String? // ? 를 붙여서 옵셔널 타입이라고 명시(값이 없을 수도 있다!)
    
    func introduce() {
        print("내 이름은 \(name)이고 나이는 \(age)살임.")
    }
}

 

  • 기존 타입 뒤에 ? 키워드를 사용하여 옵셔널 타입으로 선언할 수 있음.
  • 기본타입(Int, String, Float ... )
  • Collection Type (Array, Dictionary, Set ... )
  • Custom Type (struct, enum, class)
  • 익명함수인 클로저

 

  • 값을 할당할 때는 기존의 타입과 동일한 방식으로 사용하면 됨.
  • 옵셔널 타입의 값에 접근하면 Optional로 감싸진 값이 나옴.(Optional로 래핑된 값이라고 부름)

 

옵셔널 타입으로 선언하기

// 기본 타입
var intValue: Int?
var stringValue: String?

//Collection Type
var array: [String]?
var dictionary: [String:String]?

//Custom Type
struct Person {
    let name: String
}
var optionalPerson: Person?

//클로저
var closure: (() -> Void)?

 

옵셔널 타입을 사용하는 방법(할당과 접근)

//값을 할당할 때는 기존의 타입과 동일하게 사용하면 됨.
var intValue: Int? = 1

var stringValue: String?
stringValue = "HI!"

var nilValue: String? = nil

struct Person {
    let name: String
}
var optionalPerson: Person? = Person(name: "Aiden")

var closure: (() -> Void)? = {
    print("fire")
}

print("하이, \(intValue)") // 하이, Optional(1)
print(stringValue) // Optional("HI!")
print(nilValue) // nil

 

  • Optional 타입과 기본타입은 다른 타입이기 때문에 연산이 불가능.
  • 옵셔널 값에서 값만 추출하는 언래핑 작업을 통해 기본타입으로 변환하여 사용해야함.
  • 단, 비교 연산자는 사용 가능.
var intValue: Int? = 1
var intValue2: Int = 2

if intValue == intValue2 {
    print("같음")
} else {
    print("다름")
}

 

옵셔널 체이닝(Optional Chaining)

  • 옵셔널 체이닝은 옵셔널 타입을 포함하는 복잡한 데이터 구조에서 옵셔널 값이 nil인지를 간결하게 체크하고 접근할 수 있는 방법.
struct Person {
    var name: String = "default name"
    var animal: Animal?
}

struct Animal {
    let name: String
    var age: Int?
}

let person: Person? = Person(name: "Aiden", animal: nil)
print(person?.animal?.name) // nil
let person2 = Person(name: "Aiden", animal: Animal(name: "Dog", age: 5))
print(person2.animal?.age) // Optional(5)
// person2 는 Person타입이며, animal 프로퍼티는 Animal? 타입. 그러므로 옵셔널 래핑되어 출력.

let stringValue: String? = "안녕하세요"
print(stringValue?.count) // Optional(5)

 

  • 중첩된 값 중 하나라도 nil이면 전체값을 nil로 반환함.
  • 중첩된 값이 모두 nil이 아니면 Optional로 래핑된 값을 반환함.

'문법' 카테고리의 다른 글

[iOS] 2025.04.04 문법(옵셔널 언래핑)  (0) 2025.04.04
[iOS] 2025.03.21 문법(메소드)  (0) 2025.03.24
[iOS] 2025.03.18 문법(프로퍼티)  (0) 2025.03.18
[iOS] 2025.03.18 문법(struct)  (0) 2025.03.18
[iOS] 2025.03.18 문법(class, init)  (0) 2025.03.18