[Swift] Optional

비나·2022년 9월 26음

Swift

목록 볎Ʞ
8/8
post-thumbnail

📌 Optional

Optional,,
Swift 강의 간닚한거로 듀었을때 옵셔널 진짜 읎핎가 안가는 낎용읎었는데
였늘 ꌭ ꌭ 읎핎하여 볎자.

옵셔널은 Swift의 특징 쀑 하나읞 안정성을 묞법윌로 닎볎하는 Ʞ능읎닀.
C얞얎나 Object-C에서는 찟을 수 없는 개념읎닀.

말 귞대로, '선택적읞'읎띌는 의믞읞데,
값읎 있을 수도 있고, 없을 수도 있음을 나타낞닀.
슉, 변수 또는 상수의 값읎 nil음 수도 있닀는 것읎닀.

옵셔널의 장점은 아래와 같닀.

  1. 전달읞자로 NULL읎 전달되얎도 되는지 묞서에 명시하지 않아도 묞법적 표현만윌로 알 수 있닀.
  2. 옵셔널곌 옵셔널읎 아닌 값은 철저히 닀륞 타입윌로 읞식하Ʞ에 컎파음 시 였류륌 걞러낌 수 있닀.



✅ 옵셔널 사용

읎전 포슀팅에서 닀룚었던 nil은 옵셔널에서 사용한닀.
옵셔널 변수 또는 상수가 아니멎 nil을 할당할 수 없닀.

nil의 개념곌 0 또는 ""은 닀륞 개념읎닀.
0은 0읎띌는 숫자륌 의믞하고 ""은 빈 묞자엎을 의믞하는 것읎닀.
슉, nil(값읎 없닀)의 의믞가 아닌 것읎닀.

따띌서 nil로 표현하는 겜우는 정말 정말 값읎 졎재하지 않는 겜우읎닀.
읎는 핚수형 프로귞래밍에 자죌 등장하는 몚나드 개념곌 음맥상통한닀.
몚나드 개념은 나도 몚륞닀,, 책에 있Ꞟ래 음닚 메몚메몚,,

아묎튌 귞래서 옵셔널의 사용의 의믞는 많은 것을 축앜한닀.
옵셔널의 사용윌로 우늬는 핎당 변수 또는 상수에 값읎 없을 수 있닀는 것을 직ꎀ적윌로 알 수 있닀.

📖 예제

아래의 예제륌 통핎 옵셔널 사용을 얎떻게 하는지 볎자.
옵셔널로 선얞된 곳에서만 nil을 사용할 수 있닀.
따띌서 아래와 같읎 묌음표(?)륌 붙여 옵셔널을 ì„ ì–ž 후에 핎당 값에 nil을 넣얎알지만 였류가 나지 않는닀.

📄 입력

var name: String? = "Mei"
print(name)

name = nil
print(name)

💻 출력

Optional("Mei")
nil

✹ 옵셔널의 ì„ ì–ž 방법

옵셔널은 위의 예제와 같읎 var name: String? = "Mei" 읎러한 형태로 선얞핎도 되지만,
var name: Optional<String> 읎렇게 명확하게 썚쀄 수도 있닀.
하지만 묌음표륌 붙읎는 것읎 더 펞하고 읜Ʞ도 쉜Ʞ 때묞에 더 많읎 사용한닀.

✅ 옵셔널 사용의 읎유

옵셔널을 굳읎 굳읎 쓰는 읎유의 예로 핚수의 전달읞자 값읎 잘못된 겜우 (간닚한 였류띌멎) 제대로 처늬하지 못했음을 nil을 반환하여 표현하는 것을 ë“€ 수 있닀.
또는, 맀개변수륌 굳읎 넘Ʞ지 않아도 된닀는 뜻윌로 맀개변수의 타입을 옵셔널로 정의할 수도 있닀.

📖 엎거형 쎈Ʞ화 예제

아래와 같은 원시 값을 통한 엎거형 쎈Ʞ화 예제륌 볎자.

let primary = School(rawValue: "유치원")
let graduate = School(rawValue: "대학원")

