Deep_Dev
article thumbnail

 

 

์˜ต์…”๋„

์˜ต์…”๋„ = '์„ ํƒ์ ์ธ'. ์ฆ‰, ๊ฐ’์ด ์žˆ์„์ˆ˜๋„ ์—†์„์ˆ˜๋„ ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ‘œํ˜„

์ด๋Š” '๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜ ๋“ฑ์— ๊ผญ ๊ฐ’์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค. ์ฆ‰, ๋ณ€์ˆ˜ ๋˜๋Š” ์ƒ์ˆ˜์˜ ๊ฐ’์ด nil ์ผ ์ˆ˜๋„ ์žˆ๋‹ค'๋Š” ๊ฒƒ

 

nil์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ ์˜ต์…”๋„

์˜ค์ง ์˜ต์…”๋„ ํƒ€์ž…๋งŒ nil์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์ผ๋ฐ˜ ์ž๋ฃŒํ˜•์€ nil์„ ๊ฐ€์ง€๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†๋‹ค.

 

์˜ต์…”๋„ ์‚ฌ์šฉ

 ์˜ต์…”๋„ ๋ณ€์ˆ˜ ๋˜๋Š” ์ƒ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฉด nil ํ• ๋‹น ๋ถˆ๊ฐ€

 

์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” nil ํ• ๋‹น

var myName: String = "yagom"
myName = nil // ์˜ค๋ฅ˜

nil์€ ์˜ต์…”๋„๋กœ ์„ ์–ธ๋œ ๊ณณ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ต์…”๋„ ๋ณ€์ˆ˜ ๋˜๋Š” ์ƒ์ˆ˜ ๋“ฑ์€ ๋ฐ์ดํ„ฐ ํƒ€์ž… ๋’ค์— ๋ฌผ์Œํ‘œ ? ๋ฅผ ๋ถ™์—ฌ ํ‘œํ˜„ํ•ด์ค€๋‹ค.

 

์ •์ƒ์ ์ธ nil ํ• ๋‹น

var myName: String? = "yagom"
print(myName) // yagom

myName = nil
print(myName) // nil

 

์˜ต์…”๋„์€ ์–ด๋–ค ์ƒํ™ฉ์— ์‚ฌ์šฉ ? 


1. ์™œ ๊ตณ์ด ๋ณ€์ˆ˜์— nil์ด ์žˆ์Œ์„ ๊ฐ€์ •ํ•ด์•ผ ํ• ๊นŒ ?

 ์˜ˆ๋ฅผ๋“ค์–ด ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜๋Š” ์ „๋‹ฌ์ธ์ž์˜ ๊ฐ’์ด ์ž˜๋ชป๋œ ๊ฐ’์ผ ๊ฒฝ์šฐ ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ–ˆ์Œ์„ nil ์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ
 ๋ฌผ๋ก  ๊ธฐ๋Šฅ์ƒ ์‹ฌ๊ฐํ•œ ์˜ค๋ฅ˜๋ผ๋ฉด ๋ณ„๋„๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ๊ฒ ์ง€๋งŒ, ๊ฐ„๋‹จํžˆ nil์„ ๋ฐ˜ํ™˜ํ•ด์„œ ์•Œ๋ฆด ์ˆ˜๋„ ์žˆ๋‹ค.

2. ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ตณ์ด ๋„˜๊ธฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ๋œป = ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ์˜ต์…”๋„๋กœ
 ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์˜ต์…”๋„์ผ๋•Œ๋Š” '์•„, ์ด ๋งค๊ฐœ๋ณ€์ˆ˜์—๋Š” ๊ฐ’์ด ์—†์–ด๋„ ๋˜๋Š”๊ตฌ๋‚˜'๋ผ๊ณ  ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค.

 

 

์›์‹œ ๊ฐ’์„ ํ†ตํ•œ ์—ด๊ฑฐํ˜• ์ดˆ๊ธฐํ™”

let primary = School(rawValue: "์œ ์น˜์›") // primary
let graduate = School(rawValue: "์„๋ฐ•์‚ฌ") // nil

let one = Numbers(rawValue: 1) // one
let three = Numbers(rawValue : 3) // nil

์›๋ž˜๋Š” ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜ ๋’ค์— ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋ช…์‹œํ–ˆ์ง€๋งŒ, ์ด ์˜ˆ์ œ์—์„œ๋Š” ๋ช…์‹œํ•ด์ฃผ์ง€ ์•Š๊ณ  ์ถ”๋ก ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค

 > nil ์„ ํ• ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์•„๋งˆ๋„ primary ๋ฐ graduate ์ƒ์ˆ˜์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๊ฐ€์ง€๊ณ  School? ์ด๋ผ๊ณ  ์ถ”๋ก ํ–ˆ์„๊ฒƒ์ด๋‹ค. ๋˜, one๊ณผ three ์ƒ์ˆ˜์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ Numbers?๋ผ๊ณ  ์ถ”๋ก ํ–ˆ์„๊ฒƒ์ด๋‹ค. ์ด๋•Œ ์›์‹œ ๊ฐ’์ด ์—ด๊ฑฐํ˜•์˜ case์— ํ•ด๋‹นํ•˜์ง€ ์•Š์œผ๋ฉด ์—ด๊ฑฐํ˜• ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์— ์‹คํŒจํ•˜์—ฌ nil์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธด๋‹ค.

 

 

