Deep_Dev
article thumbnail

 

 ์ œ๋„ค๋ฆญ 

 

 ์ œ๋„ค๋ฆญ์ด๋ž€ ? 

ํƒ€์ž…์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ๋ฒ”์šฉ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ ํ•  ๋•Œ๋งˆ๋‹ค ์‚ฌ์šฉํ•œ๋‹ค.

์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ค‘๋ณต์„ ํ”ผํ•˜๊ณ , ์ฝ”๋“œ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

Apple์— ์˜ํ•˜๋ฉด Swift์—์„œ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ, Swift ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋Œ€๋‹ค์ˆ˜๋Š” ์ œ๋„ค๋ฆญ์œผ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด Array, Dictionary ๋˜ํ•œ ์ œ๋„ค๋ฆญํƒ€์ž…์ด๋‹ค.

 

 

์ œ๋„ค๋ฆญ ํ•จ์ˆ˜

๋‘๊ฐœ์˜ ์ธ์ž๋ฅผ ๋ฐ›์•„ Intํƒ€์ž…์˜ ๊ฐ’์„ swapํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด,

func swapTwoInts(_ a: inout Int, _ b: inout Int) {
    let tempA = a
    a = b
    b = tempA
}

 

์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•œ๋‹ค. 

 

ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋ชจ๋‘ Intํ˜• ์ผ๊ฒฝ์šฐ์—” ์ž˜ ๋Œ์•„๊ฐ€๋Š” ์ฝ”๋“œ์ด๋‹ค.

ํ•˜์ง€๋งŒ ๋งŒ์•ฝ์— ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์ด Double, String์ผ ๊ฒฝ์šฐ์—” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

์™œ? ์Šค์œ„ํ”„ํŠธ๋Š” ํƒ€์ž…์— ๋ฏผ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๋”ฐ๋ผ์„œ Double, String์— ๋Œ€ํ•ด์„œ swapํ•จ์ˆ˜๋ฅผ ์“ฐ๊ณ  ์‹ถ๋‹ค๋ฉด

func swapTwoDoubles(_ a: inout Double, _ b: inout Double) {
     let tempA = a
     a = b
     b = tempA
}

func swapTwoStrings(_ a: inout String, _ b: inout String) {
     let tempA = a
     a = b
     b = tempA
}

ํ•ด๋‹น ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํƒ€์ž…์— ๋งž๊ฒŒ ํ•˜๋‚˜ํ•˜๋‚˜ ๋”ฐ๋กœ ๊ตฌํ˜„ ํ•ด์•ผ ํ•œ๋‹ค.

 

์ƒ๋‹นํžˆ ๊ท€์ฐฎ๊ณ  ๋ฒˆ๊ฑฐ๋กœ์šด ์ผ์ด๋‹ค.

์ด๋Ÿด ๋•Œ ์ œ๋„ค๋ฆญ์ด ์‚ฌ์šฉํ•œ๋‹ค. 

ํƒ€์ž…์— ์ œํ•œ์„ ๋‘์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ 

func swapTwoValues<T>(_ a:inout T, _ b: inout T) {
    let tempA = a
    a = b
    b = tempA
}

 

์ด๋Ÿฐ ์‹์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

<>๋ฅผ ์ด์šฉํ•ด์„œ ์•ˆ์— ํƒ€์ž…์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ด๋ฆ„(T)๋ฅผ ์„ ์–ธํ•ด์ฃผ๋ฉด ๊ทธ ๋’ค๋กœ T๋ฅผ ํƒ€์ž…์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ’ก T = Type Parameter

T๋ผ๋Š” ์ƒˆ๋กœ์šด ํ˜•์‹์ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์‹ค์ œ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ํ•ด๋‹น ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…์œผ๋กœ ๋Œ€์ฒด๋˜๋Š” PlaceHolder์ด๋‹ค.

๐Ÿ’ก ํ•จ์ˆ˜ ๋’ค์— <>๋กœ ๊ฐ์‹ธ๋Š” ์ด์œ 

T๋Š” ์ƒˆ๋กœ์šด ํ˜•์‹์ด ์•„๋‹ˆ๋ผ Placeholder์ด๊ธฐ ๋–„๋ฌธ์—, Swiftํ•œํ…Œ T๋Š” ์ƒˆ๋กœ์šด ํƒ€์ž…์ด ์•„๋‹ˆ๋‹ค. 
์ฆ‰ ์‹ค์ œ ์ด ํƒ€์ž…์ด ์กด์žฌํ•˜๋Š”์ง€ ์ฐพ์ง€๋งˆ๋ผ, ์ž๋ฆฌ ํƒ€์ž…์ด๋‹ค ๋ผ๊ณ  ๋งํ•ด์ฃผ๋Š”๊ฒƒ์ด๋‹ค.

 

 

๊ทธ๋ž˜์„œ swapTwoValues๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ œ๋„ค๋ฆญ์œผ๋กœ ์„ ์–ธํ•ด์ฃผ๋ฉด

var someInt = 1
var anotherInt = 2
swapTwoValues(&someInt, &anotherInt) // ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ T๋Š” Int ํƒ€์ž…์œผ๋กœ ๊ฒฐ์ •

var someString = "Hello"
var anotherString = "Swift"
swapTwoValues(&someString, &anotherString) // ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ T๋Š” String ํƒ€์ž…์œผ๋กœ ๊ฒฐ์ •

T์˜ ํƒ€์ž…์ด ์ฒ˜์Œ๋ถ€ํ„ฐ ์ •ํ•ด์ง€๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์‹ค์ œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์‚ฌ์šฉํ•  ๋•Œ T์˜ ํƒ€์ž…์ด ๊ฒฐ์ •๋œ๋‹ค.

 

๊ทผ๋ฐ ๋งŒ์•ฝ ์—ฌ๊ธฐ์„œ ํŒŒ๋ผ๋ฏธํ„ฐ a, b ๋ชจ๋‘ ๊ฐ™์€ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ T๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ด ๋•Œ๋ฌธ์—

swapTwoValues(&someInt, &anotherString)  // error 

 

์ด๋ ‡๊ฒŒ ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•˜๋ฉด, ์ฒซ ๋ฒˆ์งธ someInt๋ฅผ ํ†ตํ•ด์„œ T๊ฐ€ ์ด๋ฏธ Int๋กœ ๊ฒฐ์ •๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ anotherString์˜ ํƒ€์ž…์ด Int๊ฐ€ ์•„๋‹ˆ๋ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.


 

๋˜‘๊ฐ™์€ ๋‚ด์šฉ์˜ ํ•จ์ˆ˜๋ฅผ ์˜ค๋ฒ„๋กœ๋”ฉ ํ•  ํ•„์š” ์—†์ด ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

๊ณ ๋กœ ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ํ”ผํ•˜๊ณ  ๋” ํšจ์œจ์ ์ด๊ณ  ์œ ์—ฐํ•œ ์ฝ”๋“œ๋ฅผ ์งค ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๐Ÿ˜€