Jiseob Kim

iOS Developer

Swift - ์ผ๊ธ‰ ๊ฐ์ฒด

04 Oct 2021 » Swift


์˜ค๋Š˜ ์ •๋ฆฌํ•  ๋‚ด์šฉ์€ ์ผ๊ธ‰ ๊ฐ์ฒด์— ๊ด€ํ•ด์„œ์ด๋‹ค.


์˜์–ด๋กœ๋Š” First Class Citizen๋ผ๊ณ  ํ•˜๋Š”๋ฐ,

์ด๋Š” ํƒœ๊ทธ ๊ฐ™์€ ๊ฐœ๋…์œผ๋กœ ์ƒ๊ฐํ•˜์ž.

์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฐ์ฒด๋“ค์— ๋Œ€ํ•ด์„œ

โ€˜๋„ˆ๋Š” ์ผ๊ธ‰๊ฐ์ฒด์•ผโ€™ ๋ผ๊ณ  ํƒœ๊ทธ๋ฅผ ๋ถ™์—ฌ์ค€๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ข‹๋‹ค.

Citizen ๋Œ€์‹  object, type, value ๋“ฑ๋“ฑ ๋‹ค์–‘ํ•˜๊ฒŒ ๋ถˆ๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.



์ผ๊ธ‰ ๊ฐ์ฒด์˜ ์กฐ๊ฑด


์ฒซ์งธ, ๋ณ€์ˆ˜ ๋˜๋Š” ์ƒ์ˆ˜๋กœ ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋‘˜์งธ, ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์…‹์งธ, ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.


๋”ฑ ์ฝ์—ˆ์„ ๋•Œ ๋“ค์—ˆ๋˜ ์ƒ๊ฐ์€ ์ผ๋ฐ˜์ ์œผ๋กœ Int๋‚˜ Class ๋“ฑ๋“ฑ ์ฒ˜๋Ÿผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋˜๊ฑฐ๋„ค? ์‹ถ์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ด ๋งŽ์ด ๋ณธ ์ž๋ฃŒํ˜•๋“ค ๊ฐ€์ง€๊ณค ๋”ฐ๋กœ ์ผ๊ธ‰ ๊ฐ์ฒด๋ž€ ์ฃผ์ œ๋กœ ํฌ์ŠคํŒ…์ด ๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™๋‹ค.


๊ทธ๋ ‡์ง€๋งŒ ํ•จ์ˆ˜๊ฐ€ ์ผ๊ธ‰ ๊ฐ์ฒด ์กฐ๊ฑด์„ ๋งŒ์กฑํ•œ๋‹ค๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๊ธ€์€ ๋„˜์ณ๋‚ ๊นŒ?

๋‹น์—ฐํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๊ฒ ์ง€?

๊ทธ๊ฒŒ ๊ฐ€๋Šฅํ•œ ์–ธ์–ด๊ฐ€ ์žˆ๊ณ  ์•„๋‹Œ ์–ธ์–ด๋“ค์ด ์žˆ๋Š”๋ฐ,

์Šค์œ„ํ”„ํŠธ๋Š” ์ด๋ฅผ ๋งŒ์กฑํ•˜๊ธฐ๋•Œ๋ฌธ์— ํฌ์ŠคํŒ…๋“ค์ด ๋งŽ์ด ๋˜๋‚˜๋ณด๋‹ค.


๋˜ํ•œ, ํ•จ์ˆ˜๊ฐ€ ์ผ๊ธ‰ ๊ฐ์ฒด๋กœ์จ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด

๊ทธ ์–ธ์–ด๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋ผ๊ณ ๋„ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋‹ค


๋งŒ์กฑ์„ ํ•œ๋‹ค๋Š”๊ฑด ์•Œ์•˜์œผ๋‹ˆ ์–ด๋–ป๊ฒŒ ์“ฐ์ผ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด์ž.



์ฒซ์งธ, ๋ณ€์ˆ˜ ๋˜๋Š” ์ƒ์ˆ˜๋กœ ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜๋‹ค.


์šฐ์„ , ์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜๋ฅผ ๋ณด์ž.

func hellowFunction() -> String {
    return "์•ˆ๋…•?"
}

์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ๋‹ค.


์ด๊ฒƒ์„ ์‚ฌ์šฉํ• ๋•Œ ์ด๋ ‡๊ฒŒ ์“ด๋‹ค.

