Swift, Generics

iDOยท2021๋…„ 10์›” 22์ผ

Swift

๋ชฉ๋ก ๋ณด๊ธฐ
5/5
post-thumbnail

๐Ÿง ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ธฐ์œ„ํ•ด ๊ณต์‹๋ฌธ์„œ๋ฅผ ๋ณด๋ฉฐ ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๐Ÿ Generics(์ œ๋„ค๋ฆญ)

์ œ๋„ค๋ฆญ์€ ์Šค์œ„ํ”„ํŠธ์˜ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ ์Šค์œ„ํ”„ํŠธ์˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋Œ€๋ถ€๋ถ„์€ ์ œ๋„ค๋ฆญ ์ฝ”๋“œ๋กœ ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค. ์–ธ์–ด ๊ฐ€์ด๋“œ ์ „์ฒด์—์„œ ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Array์™€ Dictionary์œ ํ˜•์€ ๋ชจ๋‘ ์ผ๋ฐ˜ ์ปฌ๋ ‰์…˜์ž…๋‹ˆ๋‹ค. Int๊ฐ’์„ ๋ณด์œ ํ•œ ๋ฐฐ์—ด, String๊ฐ’์„ ๋ณด์œ ํ•œ ๋ฐฐ์—ด, ๋˜๋Š” ์‹ค์ œ๋กœ ์Šค์œ„ํ”„ํŠธ์—์„œ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์œ ํ˜•์— ๋Œ€ํ•œ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ง€์ •๋œ ์œ ํ˜•์˜ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ์‚ฌ์ „์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•ด๋‹น ์œ ํ˜•์— ๋Œ€ํ•œ ์ œํ•œ์€ ์—†์Šต๋‹ˆ๋‹ค.

๐Ÿ The Problem That Generics Solve

Example 1

์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์ผ๋ฐ˜ ํ•จ์ˆ˜

func swapTwoInt(_ a: inout Int, _ b: inout Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}
Example 2

์œ„ ํ•จ์ˆ˜๋Š” In-Out Parameters๋ฅผ ํ†ตํ•ด ๋‘ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

var someInt = 3
var anotherInt = 107
swapTwoInt(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
// Prints "someInt is now 107, and anotherInt is now 3"

swapTwoInt ํ•จ์ˆ˜๋Š” ์œ ์šฉํ•œ ํ•จ์ˆ˜์ง€๋งŒ ์˜ค์ง Int๊ฐ’๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ String๊ฐ’์ด๋‚˜ Double๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’๋งŒ ๋‹ค๋ฅธ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜(swapTwoString, swapTwoDouble)๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ค‘๋ณต๋˜๋Š” ํ•จ์ˆ˜๊ฐ€ 3๊ฐœ๋‚˜ ๋˜๊ฒ ์ง€์š”.
๋งŒ์•ฝ ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด๐Ÿค”?

๐Ÿ Generic Functions

Example 3

์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•จ์œผ๋กœ, ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋Š” ์–ด๋–ค ํƒ€์ž…์œผ๋กœ๋„ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. swapTwoInt์—์„œ ํ•จ์ˆ˜ ์ •์˜๋ถ€๋ถ„๋งŒ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ•จ์œผ๋กœ ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

swapTwoValues์™€ swapTwoInts์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœํ•˜์ง€๋งŒ, swapTwoInts์™€ ๋‹ฌ๋ฆฌ ์–ด๋– ํ•œ ํƒ€์ž…์œผ๋กœ๋“  ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. swapTwoValues๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด T ๋Š” ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ ํƒ€์ž…์˜ ๊ฐ’์œผ๋กœ๋ถ€ํ„ฐ ์ถ”๋ก ๋˜์–ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ๋‘ ๊ฐ€์ง€ ์˜ˆ์—์„œ T๋Š” Int์™€ String์œผ๋กœ ์ถ”๋ก ๋˜์–ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค .

var someInt = 3
var anotherInt = 107
swapTwoValues(&someInt, &anotherInt)
// someInt is now 107, and anotherInt is now 3

var someString = "hello"
var anotherString = "world"
swapTwoValues(&someString, &anotherString)
// someString is now "world", and anotherString is now "hello"
Note

swapTwoValues() ๋Š” swap์ด๋ผ๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ผ๋ถ€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์˜ˆ๋กœ, ๋งŒ์•ฝ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Swift์˜ swap์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฒˆ์—๋Š” ์ œ๋„ค๋ฆญ์˜ ๊ธฐ๋ณธ์  ๊ฐœ๋…๊ณผ ๊ตฌํ˜„์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค!

๐Ÿง(์•„๋ž˜ ์ฐธ๊ณ ๋‚ด์šฉ์„ ํ†ตํ•ด ๋” ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!)

profile
์ด๊ณณ์€ ์ €๋ฅผ ์œ„ํ•œ iOS ์„ค๋ช…์„œ์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€