๐Ÿ’ก ์˜ต์…”๋„ ์—ด๊ฑฐํ˜•์˜ ์ •์˜

์˜ต์…”๋„ = ์—ด๊ฑฐํ˜•์œผ๋กœ ๊ตฌํ˜„๋˜์–ด์ง

// ์ œ๋„ค๋ฆญ์ด ์ ์šฉ๋œ ์—ด๊ฑฐํ˜•์˜ ๋ชจ์Šต 
public enum Optional<Wrapped> : ExpressibleByNilLiteral {
	case none
	case some(Wrapped)
	public init(_ some: Wrapper)
    	// ์ค‘๋žต ..
}

์˜ต์…”๋„์ด ๊ฐ’์„ ๊ฐ–๋Š” ์ผ€์ด์Šค์™€ ๊ทธ๋ ‡์ง€ ๋ชปํ•œ ์ผ€์ด์Šค 2๊ฐ€์ง€๋กœ ์ •์˜ ๋œ๋‹ค.

์ฆ‰, nil์ผ๋•Œ๋Š” none์ผ€์ด์Šค๊ฐ€ ๋  ๊ฒƒ์ด๊ณ , ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” some ์ผ€์ด์Šค๊ฐ€ ๋˜๋Š”๋ฐ, ์—ฐ๊ด€ ๊ฐ’์œผ๋กœ Wrapped๊ฐ€ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ์˜ต์…”๋„์— ๊ฐ’์ด ์žˆ์œผ๋ฉด some์˜ ์—ฐ๊ด€ ๊ฐ’์ธ Wrapped์— ๊ฐ’์ด ํ• ๋‹น๋œ๋‹ค. ์ฆ‰, ๊ฐ’์ด ์˜ต์…”๋„์ด๋ผ๋Š” ์—ด๊ฑฐํ˜•์˜ ๋ฐฉํŒจ๋ง‰์—

๋ณดํ˜ธ๋˜์–ด ๋ž˜ํ•‘๋˜์–ด ์žˆ๋Š” ๋ชจ์Šต์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์˜ต์…”๋„ ์ถ”์ถœ

์—ด๊ฑฐํ˜•์˜ some ์ผ€์ด์Šค๋กœ ๊ผญ๊ผญ ์ˆจ์–ด์žˆ๋Š” ์˜ต์…”๋„์˜ ๊ฐ’์„ ์˜ต์…”๋„์ด ์•„๋‹Œ ๊ฐ’์œผ๋กœ ์ถ”์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•

 

1. ๊ฐ•์ œ์ถ”์ถœ

์˜ต์…”๋„ ๊ฐ•์ œ ์ถ”์ถœ ๋ฐฉ์‹์€ ์˜ต์…”๋„์˜ ๊ฐ’์„ ์ถ”์ถœํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๊ฐ€์žฅ ์œ„ํ—˜ํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค.

๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ์ผ์–ด๋‚  ๊ฐ€๋Šฅ์„ฑ์ด ๊ฐ€์žฅ ๋†’๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ฐ•์ œ์ถ”์ถœ์„ ํ•˜๋ ค๋ฉด, ์˜ต์…”๋„ ๊ฐ’์˜ ๋’ค์— ๋Š๋‚Œํ‘œ ! ๋ฅผ ๋ถ™์—ฌ ๊ฐ•์ œ๋กœ ์ถ”์ถœํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.

๋งŒ์•ฝ ๊ฐ•์ œ ์ถ”์ถœ์‹œ ์˜ต์…”๋„์— ๊ฐ’์ด ์—†๋‹ค๋ฉด, ์ฆ‰ nil ์ด๋ผ๋ฉด ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.


var myName: String? = "yagom"

// ์˜ต์…”๋„์ด ์•„๋‹Œ ๋ณ€์ˆ˜์—๋Š” ์˜ต์…”๋„ ๊ฐ’์ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†๋‹ค. ์ถ”์ถœํ•ด์„œ ํ• ๋‹นํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
var yagom: String = myName!

myName = nil
yagom = myName! // ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜

// if ๊ตฌ๋ฌธ ๋“ฑ ์กฐ๊ฑด๋ฌธ์„ ์ด์šฉํ•ด์„œ ์กฐ๊ธˆ ๋” ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.
if myName != nil {
	print("My name is\(myName!)")
} else {
	print("My name == nil")
}

// myName == nil

์˜ต์…”๋„ ๊ฐ•์ œ ์ถ”์ถœ ๋ฐฉ์‹์€ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ง€์–‘ํ•ด์•ผ ํ•จ

 

 

2. ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ

์˜ต์…”๋„์— ๊ฐ’์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ๋•Œ ์‚ฌ์šฉ

 

