[iOS_2주차] 옵셔널(Optional)

황석범·2024년 11월 1일
0

옵셔널(Optional)

  • Swift는 기본적으로 nil(값없음) 을 허용하지 않지만 개발을 하다보면 값이 없는 경우가 생기게 됩니다!

struct Person {
	var name: String
    var age: Int
    var car: String? // ?를 붙여서 옵셔널 타입이라고 명시하여 값이 없을 수도 있다고 알려줄 . 수있어요
    
    func introduce(){
    	print("안녕하세요. 제 이름은 \(name)이고, 나이는 \(age)살 입니다.")
    }
}

Swift는 기본적으로 nil 을 허용하지 않지만, Optional 을 사용하면 값이 없을 수 있는 상태를 안전하게 처리할 수 있습니다.

  • nil 키워드는 값이 없음 을 의미합니다.
  • 값이 없을 수 있는 상태를 옵셔널 이라고 하며, 옵셔널 타입은 nil 값을 저장할 수 있습니다.
  • 기존 타입 뒤에 ? 키워드를 사용하여 옵셔널 타입 으로 선언할 수 있습니다.
    • 기본 타입(Int, String, Float ...)
    • Collection Type (Array, Dictionary, Set ...)
    • Custom Type(struct , class , enum )
    • 익명함수인 클로저
  • 값을 할당할 때는 기존의 타입과 동일하게 사용하면 됩니다.
  • 옵셔널 타입의 값에 접근하면 Optional 로 감싸진 값이 나옵니다.
    Optional로 래핑된 값 이라고 부릅니다.

var intvalue: Int?

var intvalue: Int? = 1

// 값에 접근하면 Optional로 래핑된 값으로 나옵니다.
print(intValue) // Optional(1) : 옵셔널로 래핑된 값이 1이 출력됩니다.

Optional 값 기분 타입과 연산이 불가능합니다.

  • 옵셔널 타입기본 타입 은 다른 타입이기 때문에 연산이 불가능합니다.
  • 비교 연산자 사용 가능합니다.

var intValue: Int? = 5

intValue += 5 // Error 발생
			 // Value of optional type 'Int' must be unwrapped to a value of type
             // Int? 타입은 Int 타입과 다르기 때문에 컴파일 오류 발생!
             
  • 옵셔널과 기본 타입의 차이로 인해 연산이 불가능 합니다.
  • 옵셔널 값에서 값만 추출하는 언래핑 작업을 통해 기본 타입으로 변환하여 사용해야 합니다.

옵셔널 체이닝(Optional Chaining)

옵셔널 체이닝은 옵셔널 타입을 포함하는 복잡한 데이터 구조에서 옵셔널 값이 nil 인지를 간결하게 체크하고 접근할 수 있는 방법입니다.

  • 여러 중첩된 프로퍼티나 메소드 호출을 한줄로 처리할 수 있으며, 중간에 nil 이 있는 경우 자동으로 nil 을 반환합니다.
  • 옵셔널체이닝은 옵셔널 값에 대해 접근할 대마다 안전하게 처리할 수 있습니다.
  • 옵셔널 값에 접근할 때 프로퍼티나 메소드 이름 뒤에 ? 를 붙여서 체이닝할 수 있습니다.

struct Dog {
	var toy: String?
}

struct Person{
	var pet: Dog?
}

let person1: Person? = nil // nil
let person2: Person? = Person(pet: nil) // nil
let person3: Person? = Person(pet: Dog(toy: nil)) // nil
let person4: Person? = Person(pet: Dog(toy: "ping")) // Optional("ping")

var optionalClosuer: ((Int) -> Void)? = { value in
	print(value)
}

optionalClosure?(3) // optional(3)
  • 옵셔널 값에 ? 를 붙인 후 . 을 사용하면 중첩된 프로퍼티나 메소드에 접근할 수 있습니다.
  • 중첩된 값 중 하나라도 nil 이면 전체 값을 nil 을 반환합니다.
  • 중첩된 값이 모두 nil 이 아니라면 Optional 로 래핑된 값을 반환합니다.

옵셔널 언래핑(Optional Unwrapping)

  1. if let 을 사용한 옵셔널 바인딩
  2. guard let 을 사용한 옵셔널 바인딩
  3. 옵셔널 묵시적 언래핑