let a = hellowFunction()

๊ทธ๋Ÿฌ๋ฉด a์—๋Š” Return๊ฐ’์ธ "์•ˆ๋…•?"์ด ์ €์žฅ๋œ๋‹ค.


์ด๊ฒƒ์€ ์‚ฌ์šฉ์ด๋‹ค. ์‚ฌ์šฉ์˜ ํฌ์ธํŠธ๋Š” ํ•จ์ˆ˜๋ช… + ์†Œ๊ด„ํ˜ธ์ด๋‹ค.

๋’ค์— ์†Œ๊ด„ํ˜ธ ๋ถ€๋ถ„์ด ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ๋‹ค.


๊ทธ๋ ‡๋‹ค๋ฉด ํ• ๋‹น์€ ๊ฐ„๋‹จํ•˜๋‹ค. ์‚ฌ์šฉ์„ ์˜๋ฏธํ•˜๋Š” ์†Œ๊ด„ํ˜ธ๋ฅผ ์ œ๊ฑฐํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

let b = hellowFunction


a์™€ b์— ๋Œ€ํ•ด ์ถœ๋ ฅ์„ ํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜์˜จ๋‹ค.

print(a)
print(b)

---- ์ฝ˜์†”์ฐฝ
์•ˆ๋…•?
(Function)

์•„์ฃผ ์นœ์ ˆํ•˜๊ฒŒ โ€œb๋Š” ํ•จ์ˆ˜์•ผโ€ ๋ผ๊ณ  ๋งํ•ด์ค€๋‹ค.


๊ทธ๋Ÿผ, ์ด๊ฒƒ์„ ๋‹ค์‹œ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด?

์œ„์— ๋งํ–ˆ๋˜ ์†Œ๊ด„ํ˜ธ๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด ๋œ๋‹ค.


๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ํ•œ๋ฒˆ 3๊ฐ€์ง€ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์ถœ๋ ฅ์„ ํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

let a = hellowFunction()
let b = hellowFunction
let c = b()

print(a)
print(b)
print(c)

---- ์ฝ˜์†”์ฐฝ
์•ˆ๋…•?
(Function)
์•ˆ๋…•?



๋‘˜์งธ, ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.


ํ•จ์ˆ˜์— ์ž…๋ ฅ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ•จ์ˆ˜๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์ด๋‹ˆ๊น, ์ƒ๊ธด๊ฑด ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ๋‹ค.

func useParameter(function: ()->()) {
    // ์‚ฌ์šฉ์€ ์–ด๋–ป๊ฒŒ? ์†Œ๊ด„ํ˜ธ ๋ถ™์—ฌ์„œ!
    function()
}

๋ณดํ†ต ๊ฐ™์•˜์œผ๋ฉด String, Int ๊ฐ™์€ ๊ฒƒ๋“ค์ด ๋“ค์–ด ๊ฐˆ ์ž๋ฆฌ์—

ํ•จ์ˆ˜ ๋’ท๋ถ€๋ถ„์— ๋ถ™์„๋งŒํ•œ ๊ฒƒ๋“ค์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ์„œ ๋“ค์–ด๊ฐ€์žˆ๋‹ค.

์‚ฌ์šฉ๋ฒ•์€ ์ฃผ์„๊ณผ ๊ฐ™์ด ์†Œ๊ด„ํ˜ธ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•ด์ฃผ๋ฉด ๋˜๋Š” ๊ฑฐ๊ณ 

์ด ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์— ๋Œ€ํ•ด์„œ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

useParameter(function: hellowFunction)


hellowFunction์€ ๋ถ„๋ช…ํžˆ ํ•จ์ˆ˜์˜€๊ณ , ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋“ค์–ด๊ฐ”๋‹ค.

๊ทธ๋ฆฌ๊ณ  useParameter ํ•จ์ˆ˜์—์„œ ๋ฐ›์€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ ํ–ˆ๊ธฐ๋•Œ๋ฌธ์—

์ฝ˜์†”์ฐฝ์— ์—ญ์‹œ๋‚˜ "์•ˆ๋…•?"์ด ์ฐํžˆ๊ฒŒ ๋œ๋‹ค.


