옵셔널 (Optional)

옵셔널

값이 없는 경우에 옵셔널_을 사용합니다. 옵셔널은 2가지 가능성이 있습니다. 값이 있고 옵셔널을 풀어서 값에 접근하거나 값이 없을 수도 있습니다.

다음의 예는 옵셔널을 사용하여 값이 없는 상황에 대처하는 방법을 나타냅니다.

Swift의 Int 타입은 String 값을 Int 값으로 변환하는 초기화가 존재합니다.
그러나 모든 문자열을 정수로 변환할 수 없습니다.

  • 문자열 "123" 은 숫자값 123 으로 변환 (⭕️)
  • 문자열 "hello, world" 는 변환할 숫자값 (❌)

아래 예제는 String 을 Int 로 초기화하는 것을 보여줍니다:

let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
// convertedNumber is inferred to be of type "Int?", or "optional Int"

초기화가 실패할 수 있으므로 Int 가 아닌 옵셔널 Int 를 반환합니다.

옵셔널 Int 는 Int 가 아닌 Int? 로 작성합니다.

물음표는 값의 포함여부가 옵셔널이라는 것을 나타내고 옵셔널이란 어떠한 Int 값이 있거나 값이 없을 수 있다는 의미입니다.

(여기서는 Bool 값 또는 String 값을 포함할 수 없고 Int 이거나 아무런 값이 없을 수 있습니다).

nil

옵셔널 변수에 특수한 값 nil 로 지정하여 값이 없는 상태를 나타낼 수 있습니다.

var serverResponseCode: Int? = 404
// serverResponseCode contains an actual Int value of 404
serverResponseCode = nil
// serverResponseCode now contains no value

기본값이 없이 옵셔널 변수를 정의하면 이 변수는 자동적으로 nil 로 설정됩니다.

var surveyAnswer: String?
// surveyAnswer is automatically set to nil

if 구문과 강제로 풀기

if 구문은 옵셔널과 nil 을 비교하여 옵셔널에 값이 포함되어 있는지 확인할 수 있습니다. "같음" 연산자 (==) 또는 "같지 않음" 연산자 (!=)로 비교를 수행할 수 있습니다.
옵셔널에 값이 있다면 nil 과 "같지 않음"으로 간주됩니다.

if convertedNumber != nil {
    print("convertedNumber contains some integer value.")
}
// Prints "convertedNumber contains some integer value."

옵셔널에 값이 포함되어 있다고 확신하면 옵셔널 이름 끝에 느낌표 (!)를 추가하여 값에 접근할 수 있습니다.

여기서 느낌표란 "이 옵셔널은 확실히 값을 가지고 있습니다. 사용해도 괜찮습니다."라는 의미입니다.

이것을 옵셔널의 값에 대한 강제로 풀기 (forced unwrapping) 라 합니다.

if convertedNumber != nil {
    print("convertedNumber has an integer value of \(convertedNumber!).")
}
// Prints "convertedNumber has an integer value of 123."

옵셔널 바인딩

옵셔널 바인딩 은 옵셔널이 값을 포함하고 있는지 확인하고 값이 있는 경우 해당 값을 임시 상수 또는 변수로 사용할 수 있게 해줍니다.

옵셔널 바인딩은 if 와 while 구문에서 옵셔널에 값이 있는지 체크하고 단일 동작의 일부로 상수 또는 변수로 추출할 수 있습니다.

옵셔널 바인딩은 옵셔널이 값을 포함하고 있는지 확인하고 값이 있는 경우 해당 값을 임시 상수 또는 변수로 사용할 수 있게 해줍니다.

옵셔널 바인딩은 if 와 while 구문에서 옵셔널에 값이 있는지 체크하고 단일 동작의 일부로 상수 또는 변수로 추출할 수 있습니다.

if 와 while 구문은 제어 흐름 에서 자세히 다룹니다.
if 구문에서 옵셔널 바인딩은 아래와 같이 사용합니다.

강제로 풀기 보다 옵셔널 바인딩 을 사용하여 옵셔널 섹션에 있는 예제의 possibleNumber 를 다시 작성할 수 있습니다.

if let actualNumber = Int(possibleNumber) {
    print("The string \"\(possibleNumber)\" has an integer value of \(actualNumber)")
} else {
    print("The string \"\(possibleNumber)\" could not be converted to an integer")
}
// Prints "The string "123" has an integer value of 123"

좋은 웹페이지 즐겨찾기