옵셔널 타입은 값이 없을 수도 있는 경우를 안전하게 처리하기 위해 사용되지만, 값에 접근하면 optional(값) 으로 래핑되어 있어서 바로 사용하지 못하는 불편함이 있습니다. 따라서 이 옵셔널로 래핑된 값에서 옵셔널을 제거하고 값으로 변환하는 과정을 옵셔널 언래핑 이라고 부르며, 몇가지 방법으로 이를 수행할 수 있습니다.

  • 옵셔널 바인딩
  • 기본값 제공
  • 강제 언래핑
  • 옵셔널 묵시적 언래핑

옵셔널 바인딩(Optional Binding)

  • 조건문 if , guard 구문을 사용하여 안전 하게 옵셔널을 언래핑하는 방법입니다.
  • if let
    • if let 을 사용하여 옵셔널 바인딩을 할 수 있습니다..
    • 값이 있다면 if let 코드블록이 실행되고, 이 블록 안에서 언래핑 된 값을 사용할 수 있습니다.
    • 값이 없을 때 작업을 하고 싶다면 else 코드블록을 작성하면 됩니다.

var inValue: Int? = 10

if let intValue = inValue {
	print(intValue)    // 출력 값 : 10
    				// Optional 언래핑되어 실제 값이 출력됩니다.
                    // 옵셔널 언래핑된값은 해당 블록에서만 사용 가능합니다.
                    
} // Optional(10)
  • guard let
    • guard let 구문은 옵셔널 바인딩 결과가 nil일 경우,
      해당 코드 블록을 빠져나가게 하여 이후 코드가 실행되지 않도록 합니다.
    • 클로저나 메소드 내부에서 주로 사용됩니다.
    • 코드의 가독성을 높이고, 중첩된 조건문을 피할 수 있습니다.
   
func guardLetFunction() {
	var optionalValue: String? // 아무런 값을 주지않아서 nil인 상태
    guard let optionalValue = optionalValue else {
    	print("guard 실행") // optionalValue가 nil이면 해당
        return // 함수를 실행하여 아래로 못내려가게
    }
    
    print(optionalValue) // 위의 guard let에서 함수가 종료되어 실행되지 못함
    
    
 guardLetFunction()
 
 // "guard 실행"
}

기본값 제공

  • Nil-결합 연산자(Nil-Coalescing Operator) 방법을 사용하는 방법입니다.

  • 옵셔널 값 뒤에 ?? 를 붙인 후 기본값을 제공할 수 있습니다.

  • 옵셔널 값이 nil 이면 ?? 뒤에있는 기본 값을 사용합니다.

    let name: String? = nil
    print(name ?? "Default Name") // 값이 nil이여서 ?? 뒤에 있는 "Default Name"이 출력됩니다.
    
    let greeting = "안녕하세요 \(name ?? "A")님!"
    print(greeting) // "안녕하세요 A님!" 이 호출됩니다.
    				// namedㅣ nil이여서 기본 값 "A"를 사용합니다.

옵셔널 강제 언래핑(force unwrapping)

  • 옵셔널 값에 !를 붙여서 사용합니다.
  • nil 이 아니라면 언래핑 되지만 nil이면 런타임 오류 를 발생시킵니다 !
  • nil 이 아님을 확신할 때 사용합니다.
    • 지양하는것이 좋습니다.
var name: String? = "Brody"
print(name!) // "Brody" 출력
name = nil
print(name!) // 런타임 오류 발생

옵셔널 묵시적 언래핑(Implicitly Unwrapped Optional)

  • 옵셔널 타입을 선언할 때 ? 가 아닌 ! 를 사용하면 묵시적 언래핑 되는 옵셔널로 정의할 수 있습니다.
  • 값을 사용할 때 자동으로 언래핑되어, 별도의 언래핑 작업 없이 직접 사용할 수 있습니다.
  • 값이 nil 일 때 접근하면 런타임 오류가 발생합니다.
  • 값이 있다고 확신이 들 때 사용해야 합니다.
  • 옵셔널 바인딩이 가능합니다.

var name: String! = "Brody" // 타입을 String!으로 설정하여 묵시적 옵셔널 언래핑을 사용

print(name) // Optional("Brody") : 값 자체는 옵셔널
print(name.count) // 5 : 값에서 가져온 값은 옵셔널값이 아닌 일반 값 출력

if let name = name {
	print(name) // "Brody" 출력
}

profile
iOS 공부중...

0개의 댓글

관련 채용 정보