처음 보는 개념이 등장했다. 스위프트는 안정성이 장점이라는데, 이 옵셔널이 그 안정성에 기여하는 것으로 추정된다!

 

옵셔널

값이 있을 수도 있고, 없을 수도 있다!

var number: Int?

이렇게 선언하면 number라는 변수는 옵셔널 변수가 된다. 값이 있을 수도 있고 없을 수도 있는 것이다!

옵셔널 변수를 활용한 예시를 하나 더 보자. 

var name: String?

var optionalName: String? = "Gunter"

var repuiredName: String = optionalName //이건 오류가 뜬다!

optionalName 변수에 "Gunter"가 들어가고 그 밑에서 requiredName에 대입이 될 것 같이 보인다.

하지만 이렇게 하면 오류가 뜬다!

왜냐?

 

아직 컴파일이 되지 않아서 optionalName에는 "Gunter" 값이 들어가지 않았다. 컴파일러 입장에서는 optionalName에 값이 있는지 없는지, 무슨 값이 있는지 모르기 때문에 안전상의 이유로 프로그램을 중단시킨다. 그래서 에러가 뜨는 것이다.

에러 내용은 다음과 같다. optional string값에 포장지를 벗겨 string 타입을 만들려는 에러라고 한다. 

무슨 소리냐!

 

optionalName을 print해보면, "Optional("Gunter")라고 나온다. 저 Optional이 포장지인 셈인데, 이것을 벗기고 어떻게 가공하는 것을  옵셔널 바인딩이라고 한다. 

 

옵셔널 바인딩

명시적 해제: 강제 해제, 비강제 해제(옵셔널 바인딩)

묵시적 해제: 컴파일러에 의한 자동 해제, 옵셔널의 묵시적 해제

 

명시적 해제

// 명시적 해제-> 강제 해제: 느낌표(!)를 사용한다.
var number: Int? = 3
print(number) //출력: Optional(3)
print(number!) //출력: 3

이는 조금 위험하다. 만약 포장지를 벗겼는데 nil 값이 나온다면 에러가 나면서 종료된다.

 

// 명시적 해제 -> 비강제 해제 방법1: if문을 사용한다!
if let result = number {
	print(result)
} else {
}
//출력: 3


// 명시적 해제 -> 비강제 해제 방법2: guard문을 사용한다!
func test() {
	let number: Int? = 5
    guard let result = number else { return }
    print(result)
}

test() //출력: 5

if문을 사용해서 옵셔널 바인딩을 하는 것보다, guard를 사용하는 것이 더 좋다. 왜냐하면 if문을 사용하면 바인딩 된 값을 if 블록 안에서밖에 쓰지 못하지만, guard문을 사용하면 그 다음의 함수 전체 구문에서도 사용할 수 있기 때문이다. 

* guard문은 조건식이 true일 경우 그대로 진행하지만, false일 경우엔 else구문을 실행한 뒤 종료시켜버리는 구문이다. 

 

묵시적 해제

옵셔널값을 비교연산자를 통해 다른 연산자와 비교하면, 컴파일러가 자동으로 옵셔널 바인딩을 해준다!

// 묵시적 해제 -> 컴파일러에 의한 자동해제
let value: Int? = 6
if value == 6 {
	print("value가 6입니다.")
} else {
	print("value가 6이 아닙니다.")
} 
//출력: value가 6입니다.

 또한 값을 사용할 때는 자동으로 해제된다!

let string = "12"
var stringToInt: Int? = Int(string)

 

Int(string)은 string 변수 안에 들어있는 값이 숫자일 경우 정수로 변환해주지만 숫자가 아니라면 nil값을 반환하는 함수이다.

따라서 stringToInt은 nil값을 담을 수 있는 optionalInt(옵셔널 인트)형으로 선언되어야 한다. 그래서 저 ?가 있는 것이다.

 

그러나, 이를 이용하여 옵셔널 바인딩을 해줄 수 있다.

// 묵시적 해제: 묵시적 옵셔널 해제
let string = "12"
// 물음표(?)를 느낌표(!)로 바꾸어주었다.
var stringToInt: Int! = Int(string)

// 그리고 값을 사용하면!
print(stringToInt + 1)

//출력: 13

바인딩이 된 것이다. 

 

 

오늘은 옵셔널의 뜻과 옵셔널 값을 사용하기 위한 옵셔널 바인딩 과정에 대해 배웠다!

+ Recent posts