์ด ๊ฐ™์€ ๊ฒฝ์šฐ๋ฅผ ๋„๋Œ€์ฒด ์–ธ์ œ ์“ฐ๊ฒŒ ๋ ์ง€๋ฅผ ๊ณ ๋ฏผํ•ด๋ณด๋ฉด ์ข‹๋‹ค.

ํ•จ์ˆ˜๋ผ๋Š” ๊ฒƒ์€ ๊ฒฐ๊ตญ์˜ ํ•˜๋‚˜์˜ ๋กœ์ง์ด๋‹ค.

ํ•จ์ˆ˜ ๋‚ด์—์„œ ์–ด๋–ค ์ถ”๊ฐ€์ ์ธ ๋กœ์ง์„ ํ•˜๊ณ  ์‹ถ์„๋•Œ, ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ์จ ๋ฐ›์œผ๋ฉด ์ข‹๋‹ค.


๋‹จ์ˆœํ•˜๊ฒŒ ์ƒ๊ฐํ•ด์„œ โ€œ๊ทธ๋ƒฅ,,, ์ถ”๊ฐ€์ ์œผ๋กœ ์“ฐ๊ณ  ์‹ถ์œผ๋ฉด ํ•จ์ˆ˜์—์„œ ํ˜ธ์ถœํ•˜๋ฉด ๋˜์ž๋‚˜?โ€

๋ผ๊ณ  ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค๋ฉด, ์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ•ด๋ณด์ž


ํ•จ์ˆ˜A๋‚ด์—์„œ ํŠน์ • ํ•จ์ˆ˜๋ช…B์„ ๋„ฃ์–ด๋ฒ„๋ฆฐ๋‹ค๋ฉด, ํ•จ์ˆ˜A๋Š” ํ•จ์ˆ˜B์— ๋งž์ถคํ˜•์ด ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค.

์ฆ‰, ๋‹ค๋ฅธ ํ•จ์ˆ˜ C,D,E ๋™์ž‘์— ๋Œ€ํ•ด์„œ๋„ ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์ฒ˜ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ๋งค๋ ฅ ํฌ์ธํŠธ!

์ด๋ถ€๋ถ„์€ SOLID ์›์น™์ค‘ OCP๋ฅผ ๋– ์˜ฌ๋ฆฌ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

ํ™•์žฅ์—๋Š” ์—ด๋ ค(open)์žˆ๊ณ , ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€(closed)์žˆ๋„๋ก ํ•ด๋ผ!!



์…‹์งธ, ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.


๊ณ ๋ฏผ์„ ํ•ด๋ณด์•˜๋‹ค.

func returnFunction() -> ()->() {
    return hellowFunction
}

์ด๋ผ ํ•˜๊ณ  ๋! ์ด๋ผ ํ•˜๋ฉด ๋„ˆ๋ฌด ์„ฑ์˜ ์—†์„ ๊ฑฐ ๊ฐ™์•˜๋‹ค.


๊ทธ๋ž˜์„œ ํ•จ์ˆ˜ ๋‘๊ฐœ ์ค€๋น„

// 1. ๋”ํ•˜๊ธฐ
func add(x: Int, y: Int) -> Int {
    return x + y
}

// 2. ๋นผ๊ธฐ
func sub(x: Int, y: Int) -> Int {
    return x - y
}

ํ•˜๋‚˜๋Š” ๋”ํ•˜๊ธฐ ํ•˜๋Š” ํ•จ์ˆ˜, ํ•˜๋‚˜๋Š” ๋นผ๊ธฐํ•˜๋Š” ํ•จ์ˆ˜๋‹ค.

๊ณตํ†ต์ ์€ ๋‘๊ฐœ์˜ Int ์ธ์ž๋ฅผ ๋ฐ›๊ณ  ํ•˜๋‚˜์˜ Int๋กœ ๋ฆฌํ„ด์„ ํ•ด์ค€๋‹ค.


์ž ์ด์ œ ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ณด์ž

func getFunction(operation: String) -> (Int,Int) -> Int {
    switch operation {
    case "+":
        return add
    case "-":
        return sub
    default:
        fatalError()
    }
}

