글
7. Swift 옵셔널 (Optional)
Swfit
2017. 8. 4. 11:47
7. Swift 옵셔널 (Optional)
- 옵셔널은 스위프트에서 도입된 새로운 개념 이다.
- 값을 처리하는 과정에서 오류가 발생할 가능성이 있는 값을 옵셔널 타입이라는 객체로 감싼 후 반환하는 개념. -> 옵셔널 래핑(optional wrapping) 이라고도 한다.
let num = Int(“1234”)
// Int 형으로 정상적으로 변환
// num 의 값은 Int 형 1234
###################
let num = Int(“abcd”)
// Int 형으로 변환 하려는 값이 “abcd” 문자열 이므로 변환 이 안됀다.
// num 의 값은 nil 이다.
*******************************
*일반 자료형은 nil 값을 가질 수 없다.*
*******************************
- 옵셔널 타입
var optInt : Int?
// 옵셔널 Int 타입
var optStr : String?
// 옵셔널 String 타입
var optDouble : Double?
// 옵셔널 Double 타입
var optArr : [String]?
// 옵셔널 Array 타입
var opDic : Dictionary<String, String>?
var opDic2 : [String:String]?
// 옵셔널 딕셔너리 타입
var optClass : AnyObject?
// 옵셔널 클래스 타입
- 옵셔널 강제 해제
var optInt : Int? = 3
print(“옵셔널 자체의 값 : \(optInt)”)
print(“!로 강제 해제한 값 : \(optInt!)”)
// 결과 값
옵셔널 자체의 값 : Optinal(3)
!로 강제해제한 값 : 3
###################
Int(“123”) + Int(“123”)
// 연산 불가능
Int(“123”)! + Int(“123”)!
// 연산 가능
// 출력값 = 246
Int(“123”)! + 27
// 연산 가능
// 출력값 = 150
- 옵셔널 바인딩
- 옵셔널 바인딩은 조건문 내에서 일반 상수에 옵셔널 값을 대입하는 방식으로 이루어진다.
- 반드시 조건문에서 사용해야만 하며, 상수에 옵셔널 값을 대입한 결과는 true/false 로 리턴 된다.
//조건문 내에서의 옵셔널 바인딩 처리
var str = “Swift"
if let intFromStr = Int(str) {
print(“값이 변환 되었습니다. 변환된 값은 \(intFromStr) 입니다.”)
}else{
print(“값 변환에 실패하였습니다”)
}
// 출력 : 값 변환에 실패하였습니다.
###################
// 가드문에서 변환된 값이 문자열 이면 값 변환 실패 , 인트형 이면 넘어감
func intStr(str:String) {
guard let intFromstr = Int(str) else {
print(“값 변환에 실패하였습니다.”)
return
}
print(“값이 변환 되었습니다. 변환된 값은 \(intFromStr) 입니다.”)
}
- 옵셔널 딕셔너리 선언
var capital = [“KR” : “Seoul”]
print(capital[“KR”])
print(capital[“KR”]!)
// 출력
Optional(“Seoul”)
Seoul
**********************************************************
* 옵셔널 타입에서 ! 연산자를 사용할 때는 반드시 nil 점검을 해주어야 한다.*
**********************************************************
- 컴파일러에 대한 옵셔널 자동 해제
*******************************
옵셔널 타입의 값을 사용하려면 항상 ! 연산자를 사용하여 옵셔널을 강제해제 하든가, 아니면 옵셔널 바인딩을 통해 일반 자료형으로 바꾸어 주어야 한다. 이렇게 해야 옵셔널 객체로 감싸진 값을 꺼낼수 있다, 하지만 명시적으로 강제 해제를 하지 않아도 컴파일러에서 자동으로 옵셔널을 해제하여 처리하는 경우가 있다.
*******************************
// 강제 해제 옵셔널 타입
let optInt = Int(“123”)
if ((optInt!) == 123) {
print(“opting == 123”)
} else {
print(“optInt != 123”)
}
// 강제 해제 하지 않은 옵셔널 타입
let optInt = Int(“123”)
if (optInt) == 123 {
print(“opting == 123”)
} else {
print(“optInt != 123”)
}
// 결과값 모두 : opting == 123
###################
let tempInt = Int(“123”)
tempInt == 123 // true
tempInt == Optional(123) // true
tempInt! == 123 // true
tempInt! == Optional(123) // true
- 옵셔널의 묵시적 해제
*******************************
옵셔널 타입을 해제하는 방법 중에는 묵시적 해제 라는 개념이 존재한다.
이것은 옵셔널이지만 값을 사용하려고 할 때에는 자동으로 옵셔널이 해제된 값을 제공하기 때문에 굳이 ! 연산자를 사용하여 해제할 필요가 없는 아주 편리한 구문이다.
컴파일러가 알아서 옵셔널을 해제해 준다는 점에서 자동 해제와 유사 하지만 , 컴파일러에 의한 자동 해제가 비교 연산이나 값의 할당 등 일부 구문에 한정되는 것과 달리 묵시적 해제는 옵셔널 변수를 사용하는 모든 경우에 적용할 수 있으며, 옵셔널 변수의 타입을 선언할 때 묵시적 해제를 미리 선언해 주어야 한다는 차이점이 있다.
옵셔널의 묵시적 해제 구문은 일반 옵셔널 타입의 변수 선언 구문과 매우 유사 하다 ? 연산자 대신 ! 연산자만 붙여준다.
*******************************
//명시적 옵셔널 선언
var str : String? = “Swift Optional”
print(str)
// 출력
Optional(“Swift Optional”)
###################
//묵시적 옵셔널 선언
var str : String! = “Swift Optional”
print(str)
// 출력
Swift Optional
###################
var value01 : Int? = 10
value01 + 5 // 오류
var value01 : Int! = 10
value01 + 5 // 15
'Swfit' 카테고리의 다른 글
9. Swift 매개변수 (1) | 2017.08.04 |
---|---|
8. Swift 함수(Function) (0) | 2017.08.04 |
6. Swift 튜플 (Tuple) (0) | 2017.08.04 |
5. Swift 집합 (Sets) (0) | 2017.08.04 |
4. Swift 배열 (Array) (0) | 2017.08.04 |