오늘 알아볼것은 옵셔널 타입입니다.
옵셔널(Optional)이란?
래핑된 값이나 값이 없다는것을 알려주는 타입이라고 나와있습니다.
이게 무슨 쓸모가 있나라는 생각을 하실수도 있는데요
왜 옵셔널이 생기게 되었는지 알아가봅시다
옵셔널의 탄생배경
프로그램이 실행될때 운영체제가
우리가 작성한 코드를 바탕으로 메모리에 공간을 할당합니다.
var x: Int = 1
var y: Int
print(x)
print(y)
위와같은 코드가 포함된 프로그램을 실행한다면
y에 대한값에 접근할때 에러가 발생하여
프로그램이 죽게됩니다. 왜냐하면 y에 값이 없기 때문이죠.
이와같은 상황은 언어에 상관없이 공통적으로 발생하는 문제입니다.
프로그램이 작을때는 발견이쉬워서 수정이 가능하지만 프로그램이 점점 거대해져
코드가 점점 많아진다면 프로그램이 어디서 죽는지 찾기 정말 어려울것입니다.
아니 그러면 그냥 아무 더미값이나 넣으면 되는거 아니야 ??
라고 생각하실수도 있을거에요
하지만 그것도 좋은 해결방법은 아닙니다.
더미값을 수정하는것을 까먹거나
아니면 더미값이 의미있는 값으로 취급되어 동작할 수도 있어
원래대로라면 에러가 발생해야하는 상황이지만 정상 작동할수도 있습니다.
그렇다면 더미값으로 값이 없다는 값을 넣어주면 되지 않을까 ??
또는 메모리공간에 접근할때 한번 포장을해주면 되지 않을까 ??
라는 생각을 하게되어 만들어진것이 옵셔널타입 입니다.
다른언어의 NULL과의 차이를 아시겠나요 ??
다른언어의 NULL은 값이 없음 이지만
옵셔널에서 nil은 값이 없음을 나타내는 값 입니다.
옵셔널의 사용법
옵셔널타입을 선언하는 방법은 아주 간단합니다.
모든타입의 뒤에?만 붙혀주면 옵셔널타입으로 선언된것입니다.
Int // 정수형
Int? // 옵셔널 정수형
Double // 실수형
Double? // 옵셔널 실수형
String // 문자열
String? // 옵셔널 문자열
Character // 문자형
Character? // 옵셔널 문자형
옵셔널로 선언시 nil이 포함됩니다.
옵셔널로 선언한 타입에 값을 할당해주지 않는다면 자동적으로 nil이 할당됩니다.
var x: Int? = 1 // 옵셔널 타입이기 때문에 값을 Optional로 포장
var y: Int? // 자동으로 nil 할당
var z:Int? = nil // 명시적으로 nil 할당도 가능
print(x) // Optional(1)
print(y) // nil
print(z) // nil
Swift는 타입추론이 가능하지만
옵셔널타입은 명시적으로 선언해주어야 하는데
옵셔널 타입은 전부 nil을 포함하기 때문에
어떤 옵셔널 타입인지 추론이 불가능 하기 때문이다.
var x = nil // Int?, Double?, String? .... 어떤 타입인지 추론이 불가능하다.
var y = Optional(1) // Optional로 값을주면 타입추론이 가능하다.
옵셔널 타입의 값 복사
옵셔널 변수x를 복사한다면
y는 옵셔널타입일까 ??
var x: Int? = 1
var y = x // y의 타입은 ??
위의 그림을 자세히 보았다면 y는 옵셔널 타입이라는 것을 알 수 있습니다.
그렇다면 옵셔널타입에 논옵셔널타입의 값을 넣는 경우엔 어떨까요 ??
var x: Int? = 1
var y = x // y의 타입은 ??
var z: Int = 2
y = z // y의 값은 ??
이때 y의 값은 Optional(2)가 됩니다. 그 이유는
옵셔널이 논 옵셔널 타입보다 더 큰범위이기 때문입니다.
그렇기 때문에 옵셔널타입에 논옵셔널타입의 값을 복사할 수 있지만
반대의 경우에는 불가능합니다.
var x: Int? = 1
var y = x
var z: Int = 2
y = z
z = y // z는 Non-Optional y는 Optional이기 때문에 불가능
옵셔널 타입끼리의 연산은 불가능
옵셔널 타입은 연산이 불가능한데
옵셔널 타입의 값이 nil일 경우에는 값이 없으므로
연산이 불가능하기 때문이다.
쉽게 이해하자면 옵셔널타입은 옵셔널 포장지로 감싸져 있기 때문에
내용물을 알 수 없어 연산이 불가능하다고 생각하면 된다
var x: Int? = 1
var y: Int? = 2
x + y
// x, y가 nil 즉 값이 없을 수 도 있기 때문
// 쉽게 이해하자면 포장지로 감싸져있기 때문에 연산 불가능
옵셔널 타입의 값을 사용하려면 옵셔널포장지를 벗겨서 사용해야하는데
다음 글에서 옵셔널 값을 바인딩하는 방법을 알아보자