์•„์•„์ฃผ ๊ฐ„๋‹จํ•˜๋‹ค +๋ฅผ ์ธ์ž๋กœ ๋„ฃ์œผ๋ฉด ๋”ํ•˜๊ธฐ ํ•จ์ˆ˜๋ฅผ ๋ฑ‰๊ณ  -๋ฅผ ์ธ์ž๋กœ ๋„ฃ์œผ๋ฉด ๋นผ๊ธฐ ํ•จ์ˆ˜๋ฅผ ๋ฑ‰๋Š”๋‹ค.


๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž

var cal = getFunction(operation: "+")
print(cal(1,2))

cal = getFunction(operation: "-")
print(cal(5,1))

--- ์ฝ˜์†”์ฐฝ
3
4


์ด๋ ‡๊ฒŒํ•˜๊ฒŒ ๋˜๋ฉด ๋‘ ๊ฐ’์„ ์ธ์ž๋กœ ๋ฐ›๊ณ  ํ•˜๋‚˜์˜ ๊ฐ’์„ ๋ฑ‰์–ด์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.

ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋ช…์„ ๊ฐ–๊ณ  ์žˆ์ง€๋งŒ ์„œ๋กœ ๋‹ค๋ฅธ ์—ญํ• ์„ ํ•œ๋‹ค.


์˜ˆ์‹œ๋กœ ๊ณ„์‚ฐ๊ธฐ์— +, -์™€ ๊ฐ™์€ ๋ฒ„ํŠผ์ด ๋ˆŒ๋ ธ์„ ๋•Œ,

๋™์ž‘ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฑ‰์–ด์ฃผ๊ฒŒํ•˜๊ณ ,

์‹ค์ œ๋กœ ์—ฐ์‚ฐ์„ ํ• ๋•Œ๋Š” ํ•œ๊ฐ€์ง€ ํ•จ์ˆ˜ ํƒ€์ž…์˜ ๋ณ€์ˆ˜๋กœ ๋Œ๋ ค์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.


์Œ ๋งŒ์กฑ์Šค๋Ÿฐ ์˜ˆ์ œ์•ผ

์ƒ๊ฐํ•˜๊ณ ๋ณด๋‹ˆ ์–ด๋””์„œ ๋ณธ ์˜ˆ์ œ๊ฐ™๊ธฐ๋„ํ•˜๊ณ ,, ๊ณต์‹ ๋ฌธ์„œ์— ์žˆ์—ˆ๋‚˜..



๋งˆ๋ฌด๋ฆฌ

์•„๋ฌดํŠผ ์ด๋ ‡๊ฒŒํ•ด์„œ ์ผ๊ธ‰ ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๋‹ค.

์‚ฌ์‹ค 3๊ฐ€์ง€ ์กฐ๊ฑด์™ธ์—๋„ ๋”์žˆ๋‹ค. ๋Ÿฐํƒ€์ž„์‹œ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•ด์•ผํ•œ๋‹ค๋Š๋‹ˆ, ๋น„๊ต ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•ด์•ผํ•œ๋‹ค๋Š๋‹ˆ,,,

๊ทผ๋ฐ ๋Ÿฐํƒ€์ž„์‹œ ์กฐ๊ฑด์€ ์œ„ํ‚ค์—๋„ ๋‚˜์™”์ง€๋งŒ ๊ทธ๋Ÿฐ ์กฐ๊ฑด์„ ๋งํ•˜๊ธฐ๋„ ํ•œ๋‹ค!

๋ผ๊ณ  ํ•ด์„œ ์ œ์™ธ ์‹œ์ผฐ๊ณ ,

๋น„๊ต ์—ฐ์‚ฐ ๊ฐ™์€ ๊ฒฝ์šฐ Swift์—์„  ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•˜์—ฌ์„œ ์ œ์™ธํ•˜์˜€๋‹ค.


์‚ฌ์‹ค ์ด๊ฒƒ์ด ๋‚˜๋ฅผ ๋” ํ—ท๊ฐˆ๋ฆฌ๊ฒŒ ๋งŒ๋“ ๊ฑด ํด๋กœ์ € ๋•Œ๋ฌธ์ด๋ผ

๋‹ค์Œ ํฌ์ŠคํŒ…์€ ํด๋กœ์ €๋ฅผ ํ•˜๊ณ 

๊ทธ ๋‹ค์Œ ํฌ์ŠคํŒ…์€ ํด๋กœ์ €์™€ ์ผ๊ธ‰๊ฐ์ฒด๋กœ ํ•ด์•ผ๊ฒ ๋‹ค.


๋.