swift 기초 문법(5) - 옵셔널, 옵셔널 바인딩
1. 옵셔널
swift에서는 objective-c와 다르게 옵셔널이라는 개념이 존재합니다.
말 그대로 Option. 즉, 값이 있을 수도 있고 없을 수도 있다는 개념입니다.
매개변수를 선언할 때 변수 타입 뒤에 "?"를 붙이면 해당 매개변수는 옵셔널 변수로 선언됩니다.
var userName: String = "Amy"
var userName: String? = nil // 옵셔널 변수
var number: Int = 1
var number: Int? = nil // 옵셔널 변수
옵셔널 변수에 초기값을 지정하지 않으면 기본값은 nil이 됩니다.
일반적인 프로그래밍 언어에서는 값이 Null인 변수에 접근하게 되면 Runtime error가 발생해 프로그램이 강제 종료됩니다. 하지만 swift는 안정성이 높은 언어로 값이 없는 변수에 접근해도 프로그램이 강제 종료되지 않습니다.
옵셔널 변수를 실제 사용해서 콘솔에 print 해보면 아래 이미지처럼 표시됩니다.
여기서 만약에 콘솔창에 보이는 Optional("")이라는 문구를 제거하고 싶다면 옵셔널 바인딩을 하면 된다.
2. 옵셔널 바인딩
옵셔널 바인딩이란 쉽게 말해 옵셔널로 포장되어있는 매개 변수에 옵셔널 포장지를 제거하는 방법이라고 생각하면 됩니다.
옵셔널 해제는 2가지로 나뉩니다.
1. 명시적 해제 > 강제 해제, 비강제 해제(옵셔널 바인딩)
2. 묵시적 해제 > 컴파일러에 의한 자동 해제, 옵셔널의 묵시적 해제
2.1 명시적 해제 - 강제 해제
옵셔널 변수를 강제로 해제하는 방법은 해당 변수 뒤에 느낌표(!)를 붙여주면 됩니다.
위 예제의 이미지처럼 옵셔널로 선언된 변수 뒤에 느낌표(!)를 붙여주면 강제로 옵셔널이 해제됩니다.
하지만 이러한 방법은 프로그램상 위험할 수 있습니다. 만약 값이 nil인 경우 강제로 해제하게 된다면 에러가 발생해 프로그램이 강제로 종료될 수 있습니다. 그렇기 때문에 느낌표를 붙여 강제로 해제하는 방법은 해당 변수가 절대 nil값이 될 수 없다는 확신이 있는 경우에만 사용하시는 것을 권장합니다.
2.2 명시적 해제 - 비강제 해제(옵셔널 바인딩)
비강 제로 해제하는 방법에는 지난 포스팅에 작성했던 If문과 guard문을 활용한 방법이 있습니다.
먼저 if문을 활용하여 옵셔널 바인딩하는 방법을 알아보겠습니다.
var name: String? = "Amy"
if let result = name {
print(result)
}
옵셔널 변수인 name을 if문 안에 조건문에 두어 만약 name이 nil이 아닌 경우 result 상수에 담에 if문 안의 구문을 실행하도록 하였습니다. 실제 위 코드를 실행해 본다면 콘솔에 "Amy"만 출력되는 것을 확인할 수 있습니다.
guard문을 활용해 옵셔널 바인딩하는 방법을 알아보겠습니다.
var name: String? = "Amy"
guard let result = name else { return }
print(result)
위에 if문과 비슷하게 name 옵셔널 변수 안에 값이 있는 경우 result 상수 값에 저장하여 다음 코드인 print문을 실행하는 방법입니다.
guard문과 if문은 어찌 보면 비슷하지만 명확한 차이점이 있습니다.
if문으로 옵셔널 바인딩을 하게 되면 추출된 상수를 if문 안에서만 사용할 수 있는 반면에 guard문으로 옵셔널을 추출하면 guard문 다음 코드 전체 부분에서 사용할 수 있습니다. guard문은 조건이 true인 경우에만 guard문을 통과하고 false인 경우 else문을 통과한 뒤 흐름을 종료시킵니다.
2.3 묵시적 해제 - 컴파일러에 의한 자동 해제
비교연산자를 통해 옵셔널 값을 비교하면 컴파일러가 자동으로 옵셔널 값을 해지시켜줍니다. 이것을 묵시적 해제, 컴파일러에 의한 자동 해제라고 합니다.
아래 예시의 상황입니다.
2.4 묵시적 해제 - 옵셔널의 묵시적 해제
옵셔널 타입이지만 값을 사용할 때는 자동으로 옵셔널 타입이 해제가 되는 경우를 옵셔널의 묵시적 해제라고 합니다.
let string = "10"
// 묵시적 옵셔널 해제
var stringToInt: Int! = Int(string) // Int?를 Int!로 바꿔준다.
print(stringToInt + 1)
이상으로 옵셔널과 옵셔널 바인딩을 알아보았습니다.
※잘못된 내용이 있다면 댓글로 알려주세요.