위의 예제에서는 닀륞 때와 달늬, 변수나 상수 뒀에 데읎터 타입을 명시핎죌지 않고 데읎터 타입 추론 Ʞ능을 사용했닀.
읎렇게 한 읎유는 nil을 할당하는 겜우가 생ꞰꞰ 때묞읎닀.
위의 예제에서는 primary 와 graduate 상수의 데읎터 타입을 School?띌고 추론하게 된닀.
원시 값읎 엎거형의 case에 핎당하지 않윌멎 엎거형 읞슀턎슀 생성에 싀팚하여, nil을 반환한닀.
읎는 핚수의 처늬 싀팚 유형에 핎당한닀.


✅ 옵셔널 엎거형의 정의

아래의 윔드는 옵셔널의 정의읎닀.

public enum Optinal<Wrapped> : ExpressibleByNilLiteral {
    case none
    case some(Wrapped)
    public init(_ some: Wrapped)
    /// more ... 
}

위의 윔드(옵셔널의 정의)륌 볎멎 옵셔널은 제넀늭읎 적용된 엎거형읎닀.
ExpressibleByNilLiteral 프로토윜을 따륎는 것도 확읞할 수 있닀.

여Ʞ서 쀑요한 것은 읎것읎닀.

옵셔널은 값을 갖는 쌀읎슀와 귞렇지 못한 쌀읎슀 두 가지로 정의되얎 있음
=> nil음때는 none 쌀읎슀가 되며, 값읎 있는 겜우 some 쌀읎슀가 됚
=> 값읎 있는 겜우 some 쌀읎슀가 되므로, some의 연ꎀ 값읞 Wrapped에 값읎 할당됚

📖 옵셔널 값 확읞(switch)

옵셔널은 엎거형읎Ʞ 때묞에, 옵셔널 변수는 switch 구묞을 통핎 값읎 있고 없음을 할 수 있닀.
아래와 같읎 확읞읎 가능하닀.

📄 입력

func checkOptionalValue(value optionalValue: Any?){
    switch optionalValue {
    case .none:
        print("This Optional variable is nil")
    case .some(let value):
        print("Value is \(value)")
    }
}

var name: String? = "Mei"
checkOptionalValue(value: name)

name = nil
checkOptionalValue(value: name)

💻 출력

Value is Mei
This Optional variable is nil

📖 옵셔널 확읞(switch+where절)

위 예제에서 한 switch륌 통한 옵셔널 값 확읞에서 where 절을 결합하멎 좀 더 섞렚되게 윔드륌 작성할 수 있닀.
예제는 닀음곌 같닀. (읎 예제는 where절을 공부하고 닀시 볎멎 좋을 듯 하닀.)

let nums: [Int?] = [2, nil, -2, 0]

for num in nums {
    switch num {
    case .some(let value) where value < 0:
        print("Negative value")
    case .some(let value) where value > 0:
        print("Positive value")
    case .some:
        print("Zero")
    case .none:
        print("Nil !!")
    }
}

✅ 옵셔널 추출

옵셔널을 switch 구묞을 통핎 맀번 값읎 있는지 확읞하는 것은 맀우 불펞하닀.
따띌서 옵셔널 타입에서 값을 조ꞈ 더 안전하고 펞늬하게 추출하는 방법을 알멎 좋닀.

📖 강제 추출

옵셔널 강제 추출 방식은 옵셔널의 값을 추출하는 방법 쀑 가장 간닚하지만 가장 위험한 방법읎닀.
방법은 옵셔널 값의 뒀에 느낌표(!)륌 붙여죌는 것읎닀.
만앜 강제 추출 시 옵셔널에 값읎 nil읎띌멎, 런타임 였류가 발생한닀.
따띌서 런타임 였류의 가능성을 항상 낎포하Ʞ 때묞에 강제 추출 방식은 지양핎알 한닀.

사용법은 아래 예제륌 찞고하자.

var name: String? = "Mei"
print(name)

var mei = name!
print(mei)

name = nil
mei = name!
print(mei)

// 조걎묞을 사용하멎 조ꞈ 더 안전하게 처늬 가능
if name != nil {
	print("My name is \(name!)")
}
else {
	print("name is nil")
}

📖 옵셔널 바읞딩

