옵셔널 Optional
Int형 vs Optional Int 형
-
10
- Int → int형 값을 저장한다
-
Optional(10)
→ 자료형 뒤에 물음표나 느낌표를 써준다 (대부분 물음표)
Int?
Int!
- 값이 있을수도 있으나 없을 수도 있다
-
java8의 Optional 클래스, Kotlin의 Nullable 타입
cf. Nullable type
Optional Type
- 다른 프로그래밍 언어에는 없는 새로운 개념
100이 아닌 optional(100)을 리턴함
그냥 100이 나오게하고싶다면 ! 붙이기
- 값을 반환할 때 오류가 발생할 가능성이 있는 값은 옵셔널 타입이라는 객체로 감싸서 반환
- swift에서 기본 자료형은 nil값을 저장할 수 없음 → nil도 저장하려면 옵셔널 타입으로 선언해야 함
- swift에서 기본 자료형은 nil값을 저장할 수 없음 → nil도 저장하려면 옵셔널 타입으로 선언해야 함
-
옵셔널 타입은 변수 또는 상수에 아무런 값이 할당되지 않는 상황을 안전하게 처리하기 위한 방법을 제공
: 오류가 생기더라도 실행을 멈추는 것이 아니라 nil 값을 반환함으로써 안전한 프로그래밍 환경을 만들어주려는 것 -
옵셔널 타입 변수 선언
: 타입 선언부 뒤에
?
문자를 쓴다
-
index라는 이름의 옵셔널 Int 변수를 선언하는 예
var index: Int?
- index 변수는 정수 값을 갖거나 아무 값도 갖지 않을 수 있음
강제 언래핑 Forced Unwrapping : 변수 이름 뒤 느낌표
- 옵셔널 변수에 값이 있으면 옵셔널로 "래핑되었다"고 함 → 래핑되어 있기 때문에 변수가 있는지 없는지 모르는 것!
- 옵셔널에 래핑된 값은 강제 언래핑으로 풀어줌 (forced unwrapping)
var x : Int? // 옵셔널 정수형 변수 x 선언
var y : Int = 0
x = 10 // 안 넣을 수도 있다
print(x) // Optional(10)
print(x!)
// forced unwrappoing 해서 10이 나옴 -> 강제로 풀어해친다
print(y)
강제 언래핑2 Forced Unwrapping 2 : Optional Binding
- 강제 언래핑하는 또 다른 방법으로, 옵셔널 바인딩을 이용하여 옵셔널에 할당된 값을 임시 변수 또는 상수에 할당함
if let constantname = optionalName {
}
- 옵셔널 변수가 값이 있다면 언래핑해서 일반상수 constname에 대입하고 if문 실행 (값이 있는 순간 풀린다)
- 값이 없다면 If문의 조건이 거짓이 되어 if문을 실행하지 않음
if var variablename = optionalName {
}
- 옵셔널 변수가 값이 있다면 언래핑해서 일반변수 variablename에 대입하고 if문 실행
- 값이 없다면 if문의 조건이 거짓이 되어 if문 실행하지 않음
var x : Int?
x = 10
if let xx = x {
print(xx)
}
else {
print("nil")
}
var x1 : Int?
if let xx = x1 {
print(xx)
}
else {
print("nil")
}
Optional Binding - 여러 옵셔널을 언래핑
- 여러 옵셔널 변수를 한번에 언래핑하는 방법 →
,
(콤마) 사용
var pet1: String?
var pet2: String?
pet1 = "cat"
pet2 = "dog"
if let firstPet = pet1, let secondPet = pet2{
print(firstPet, secondPet)
} else{
print("nil")
}
- 위의 예시를 optional binding 이용해서 바꿔보기
var x : Int?
x = 10
if let xx = x {
print(xx)
}
else {
print("nil")
}
var x1 : Int?
if let xx = x1 {
print(xx)
}
else {
print("nil")
}
→ optional binding 이용
var x : Int?
var y : Int?
x = 10
y = 20
if let xx = x, let yy = y {
print(xx, yy)
}
else {
print("nil")
}
Implicitly Unwrapped
- 옵셔널이 항상 유효한 값을 가질 경우 옵셔널이 암묵적인 언래핑 (implicitly unwrapped)이 되도록 선언할 수 있음
- 클래스의 outlet 변수 초기화에서 많이 사용 (자동 생성되는 코드)
- 이러한 방법으로 옵셔널이 선언된다면 강제 언래핑이나 옵셔널 바인딩을 하지 않아도 값에 접근할 수 있음
- 암묵적인 언래핑으로 옵셔널을 선언 → 선언부에
?
대신!
를 사용var x : Int?
// 옵셔널 변수 선언방법 1var y : Int!
// 옵셔널 변수 선언방법 2
Int!형을 property로 갖는 클래스
class MyAge{
var age : Int!
init(age: Int) {
self.age = age{
}
}
func printAge(){
print(age) //Optional(1)
print(age+1) //2, age! +1라고 쓸 필요가 없음
let age1 : Int = age
print(age1) // 1
let age2 = age + 2
print(age2) //3
}
}
}
var han = MyAge(age:1)
han.printAge()
Optional을 사용하는 이유
- nil의 가능성을 명시적으로 표현해주는 것.
- 전달받은 값이 옵셔널이 아니라면 nil체크 하지 않더라도 안심하고 사용할 수 있다. (효율적인 코딩이 가능하고 예외 상황을 최소화하는 안전한 코딩이 가능함)
- nil값을 옵셔널이 아닌 변수나 상수에 할당할 수 없음
var myInt = nil
// error (옵셔널이 아니면 nil값을 할당할 수 없다)let myConstant = nil
// 유효하지 않은 코드 → 일반형이므로 nil값 저장 불가var mystring : String = nil
// 유효하지 않은 코드 → 일반형이므로 nil값 저장 불가var myInt : Int? = nil
// OK (옵셔널에는 괜찮다)var myInt : Int?
// 초기화하지 않으면 자동으로 nil로 초기화됨 → 위와 같은 코드
학습자료 : Smile Han 유튜브 채널 & 야곰의 스위프트 프로그래밍
Author And Source
이 문제에 관하여(옵셔널 Optional), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@rubyy/21-10-01-Optional저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)