
1. 옵셔널타입
- 옵셔널은 안전성을 높이기 위해 사용되는 타입이다. 즉 nil을 사용할 수 있는 타입과 사용할 수 없는 타입으로 구분하고, 사용할 수 있는 타입을 가리켜 옵셔널 타입이라고 부른다.
- 다른 언어의 'null'과 같은 의미라고 생각해 찾아봤는데, 'null'은 pointer값의 부재이며 'nil'은 특정 타입의 값이 부재로 서로 다른 의미이다.
- 옵셔널타입은 반환하고자 하는 값은 옵셔널 객체로 다시 한번 감싼 형태이며, 이 값은 옵셔널언래핑을 통해 실제 값을 추출해 사용할 수 있다.
2. 옵셔널타입 선언
- 일반 자료형을 옵셔널 자료형으로 바꾸는 방법은 자료형 뒤에 물음표를 붙이면 된다.
var optInt: Int?
optInt = 30;
var optStr: String?
optStr = "Swift";
var optArr: [String]?
optArr = ["C", "Java", "SmallTalk"];
var optDic: Dictionary<String, String>?
optDic = ["Korea": "Seoul", "Japan": "Tokyo", "China": "Beijing"];
3. 옵셔널 값 처리
- 앞 서 말했듯이 옵셔널 타입의 결과 값은 그 자체로 아무것도 할 수 없기에 명시적 해제와 묵시적 해제를 통해 옵셔널 언래핑을 해줘야 한다.
- 명시적 해제는 '강제적 해제'와 '비강제적 해제'로 나누어 지고, 묵시적 해제는 '컴파일러에 의한 자동 해제'와 '연산자를 사용한 자동해제'로 나누어 진다.
4. 옵셔널 강제 해제
- 옵셔널을 강제 해제하는 방법은 옵셔널 타입의 값 뒤에 '!'만 붙여주면 된다. 이 '!'를 강제 해제 연산자라고 한다.
- 옵셔널 강제 해제 시, nil 값이면 해제가 되지 않는다.
print("옵셔널 강제해제 : \(optInt!)");
print("옵셔널 해제안함 : \(optInt)");
var intFromStr = Int(optStr);
guard intFromStr != nil else {
print("값 변환에 실패");
}
5. 옵셔널 바인딩(비강제적 해제)
- 함수나 조건문을 통해 옵셔널 언래핑을 해준다.
func intToStr(str: String) {
guard intFromStr = Int(str) else {
print("값 변환에 실패");
return;
}
print("변환된 값은 \(intFromStr));
}
6. 컴파일러에 의한 옵셔널 자동 해제
- 비교 연산자를 사용하는 경우, 한쪽 타입이 옵셔널, 다른 한쪽이 일반 타입이라면 자동으로 옵셔널을 해제한다.
if (optInt == 30) {
print("optInt == 30");
} else {
print("optInt != 30");
}
7. 옵셔널의 묵시적 해제
- 묵시적 해제 구문은 '?' 연산자 대신 '!' 연산자만 붙여주면 된다.
- 변수의 값이 nil이 될 가능성이 있다면 묵시적 옵셔널 해제를 사용하면 안된다.
- 묵시적 옵셔널이 유용하게 사용되는 경우는 클래스 또는 구조체에서 사용된다.
var optInt: Int!
optInt = 30;
var optStr: String!
optStr = "Swift";
var optArr: [String]!
optArr = ["C", "Java", "SmallTalk"];
var optDic: Dictionary<String, String>!
optDic = ["Korea": "Seoul", "Japan": "Tokyo", "China": "Beijing"];