본문 바로가기
🍎iOS프로그래밍/오늘의 공부

Swift의 옵셔널(Optional) 개념 이해하기 / iOS 프로그래밍

by 둥둥동동# 2021. 9. 17.
728x90

 

 

옵셔널(Optional)이란 ?

 

옵셔널이란 값이 있을 수도 없을 수도 있는 가능성을 나타낸 표현입니다

아무런 값도 반환할 수 없다는 의미의 Nil값을 가질 수 있는 것입니다
오류가능성이 있는 리턴값을 옵셔널타입으로 감싸 안전하게 리턴할 수 있습니다

 

 

 

옵셔널(Optional) 선언

 

var myNum1: Int= nil 
var myNum2: Int! = nil 
var myNum3: Int = nil //컴파일에러
cs

 

옵셔널타입 변수선언은 ?또는 !  키워드를 사용합니다

?와!의 차이점은 아래로 이동

nil은 옵셔널타입에만 할당할 수 있습니다 일반타입 변수에 할당하려고 하면 컴파일 에러가 발생합니다

 

예제에서는 직접 nil값으로 초기화를 했지만 

var myNum1: Int//nil
cs

이렇게 초기값을 할당하지 않아도 nil값은 자동으로 주어집니다

 

 

옵셔널(Optional) 사용 / 강제 언래핑(forced unwrapping)

 

var myNum1: Int= 3
var myNum2: Double?
print(myNum1, myNum2)//Optional(3) nil
cs

옵셔널타입에 3을 대입하면 3이 아니라 Optional(3)이라는 값이 나오게 됩니다 

초기값을 설정하지 않으면 아무 값도 없다는 의미의 nil이 들어가게 됩니다

 

 

옵셔널타입 변수를 사용하기 위해서는 옵셔널타입을 강제로 해제하는 언래핑 과정이 필요합니다

var myNum1: Int= 3
var myNum2: Int = myNum1 //error
var myNum2: Int = myNum1!//3
cs

옵셔널 타입인 myNum1에 Optional(3)이 들어있습니다 

일반타입 Int와 옵셔널타입 Int는 서로 다른 자료형 이기 때문에

옵셔널타입 Int를 대입하면 컴파일 에러가 발생하게 됩니다

옵셔널타입을 일반타입에 넣기 위해서는 옵셔널타입의 값을 강제로 해제하는 과정이 필요합니다

이것을 강제 언래핑 이라고 부르며 옵셔널 타입 변수에 !를 붙여 사용합니다

 

 

아래는 언래핑 이해를 돕기 위한 코드입니다

var x: Int?
var y : Int = 0
print(x) //nill
= 15  
print(x) //Optional(15)
pritn(x!//15
print(y) //0
= x+2 //컴파일 에러
= x! + 2 //17
= x  //컴파일 에러
= x! //17
cs

x은 옵셔널타입, y는 일반타입 변수입니다

x는 초기값을 할당 받지 않아 nil값을 가지게 되고 값15를 할당해 주면 Optoinal(15)를 가지게 됩니다

x에 !연산자를 붙여 언래핑을 하면 15라는 값을 출력하게 됩니다

앞서 말씀드린것 처럼 옵셔널 타입은 nil값을 포함하는 자료형이기 때문에 일반 자료형과 구별되는 데이터 타입 입니다

x는 일반타입의 값을 받아 옵셔널타입 형태로 저장할 순 있지만 

데이터 형태가 다르기 때문에 옵셔널과 일반타입을 함께 연산할 순 없습니다.

같은 이유로 일반타입 변수에 옵셔널타입 값을 대입할 수 없습니다

일반타입에 옵셔널 타입의 값을 넣으려면 언래핑 과정이 필수적으로 필요합니다

다만 nil값에 언래핑을 시도하면 에러가 발생할 수 있으니 주의가 필요합니다

 

 

옵셔널(Optional) 선언의 종류

 

옵셔널을 선언하는 방법에는 ?를 붙이는 방법과 !를 붙이는 방법 두가지가 있습니다. 

var a: Int= 1
var b: Int
= a 
print(b) // 컴파일 에러
cs

 

var a: Int! = 1
var b: Int
= a 
print(b) // 1
cs

위쪽 코드는 에러가 발생했지만 아래 코드는 문제없이 출력되는 상황입니다

?와 !의 차이점은 암묵적 언래핑의 실행여부입니다

?는 항상 opntional타입을 반환하고 !도 기본적으로는 항상 Optional타입을 반환합니다

하지만 대입되어야할 대상이 일반 데이터타입이라면 자동으로 옵셔널타입을 언래핑하여 값을 대입해 줍니다

따라서 해당 옵셔널변수가 항상 유효한 값을 가진다(nil을 가지지 않음)는 확신이 있을 경우에만 !선언을 사용해야 합니다

 

 

옵셔널 바인딩(Optional Binding)

 

var a: Int= 3
if let ab = a{
    print(a)//optional(3)
    print(ab)//3
}
cs

위에서 말씀드린 언래핑과 비슷한 기능을 합니다

if문을 실행하기 전 옵셔널 타입의 값을 언래핑하여 새로운 상수, 또는 변수에 저장하는 방법입니다

따라서 if문내에서 해당 값을 쓸 때 매번 !로 강제 언래핑을 할 필요가 없어져 코드가 간결해지는 효과가 있습니다

물론 새로 선언된 변수는 if문이 끝나면 사라지게 됩니다

 

 

 

 

 

728x90
반응형

댓글