옵셔널 강제 추출에서 if 구묞을 사용하는 방법은 닀륞 프로귞래밍 얞얎에서 NULL 값을 첎크하는 방식곌 비슷하닀.
귞러멎 옵셔널을 사용하는 의믞도 사띌진닀.
따띌서 Swift는 조ꞈ 더 안전하고 섞렚된 방법윌로 옵셔널 바읞딩을 제공한닀.

옵셔널 바읞딩은 옵셔널에 값읎 있는지 확읞할 때 사용한닀.
만앜 옵셔널에 값읎 있윌멎,
추출한 값을 음정 랔록 안에서 사용할 수 있는 상수나 변수로 할당하여 옵셔널읎 아닌 형태로 사용할 수 있도록 한닀.

옵셔널 바읞딩은 아래 예제와 같읎 if 또는 while 구묞 등곌 결합하여 사용읎 가능하닀.

var name: String? = "Mei"

// 옵셔널 바읞딩을 통한 임시 상수 할당
if let me = name {
    print("i am \(me)")
}
else {
    print("name is nil")
}

// 옵셔널 바읞딩을 통한 임시 변수 할당
if var me = name {
    name = "Vina"
    print("i am \(name)")
}
else {
    print("name == nil")
}

✹ 옵셔널 바읞딩곌 옵셔널 첎읎닝

옵셔널 바읞딩은 옵셔널 첎읎닝곌 환상의 결합을 읎룬닀.
읎는 옵셔널 첎읎닝 정늬에서 정늬하도록 한닀.

📖 암시적 추출 옵셔널

nil을 할당하고 싶지만, 옵셔널 바읞딩윌로 맀번 값을 추출하Ʞ 귀찮거나
로직상 nil 때묞에 런타임 였류가 발생하지 않을 것 같닀는 확신읎 드는 겜우가 있닀.
읎런 겜우에는 nil을 할당핎쀄 수 있는 옵셔널읎 아닌 변수나 상수가 있윌멎 좋을 것읎닀.
읎때 사용하는 것읎 바로 암시적 추출 옵셔널읎닀.
암시적 추출 옵셔널을 사용하렀멎 타입 뒀에 느낌표(!)륌 사용하멎 된닀.

암시적 추출 옵셔널로 지정된 타입은 음반 값처럌 사용읎 가능하닀.
하지만 읎도 옵셔널읎Ʞ 때묞에 nil읎 할당되얎 있는데 아래 예제와 같읎 접귌을 시도하멎 런타임 였류가 발생한닀.

var name: String! = "Mei"
print(name)

name = nil

if let nameCheck = name {
    print("i am \(name)")
}
else {
    print("name == nil")
}

name.isEmpty

## ✅ 안전한 옵셔널 추출 옵셔널을 사용할 때는 강제 추출읎나 암시적 추출 옵셔널을 사용하Ʞ볎닀는 옵셔널 바읞딩, nil 병합 연산자륌 비롯핎 옵셔널 첎읎닝 등의 방법을 사용하는 것읎 더 안전하닀. 또한 읎러한 방법듀읎 swift의 지향점에도 부합한닀.


📌 마묎늬

진짜,, 개강 전 + 추석연휎의 핑계로 아죌 알묎지게 놀고 와서 4390481년 만에 포슀팅읎닀.
암튌 왜 놀아도 놀아도 놀고 싶은지..
낎가 녾는 사읎 xcode가 업데읎튞 되었닀.
귌데 묞제는 낎가 저번에 귀찮아서 앱슀토얎에서 닀욎로드 했었는데,
업데읎튞 묎한 로딩읎 되더띌,,^__ㅠ
눈묌을 뚞ꞈ고,, 닀시 읞터넷윌로 닀욎로드 했닀.
암튌,, 귞랬닀,,
읎제 닀시 공부 좀 하자.
귞러고 볎니 교대원 종합시험도 있닀.(2죌도 안낚았는데, 통곌핎알 졞업한닀.)
귌데 공부륌 안했닀.
공부 좀 핎띌 제발,, 아자아자 🐯✚



ì°žê³ 
- 알곰, 『슀위프튞 프로귞래밍 3판』, 한빛믞디얎, 2021.04
- the swift programming language swift 5.7
- Swift | Apple Developer Documentation
profile
아자아자 윔딩띌읎푞 Ù©(๑❛ʚ❛๑)Û¶

0개의 댓Ꞁ