๋งŒ์•ฝ ์˜ต์…”๋„์— ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ์˜ต์…”๋„์—์„œ ์ถ”์ถœํ•œ ๊ฐ’์„ ์ผ์ • ๋ธ”๋ก์•ˆ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ์ˆ˜๋‚˜ ๋ณ€์ˆ˜๋กœ ํ• ๋‹นํ•ด์„œ ์˜ต์…”๋„์ด ์•„๋‹Œ ํ˜•ํƒœ๋กœ

์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. if ๋˜๋Š” while ๊ตฌ๋ฌธ ๋“ฑ๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 


var myName: String? = "yagom"

// ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์„ ํ†ตํ•œ ์ž„์‹œ ์ƒ์ˆ˜ ํ• ๋‹น
if let name = myName {
	print("My name is \(name)")
} else {
	print("my Name == nil")
}
// My name is yagom


// ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์„ ํ†ตํ•œ ์ž„์‹œ ๋ณ€์ˆ˜ ํ• ๋‹น
if var name = myName{
	name = "wizplan" // ๋ณ€์ˆ˜์ด๋ฏ€๋กœ ๋‚ด๋ถ€์—์„œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
    print("My Name is\(name)")
} else {
	print("myName == nil")
}
// My name is wizplan

 

 

3. ์•”์‹œ์  ์ถ”์ถœ ์˜ต์…”๋„

๋•Œ๋•Œ๋กœ nil์„ ํ• ๋‹นํ•˜๊ณ  ์‹ถ์ง€๋งŒ, ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์œผ๋กœ ๋งค๋ฒˆ ๊ฐ’์„ ์ถ”์ถœํ•˜๊ธฐ ๊ท€์ฐฎ๊ฑฐ๋‚˜ ๋กœ์ง์ƒ nil ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ํ™•์‹ ์ด ๋“ค๋•Œ nil ์„ ํ• ๋‹นํ•ด ์ค„ ์ˆ˜ ์žˆ๋Š” ์˜ต์…”๋„์ด ์•„๋‹Œ ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹์„ ๋•Œ ์‚ฌ์šฉ.

 

์˜ต์…”๋„์„ ํ‘œ์‹œํ•˜๊ณ ์ž ํƒ€์ž… ๋’ค์— ๋ฌผ์Œํ‘œ ? ๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, ์•”์‹œ์  ์ถ”์ถœ ์˜ต์…”๋„์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํƒ€์ž… ๋’ค์— ๋Š๋‚Œํ‘œ ! ๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ๋ฉด ๋œ๋‹ค.


var myName: String! = "yagom"
print(myName) // yagom
myName = nil

// ์•”์‹œ์  ์ถ”์ถœ ์˜ต์…”๋„๋„ ์˜ต์…”๋„์ด๋ฏ€๋กœ ๋‹น์—ฐํžˆ ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
if let name = myName{
	print("My name is \(name)")
} else {
	print("My Name == nil")
}
// myName == nil

myName.isEmpty // ์˜ค๋ฅ˜ !!

 

์˜ต์…”๋„์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๊ฐ•์ œ์ถ”์ถœ ๋˜๋Š” ์•”์‹œ์  ์ถ”์ถœ ์˜ต์…”๋„์„ ์‚ฌ์šฉํ•˜๊ธฐ๋ณด๋‹ค๋Š”

์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ, nil ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž๋ฅผ ๋น„๋กฏํ•ด ๋’ค์—์„œ ๋ฐฐ์šธ ์˜ต์…”๋„ ์ฒด์ด๋‹ ๋“ฑ์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์•ˆ์ „ํ•˜๋‹ค. 

 

์š”์•ฝ

์˜ต์…”๋„ : ๊ฐ’์ด ์žˆ์„์ˆ˜๋„์žˆ๊ณ , ์—†์„์ˆ˜๋„ ์žˆ๋Š” ์„ ํƒ์ ์ธ ๊ฒƒ

  • ์˜ต์…”๋„ ๋ณ€์ˆ˜/์ƒ์ˆ˜๋งŒ ์˜ต์…”๋„ ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜๋‹ค
  • ๋งŒ์•ฝ API์‚ฌ์šฉ์‹œ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์˜ต์…”๋„์ผ๋•Œ๋Š” '๋งค๊ฐœ๋ณ€์ˆ˜์—๋Š” ๊ฐ’์ด ์—†์–ด๋„ ๋˜๋Š”๊ตฌ๋‚˜' ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

์˜ต์…”๋„ ์ถ”์ถœ

1) ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ : nil ์ฒดํฌ + ์•ˆ์ „ํ•œ ๊ฐ’ ์ถ”์ถœ

     -> if๋ฌธ์„ ํ™œ์šฉํ•˜์—ฌ ์˜ต์…”๋„์— ํ• ๋‹น๋œ ๊ฐ’์„ ์ž„์‹œ๋ณ€์ˆ˜/์ƒ์ˆ˜์— ํ• ๋‹นํ•˜๋Š” ๋ฐฉ์‹

2) ๊ฐ•์ œ์ถ”์ถœ : ! ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ•์ œ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ง€์–‘ํ•˜๋Š” ๋ฐฉ์‹