흔히 옵셔널은 swift의 꽃이라고 부릅니다.
그만큼 매력적인 문법이며 다른언어에는 없고 swift에만 있는 문법라고 들었습니다.
하지만 옵셔널에 대해 찾다보니 java나 javascript 등등 다른언어도에 옵셔널을 사용하는것을 보고 적지않게 당황했습니다...
그렇다면 과연 옵셔널은 다른 언어들도 왜 사용하며 어떠한 장점이 있는지
또한 이번 포스팅에서는 스위프트의 옵셔널 문법보다는
스위프트는 왜 옵셔널을 만들었고 어떻게 만들어 졌는지에 대해 한번 알아보도록 하겠습니다.
옵셔널의 사전적 의미

이것은 cambridge 사전에서 발취한 내용으로
무언가를 하기로 결정했는지에 따라, 필요하지 않거나 요구되지 않은것을 사용 가능하게 한다. 라는 뜻을 가지고 있습니다.
처음 옵셔널이란 개념을 왜 만들었는지에 대해 한번 알아봅시다.
옵셔널을 왜 만들었는지 알기 위해서는 아주 과거로 돌아가야합니다.
1965년 Tony Hoare에 의해 null 처음 등장했습니다.
null은 "존재하지 않는 값"으로 만들었습니다.
하지만 이것은 많은 문제를 초래했고, null은 만든 Tony Hoare조차도 The Billion Dollar Mistake라고 표현할정도로 후회를 했습니다.
특히 자바에서는 NullPointerException, 코드가독성, null 뜻의 모호성 등등 많은 문제가 있었습니다. (이것에 대해 자세히 알고싶으시다면 링크를 클릭해주세요 [링크])
이 문제들을 해결하기 위해서 스칼라,하스켈 등의 영향을 받아 자바는 Optional라는 새로운 클래스를 제공했습니다.
이것의 옵셔널의 시초이며 스위프트의 옵셔널도 영향을 받은것이라고 생각합니다.
공식 문서에 나와있는 옵셔널의 설명입니다.

즉 랩핑된 값이나 nil값중에 하나로, 값의 존재 여부를 나타내는 타입입니다.
또한 옵셔널은 Enumeration하고 제네릭으로 만들어진것을 확인할 수 있습니다.
public enum Optional<Wrapped>: ExpressibleByNilLiteral {
case none
case some(Wrapped)
@_transparent
public init(_ some: Wrapped) { self = .some(some) }
. . .
}
some은 값이 존재한다면 값을 < Wrapped > 형식으로 만들어 줍니다.
none은 값이 없다는 뜻으로 nil을 할당해줍니다.
기본 표기법은 밑의 코드처럼 생성할 수 있습니다.
let shortForm: Int? = 42
let longForm: Optional<Int> = 42
또한 enum타입으로도 값을 지정할 수 있습니다.
let number: Int? = Optional.some(42)
let noNumber: Int? = Optional.none
print(noNumber == nil)
// Prints "true"
스위프트에서 옵셔널을 사용하는 가장 큰 이유는 오브젝트-c의 객체값과의 상호작용성을 확보하려는 것입니다.
오브젝트-c에서는 어떤 객체 참조 값이든 nil이 될 수 있습니다. 따라서 오브젝트-c에 nil을 전달하거나 오브젝트-c로 부터 nil을 받을 수 있어야 합니다. 스위프트의 옵셔널은 이런 작업을 수행할 수 있는 방법입니다. 그리고 클래스나 구조체등등 참조를 해야할때 참조할 대상이 값이 없을때를 대비 할 수도 있습니다.
옵셔널을 사용하는 또 다른 주요 목적은 변수, 인스턴스, 프로퍼티의 초기화를 연기할 수 있다는 것도 있습니다. 옵셔널 타입의 변수는 초기화하기 전부터 nil값을 지니고 있으며 명시적인 초기화 전부터 변수가 값을 가지고 있어 데이터를 불러오는데 있어 값이 없어도 오류가 발생하지 않습니다.
또한 변수나 인스턴스나 프로퍼티를 생성할때 생성하기 전까지 nil을 할당해 데이터를 정의하기 전까지 메모리를 효율적으로 사용할 수 있다는 장점도 있습니다.
예를들어 참조를 할 때
class Aclass {
var a: Bclass = Bclass()
}
class Bclass {
var b: Cclass = Cclass()
}
class Cclass{
var number = 6
}
var i = Aclass()
변수 i를 통해 Cclass의 number값에 접근하고 싶을때는
i.a.b.number // 6
로 접근할 수 있을것입니다.
하지만 옵셔널이 없고 a가 nil(편의상 그냥 "값이 없다"는 뜻으로 사용하겠습니다)값이 된다면
i.a = nil // 물론 스위프트에서는 옵셔널로 지정하지 않는다면 nil값을 대입할 수 없습니다.
i.a.b.number
라는 코드를 사용할때 a에 접근하고 b에 접근해야하는데 a에 값이 없기 때문에 오류가 발생할 것입니다. 그래서 오류를 방지하고자
if i.a != nil{
i.a.b != nil{
print(i.a.b.number)
} else {...}
} else {...}
이런식으로 사용했습니다.
하지만 애플은 옵셔널을 만들었고 옵셔널 체이닝을 사용하면 보다 간결하게 작성할 수 있습니다.
class Aclass {
var a: Bclass = Bclass()
}
class Bclass {
// b프로퍼티에 값을 넣지 않아도 자동으로 nil로 반환하며 필요할때 값을 할당하여 메모리관리를 할 수 있다.
var b: Cclass?
}
class Cclass{
var number = 6
}
var i = Aclass()
i.a.b = Cclass()
// number에 접근할 때
i.a.b?.number // 6
// 값이 없는데 접근할 때
i.a.b = nil
i.a.b?.number // nil
이런식으로 접근할때 오류를 방지하며 코드를 간결하게 작성할수 있어 가독성도 좋아집니다.
또한 프로퍼티에 값이 없더라도 인스턴스를 생성할 수 있으며 값을 할당할때 접근하여 새로 데이터를 사용하기 때문에 메모리관리 측면에서 상당히 유용합니다.
옵셔널은 어디서 부터 파생되었는지 옵셔널은 왜 만들었는지, 스위프트에서는 왜 옵셔널을 도입했는지에 대해서 알아봤고 실제로 어떤 기능을 하고 있고 어떻게 만들어 졌으며 사용했을 때의 장점에 대해서 알아봤습니다.
또한 옵셔널은 내부적으로 어떻게 생겼는지도 알게 되었고, 다른 언어에서도 옵셔널을 사용한다는 것도 알게되었고 스위프트에서의 옵셔널은 개발자에게 상당히 편리함을 제공하고 있다는 것을 알게되었고 그리고 책임을 덜어주는 문법이라고 생각합니다.
그렇다면 이렇게 많은 장점을 가지고 있으니까 옵셔널은 항상 사용하는것이 옳은것인가??라는 생각이 들었고
나중에 기회가 되면 다루도록 하겠습니다.