โป ๋ณธ ํฌ์คํ ์ ์ ํ๋ธ Swift Programming Tutorial ๊ฐ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ๊ฐ ์ง์ ์ ๋ฆฌํ Swift ๋ฌธ๋ฒ์ ๋ํ ๊ธ์ ๋๋ค.
Swift์ ๋ํด ์ฒ์ ๋ฐฐ์๋๊ฐ๋ ๊ณผ์ ์ ๋ธ๋ก๊ทธ์ ์ ๋ฆฌํ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ๋ค๋ฃฌ ์ ์ด ์๊ธฐ์ ์ ๊ฐ ์๋ ๋ถ๋ถ์ ์๋ต๋ ์ ์์ต๋๋ค. ์ต๋ํ ํ๋ฆฐ ๋ถ๋ถ์ด ์์ง ์๊ฒ ์ ๊ฒ ์ง๋ง ํน์ ์๋ชป๋ ๋ถ๋ถ์ด ์์ผ๋ฉด ์๋ ค์ฃผ์ธ์!
< Operators >
Operators(์ฐ์ฐ์)๋ ๊ฐ์ ์กฐ์ํ๊ฑฐ๋ ํํ์์ ํ๊ฐํ๋ ๋ฐ ์ฌ์ฉํ๋ ๊ธฐํธ๋ ๊ธฐ๋ฅ์ ๋๋ค. ํด๋น ๊ฐ์์์๋ Swift์ 3๊ฐ์ง ๋ค๋ฅธ ํ์ ์ operators์ ๋ํด ์ค๋ช ํ์ต๋๋ค.
1. Unary Prefix Operator(๋จํญ ์ ์ ์ฐ์ฐ์)
: ์ด ์ฐ์ฐ์๋ ํ๋์ ํผ์ฐ์ฐ์๋ฅผ ๊ฐ์ง๋ฉฐ ํผ์ฐ์ฐ์ ์์ ์์นํฉ๋๋ค.
let foo = !true
ํด๋น ์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ! ๊ฐ unary prefix operator๋ก ์ฌ์ฉ๋์์ต๋๋ค. ๋ ผ๋ฆฌ๋ถ์ ํ๋ ์ฐ์ฐ์์ด๊ธฐ์ !true๋ false๋ก !false๋ true๋ก ๋ง๋ค์ด์ค๋๋ค.
2. Unary Postfix Operator(๋จํญ ํ์ ์ฐ์ฐ์)
: ์ด ์ฐ์ฐ์๋ ํ๋์ ํผ์ฐ์ฐ์๋ฅผ ๊ฐ์ง๋ฉฐ ํผ์ฐ์ฐ์ ๋ค์ ์์นํฉ๋๋ค.
ํด๋น ์ฐ์ฐ์๋ Swift์์๋ ๋๋ฌผ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค. ํ์ง๋ง ์์๋ก ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ `x++`๋ฅผ ์๊ฐํด๋ณด์๋ฉด ๊ทธ๋ ++๊ฐ unary postfix operator์์ ์ ์ ์์ต๋๋ค. ์ค์ํํธ ์์์์ ์์๋ ์๋์ ๊ฐ์ต๋๋ค.
let name = Optional("Vandad")
type(of: name) // Optional<String>.Type
let unaryPostFix = name!
type(of: unaryPostFix) //String.Type
์์ง Optional ์ ๋ํด ๋ฐฐ์ฐ์ง ์์์ง๋ง ์์๋ก๋ง ์ ๊ทผํด ๋ณด๊ฒ ์ต๋๋ค.
Swift์์ Optional์ ๊ฐ์ด ์์ ์๋ ์์ ์๋ ์๋ ์ํฉ์ ๋ค๋ฃจ๋ ํ์ ์ ๋๋ค. `name`๋ณ์๋ ์ต์ ๋ ํ์ ์ธ `Optional<String>`ํ์ ์ผ๋ก ์ ์ธ๋์ด ์์ต๋๋ค.
์ต์ ๋ ํ์ ์ ๊ฐ์ ์ ๊ทผํ๊ธฐ ์ํด์๋ unary postfix operator์ธ `!`๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. `name!`์ ํํ๋ก ์ฌ์ฉ๋ `!`๋ ํด๋น ์ต์ ๋ ๊ฐ์ ๊ฐ์ ๋ก unrapping ํ๋ ์ญํ ์ ํฉ๋๋ค. ์ด๋ ์ต์ ๋ ๊ฐ์์ ๋ด๋ถ์ ์ ์ฅ๋ ์ค์ ๊ฐ์ ์ ๊ทผํ์ฌ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ดํ Optional ๊ด๋ จ ๋ด์ฉ์ ๋ฐฐ์ธ ๋ ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค. ์ฌ๊ธฐ์๋ unary postfix operator๋ก `!`๊ฐ ์ฌ์ฉ๋ ์์ ๋ง ๋ณด๊ณ ๋์ด๊ฐ๊ฒ ์ต๋๋ค.
3. Binary Infix Operator(์ดํญ ์ค์ ์ฐ์ฐ์)
์ด ์ฐ์ฐ์๋ ๋ ๊ฐ์ ํผ์ฐ์ฐ์๋ฅผ ๊ฐ์ง๋ฉฐ ํผ์ฐ์ฐ์๋ค ์ฌ์ด์ ์์นํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์๋ ํํ ์ฐ์ฐ์ ๋๋ถ๋ถ์ด ์ด ํ์ ์ ์ํฉ๋๋ค.
let result = 1 + 2
let names = "Foo" + " " + "Bar"
์์ ์์ ์ ๊ฐ์ด `+`, `>`, `<`, `==` ๋ฑ๊ณผ ๊ฐ์ ์ฐ์ฐ์๋ค์ด ์์ต๋๋ค.
ํท๊ฐ๋ฆด ์ ์๋๊ฑด ๋ ๋ฒ์งธ ์ค ์ฝ๋๋ฅผ ๋ณด๋ฉด ํผ์ฐ์ฐ์๊ฐ 3๊ฐ ์์ด์ ์ฐ์ฐ์๊ฐ infix๊ฐ ๋ ์ํ๊ฐ ๋ง๋ ์ถ์ ์ ์์ต๋๋ค. ํ์ง๋ง ์ด ๊ฒฝ์ฐ ์ปดํจํฐ๋ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฝ๊ธฐ ๋๋ฌธ์ "Foo" + " "๋ฅผ ๋จผ์ ์งํ ํ, ํด๋น ๊ฒฐ๊ณผ๊ฐ๊ณผ + "Bar"์ ์งํํ๋ค๊ณ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค. ์ผ -> ์ค ์ ์์๋ ์ฐ์ฐ์์ ์ฐ์ ์์์ ๊ฒฐํฉ๋ฐฉํฅ์ ๋ฐ๋ผ ์์๊ฐ ๋ฐ๋ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ์ ์ฐ์ฐ์์ ์ฐ์ ์์๋ฅผ ํ์ ํ๊ณ , ๊ดํธ๋ฅผ ์ ์ ํ ์ฌ์ฉํด ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
** Ternary Operator(์ผํญ ์กฐ๊ฑด ์ฐ์ฐ์)**
ํด๋น ์ฐ์ฐ์๋ ์์ ๋งํ ์ธ๊ฐ์ง ์นดํ ๊ณ ๋ฆฌ๋ ๋ ๋ค๋ฅธ operator์ ๋๋ค. ์ด์ ๋ํด์๋ ์๊ฒฌ์ด ๋ถ๋ถํ๋ฐ ๋ง์ฝ ํ์ผ๋ก ์ผํ๊ฒ ๋๋ค๋ฉด ํจ๊ปํ๋ ์ฌ๋๋ค๊ณผ ternary operator ์ฌ์ฉ์ ๋ํ ํ์ฉ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ ํ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
let message = CONDITION ? VALUE IF CONDITION IS MET : VALUE IF CONDITION IS NOT MET
Ternary operator๋ ์์ ๊ฐ์ ๋ฌธ๋ฒ์ ๊ฐ์ต๋๋ค. `์กฐ๊ฑด ? ์ฐธ์ผ ๋ ๊ฐ : ๊ฑฐ์ง์ผ ๋ ๊ฐ`์ผ๋ก ํํํ ์ ์์ต๋๋ค.
let age = 17
let message: String
if age >= 19 {
message = "You are an adult"
} else {
message = "You are not yet an adult"
}
message
์ค์ ๋ก ternary operator๋ฅผ ์ฌ์ฉํ์ง ์๊ณ if๋ฌธ์ผ๋ก ์ ์๋ค๋ฉด ํจ์ฌ ์ฝ๋๋ฅผ ๊ธธ๊ฒ ์์ฑํด์ผ ํฉ๋๋ค. ํ์ง๋ง ๋๊ฐ์ ์์ ternary operator๋ฅผ ์ฌ์ฉํ๋ฉด ์๋์ ๊ฐ์ด ํํํ ์ ์์ต๋๋ค.
let message = age >= 19
? "You are an adult"
: "You are not yet an adult"
Ternary operator๋ ์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ํ ์ค๋ก ์์ฑ ์ ํท๊ฐ๋ฆด ์ ์๊ธฐ์ ์ฝ๋๋ฅผ ์ค์ ๋๋์ด ์ ์ผ๋ฉด ๊ฐ๋ ์ฑ์ด ์ฌ๋ผ๊ฐ๋๋ค. ์ด์ฒ๋ผ ternary operator๋ ๊ฐ๊ฒฐํ๊ฒ ์กฐ๊ฑด์ ๋ฐ๋ผ ๊ฐ์ ์ ํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ง ๋ณต์กํ ์กฐ๊ฑด์ด๋ ๊ธด ์์ ๋ค๋ฃจ๋ ๊ฒฝ์ฐ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง ์ ์์ผ๋ฏ๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
< If-else >
If-else๋ฌธ, ์ฆ ์กฐ๊ฑด๋ฌธ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. ๋ฐ๋ก ์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
let myName = "Vandad"
let myAge = 20
let yourName = "Foo"
let yourAge = 19
if myName == "vandad" {
"Your name is \(myName)"
} else {
"Oops, I guessed it wrong"
}
//result: "Oops, I guessed it wrong"
ํด๋น ์ฝ๋๋ฅผ ๋ณด์๋ฉด if ๋ค์์ condition์ธ ์กฐ๊ฑด์ ์ ๊ณ { } ์ค๊ดํธ ์์ ํด๋น ์กฐ๊ฑด์ด ์ฐธ์ผ ๋ ์ํํ๋ ์ฝ๋๋ฅผ ์ ์ต๋๋ค. ์ด์ ๋ํด์๋ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์๋ ๋ง์ด ์ ํ์ผ๋ฆฌ๋ผ ์๊ฐํ๊ณ ๋์ด๊ฐ๊ฒ ์ต๋๋ค.
์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๊ฒฐ๊ณผ๋ else ๋ธ๋ก์ด ์คํ๋์์ต๋๋ค. Swift๋ ์๋ฌธ์ ๋๋ฌธ์๋ ์ฒ ์ ํ ๊ตฌ๋ณํ๊ธฐ ๋๋ฌธ์ "Vandad"์ผ ๊ฒฝ์ฐ๋ง true๊ฐ ๋๊ณ "vandad"๋ False๊ฐ ๋ฉ๋๋ค.
else ๋ธ๋ก์ ์ ํ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฅ if statement๋ง ์ฌ์ฉํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค.
if, else ์ธ์๋ ์ค๊ฐ์ else if ๋ธ๋ก์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
if myName == "Vandad" {
"Now I guessed it correctly"
} else if myName == "Foo" {
"Are you foo?"
} else {
"Okay I give up"
}
// result: "Now I guessed it correctly"
์ด๋ if ๋ธ๋ก / else if ๋ธ๋ก / else ๋ธ๋ก์ ๊ฐ๊ฐ ๋ค๋ฅธ branch๋ผ๊ณ ์๊ฐํด์ผํฉ๋๋ค. ๋ค์ ์ค๋ช ํ์๋ฉด, ์ด ๋ธ๋ก๋ค์ ๋์ํด ์คํ๋๋ ๊ฒ์ด ์๋๋ผ๋ ๋ป์ ๋๋ค. ์กฐ๊ฑด๋ฌธ์ ์ฐ์ ์์์ ๋ฐ๋ผ ์ฒซ ๋ฒ์งธ if์กฐ๊ฑด๋ฌธ์ด ์ฐธ์ด ๋๋ค๋ฉด ์ดํ else if๋ธ๋ก๊ณผ else๋ ํ๊ฐํ์ง ์๊ณ ๋ฌด์ํ๊ฒ ๋ฉ๋๋ค.
์กฐ๊ฑด๋ฌธ์ ์ฐ์ ์์๊ฐ ์์ผ๋ฉฐ ์ด๋ค์ ๋์์ฑ์ ๊ฐ์ง์ง ์๊ณ ์์ฐจ์ ์ผ๋ก ์ผ์ด๋ฉ๋๋ค. ๋ํ ์์ฐจ์ ์ผ๋ก ์ผ์ด๋๋ ๊ณผ์ ์์ ์กฐ๊ฑด์ด ์ฐธ์ผ๋ก ์ถฉ์กฑํด ํด๋น ๋ธ๋ก์ด ์คํ๋๋ฉด ๋ค์ else๊ฐ ๋ช๊ฐ์ด๋ ๋ฌด์๋๋ค๋ ์ฌ์ค์ ์์ง ๋ง์์ผ ํฉ๋๋ค.
์๋ ์ฝ๋์ ๊ฐ์ด condition์ ์ ์ ๋ ๊ฑฐ๊พธ๋ก ์ ์ด๋ ๋ฌธ์ ๋ ๋์ง ์์ต๋๋ค.
if "Vandad" == myName {
"An uncommon way of doing this"
}
์ต๊ทผ์๋ ์ด๋ฐ ๋ฐฉ์์ผ๋ก ์์ฑํ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ฌผ์ง๋ง ํด๋น ์กฐ๊ฑด๋ฌธ๋ ๋ฌธ๋ฒ์ ์ค๋ฅ๊ฐ ์๋๋ผ๋ ์ ์ ์์๋ ํ์๊ฐ ์์ต๋๋ค. ํ์ง๋ง Swift๋ฅผ ์ฒ์ ๋ฐฐ์ฐ์๋ ๋ถ๋ค์ด๋ผ๋ฉด ๊ถ์ฅํ์ง ์๋ ๋ฐฉ์์ ๋๋ค.
if myAge == 20 || myName == "Foo" {
"Either age is 20, name is Foo or both"
} else if myName == "Vandad" || myAge == 20 {
"It's too late to get in this clause"
}
// result : "Either age is 20, name is Foo or both"
์์ ์ฝ๋์์ ์ฒดํฌํด์ผ ํ ๋ถ๋ถ์ &&(and)์ฐ์ฐ์์ ||(or) ์ฐ์ฐ์์ ๋๋ค. ํนํ || ์ฐ์ฐ์์ ๊ฒฝ์ฐ ๋ ์ค ํ๋๋ง ์ ํด๋นํ๋ ๊ฒ ์๋๋ผ ๋ ๋ค ์ฐธ์ด์ด๋ ์ฐธ์ด ๋๋ค๋ ๊ฒ์ ์ฃผ์ํด์ผ ํฉ๋๋ค.
๋ง์ฝ ๊ดํธ๋ฅผ ์ฌ์ฉํ์ง ์์ ์ฑ๋ก &&๋ ||๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ค์๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
if myName == "Vandad"
&& myAge == 22
&& yourName == "Foo"
|| yourAge == 19 {
"MY name is Vandad and I'm 22 and you name is Foo ...OR...you are 19"
}
// result: "MY name is Vandad and I'm 22 and you name is Foo ...OR...you are 19"
์์ ์์์ฒ๋ผ ๊ดํธ๋ฅผ ์ ํ๋ฉด Swift๋ ํด๋น ์กฐ๊ฑด๋ฌธ์ true๋ผ๊ณ ์๊ฐํฉ๋๋ค. myAge๋ 20์ธ๋ฐ๋ 22๊ฐ ์ฌ์ค๋ก ์ทจ๊ธ๋ฉ๋๋ค.
์ฌ๊ธฐ์ ( A && B && C ) || ( D ) ์ ๊ฐ์ ์์๋ก Swift๋ ํ๋จํ ๊ฒ๋๋ค. ์๋ ์๋๋ ( A && B ) && ( C || D ) ์์ง๋ง์. ๋ ์ฐ์ฐ์์ precedence(์ฐ์ ์์)๊ฐ ๋๊ฐ๊ธฐ์ ์ปดํจํฐ๋ left to right ์์๋๋ก ํด์ํ ๊ฒ์ ๋๋ค. ์๋ ์๋๋๋ก ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์ด๋ ๊ฒ ์ ์ ์ ์์ต๋๋ค.
if (myName == "Vandad"
&& myAge == 22)
&&
(yourName == "Foo"
|| yourAge == 19) {
"My name is Vandad and I'm 22... AND... your name is Foo or you are 19"
} else {
"Hmmm, that didn't work so well"
}
// result : "Hmmm, that didn't work so well"
์์ ์ฝ๋์ฒ๋ผ ์ฝ๋๋ฅผ ํ ์ค์ ์ ๋ ๊ฒ ์๋๋ผ ๊ดํธ๋ณ๋ก ๋ถ๋ฆฌํด์ ์ ์ผ๋ฉด ๊ฐ๋ ์ฑ๋ ํธํด์ง๊ณ ํท๊ฐ๋ฆฌ์ง ์๊ฒ ์์ฑํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ๊น์ง Operators์ If-else statements์ ๋ํ ์ ๋ฆฌ์์ต๋๋ค. ๋ค์ Swift ํธ์ function์ ๋ํ ์ด์ผ๊ธฐ๋ก ๋์์ค๊ฒ ์ต๋๋ค.
๊ฐ์๋ freeCodeCamp ์ฑ๋์ ์์์ธ๋ฐ, Vandad๋ผ๋ ๋ถ์ด ์งํํ๋ 7์๊ฐ ๋ถ๋์ full tutorial for beginners์ ๋๋ค. ํด๋น ๊ฐ์๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ Swift๋ก ์ฒ์ ์ ํ๋ ์ฌ๋๋ค์๊ฒ๋ ๋ค์ ์ด๋ ค์ธ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ๋ ๊ธฐ์ด์ ์ธ ๋ถ๋ถ์ ๋ํ ์ผํ ์ค์์ฑ์ ๊น๊ฒ ์๋ ค์ฃผ๋ ๊ฒ ๊ฐ์์ ๊ฐ์๋ฅผ ํํ์ต๋๋ค. ์์ด ๊ฐ์์ด๋ฉฐ ์์ด์๋ง ๋๋ ์๋๋ฒ์ญ ๊ธฐ๋ฅ์ด ์ ๊ณต๋๊ธฐ์, ํน์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ๋ค๋ฃฌ ์ ์ด ์๋ ๋ถ๋ค ์ค Swift์ ๋ํด ์๋กญ๊ฒ ๋ฐฐ์ฐ๊ณ ์ ํ๋ค๋ฉด ๊ฐ์ถ๋๋ฆฝ๋๋ค!
ํด๋น ๊ฐ์ ์์์ ์๋์ ๊ฑธ์ด๋๊ฒ ์ต๋๋ค. ํน์ ํ๋ฆฐ ๋ถ๋ถ์ด๋ ์ถ๊ฐํ๊ณ ์ถ์ ๋ถ๋ถ์ด ์์ผ๋ฉด ์๋ ค์ฃผ์ธ์.
๊ฐ์ ์ ์ฒด๋ฅผ ์๋ฆฌ์ฆ๋ก ์ ์ ์ ์๋๋ก ๋ ธ๋ ฅํ๊ฒ ์ต๋๋ค.
<์ด์ ๊ธ>
2023.05.08 - [TIL/Swift] - [Swift] Swift ๊ธฐ๋ณธ ๋ฌธ๋ฒ ์ ๋ฆฌ 1. Variables