ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

์•ˆ๋…•ํ•˜์„ธ์š”?

๋„ˆ๊ตฌ๋ฆฌ์ž…๋‹ˆ๋‹ค~~

 

์˜ค๋Š˜์€ ์ •๋ง์ •๋ง ์ •๋ฆฌํ•˜๊ณ ์‹ถ์—ˆ๋˜

Generic์— ๋Œ€ํ•ด์„œ ํฌ์ŠคํŒ…์„ ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค!

 

๋ฒŒ์จ ์„ค๋ ˆ๋„ค์š”ใ…Žใ…Ž

๋ฐ”๋กœ ์•Œ์•„๋ณด์‹œ์ฃ ~

 

 

Generic์€ ๋ญ˜๊นŒ?


์‚ฌ์ „ ์ •์˜๋ถ€ํ„ฐ ์•Œ์•„๋ณผ๊นŒ์š”?ใ…Žใ…Ž

Generic : ํฌ๊ด„์ ์ธ, ํ†ต์นญ์˜

ํฌ๊ด„์ ์ธ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ผ๋Š” ์ด๋ฏธ์ง€๊ตฐ์š”!

 

 

๊ณต์‹๋ฌธ์„œ์— ์žˆ๋Š” ์„ค๋ช…์„ ๋ณด๋ฉด

- ์ œ๋„ค๋ฆญ์ฝ”๋“œ๋Š” ์ •์˜ํ•œ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ๋ชจ๋“  ํƒ€์ž…์—์„œ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐํ•˜๊ณ  ์žฌ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜์™€ ํƒ€์ž…์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

- ์ค‘๋ณต์„ ํ”ผํ•˜๊ณ  ๋ช…ํ™•ํ•˜๊ณ  ์ถ”์ƒ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์˜๋„๋ฅผ ํ‘œํ˜„ํ•˜๋Š”์ฝ”๋“œ

๋ผ๊ณ  ์„ค๋ช…์ด ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

์‚ฌ์ „์—์„œ ๋ณธ ํฌ๊ด„์ ์ธ ์˜๋ฏธ๊ฐ€ ๋ชจ๋“  ํƒ€์ž…์—์„œ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์—์„œ ๋ถ™์—ฌ์ง„ ์ด๋ฆ„์ด๋„ค์š”!

 

์‚ฌ์‹ค ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” swift ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธฐ๋Šฅ ๋Œ€๋ถ€๋ถ„์ด generic์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”๋ฐ์š”.

์šฐ๋ฆฌ๊ฐ€ ์˜ˆ์ „์— ๋ฐฐ์› ๋˜ Array๋‚˜ Dictionary๋„ generic collection์ž…๋‹ˆ๋‹ค!

 

๊ทธ๋Ÿผ generic์€ ์™œ ์‚ฌ์šฉํ• ๊นŒ์š”?

 

์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋ฅผ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด์„œ

๋‘ ๋ณ€์ˆ˜์˜ Intํƒ€์ž… ๊ฐ’์„ ์„œ๋กœ ๋ฐ”๊พธ์–ด์ฃผ๋Š” ํ•จ์ˆ˜ swapTwoInts(_:_:) ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

var a = 7
var b = 8

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

swapTwoInts(&a, &b) // a = 8, b = 7

inout์€ ๋‚ด๋ถ€์—์„œ ๊ฐ’์„ ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ๊ธฐ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ๊ตฌ์š”

๊ฒฐ๊ณผ๋„ ์„ฑ๊ณต์ ์œผ๋กœ ์ž˜ ๋‚˜์™”์Šต๋‹ˆ๋‹ค!

 

์ž ๊ทธ๋Ÿผ ๋‹ค๋ฅธ ํƒ€์ž…์„ ๊ฐ€์ง€๋Š” ๋ณ€์ˆ˜๋“ค์€ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ์š”?

ํƒ€์ž…๋งˆ๋‹ค ๋˜‘๊ฐ™์€ ์ฝ”๋“œ์ธ ํ•จ์ˆ˜๋ฅผ ๊ณ„์† ๋งŒ๋“ค์–ด์ค˜์•ผ๊ฒ ์ฃ ?

์˜ˆ๋ฅผ ๋“ค์–ด swapTwoDoubles(_:_:) , swapTwoStrings(_:_:) 

๋„ˆ๋ฌด ๋น„ํšจ์œจ์ ์ด์—์š”ใ… ใ… 

 

๊ทธ๋Ÿผ Any๋กœ ํƒ€์ž…์„ ์ •ํ•ด์ฃผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

๋งŒ๋“ค์–ด ๋ด…์‹œ๋‹ค!

์ž anyํƒ€์ž…์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉํ•ด๋ดค๋”๋‹ˆ

๋งค๊ฐœ๋ณ€์ˆ˜์— anyํƒ€์ž…๋งŒ ๋„ฃ์œผ๋ผ๊ณ  ํ•˜๋„ค์š”!!ใ… 

๊ทธ๋ž˜์„œ anyํƒ€์ž…์œผ๋กœ ๋ฐ”๊พธ์–ด์ฃผ๋ฉด ๊ฐ’์ด ๋ณต์‚ฌ๋˜๊ธฐ๋•Œ๋ฌธ์— ์—…๋ฐ์ดํŠธํ•˜๋Š” ์˜๋ฏธ๊ฐ€ ์—†์–ด์ง‘๋‹ˆ๋‹คใ… ใ… 

 

 

๊ทธ๋ž˜์„œ Anyํƒ€์ž…์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ด์ฃผ๊ณ  ํ…Œ์ŠคํŠธํ•ด๋ณด๋ฉด

var c: Any = 7
var d: Any = "10"

func swapTwoAny(_ a: inout Any, _ b: inout Any) {
    let temporaryA: Any = a
    a = b
    b = temporaryA
}
swapTwoAny(&c, &d) // c = "10", d = 7

์ž˜ ์ˆ˜ํ–‰๋˜๊ธด ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ฐ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์–ด๋–ค ํƒ€์ž…์ด ๋“ค์–ด์˜ฌ์ง€ ๋ชจ๋ฅด๊ณ 

๋ณ€์ˆ˜๊ฐ€ anyํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ ๋˜ ํƒ€์ž…์„ ๋ฐ”๊พธ์–ด์ฃผ์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ฒ ์ฃ ?

๊ณ„์† ๋น„ํšจ์œจ์ ์ธ ์ƒํ™ฉ์ด ๋‚˜์˜ค๊ณ ์žˆ์–ด์š”ใ… ใ… 

 

 

๋„ˆ๊ตฌ๋ฆฌ : swift์•ผ ์•ผ ์ด๊ฑฐ ๋„ˆ๋ฌด ๋ถˆํŽธํ•œ๊ฑฐ ์•„๋‹ˆ๋ƒ?

 

swift : ๊ทธ๋Ÿด๋•Œ ์‚ฌ์šฉํ•˜๋ผ๊ณ  Generic์„ ๋งŒ๋“ค์–ด๋‘”๊ฑฐ์•ผ ๊ทธ๊ฑฐ์จ!!

 

๋„ˆ๊ตฌ๋ฆฌ : ๋•กํ!!ใ…Žใ…Ž

 

 

์ œ๋„ค๋ฆญ ํ•จ์ˆ˜(Generic Function)

 

 

๋„ค ๋ฐ”๋กœ ์ด๋Ÿฐ ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•˜๋ผ๊ณ  Generic์„ ์“ฐ๋Š”๊ฑฐ์—์š”!!

์–ด๋–ป๊ฒŒ์š”?

๋ฐ”๋กœ ์ด๋ ‡๊ฒŒ์š”!!

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

์—ฌ๊ธฐ์„œ ๋‚˜์˜จ T๋Š” ์ž„์˜์˜ ํƒ€์ž…์ด๊ณ , ๋ฌด์Šจ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋„ฃ๋“  a์™€b๋Š” ๊ฐ™์€ ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๋Š” ์˜๋ฏธ ์ž…๋‹ˆ๋‹ค!

 

Generic์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” <> ๊บฝ์‡ ๊ด„ํ˜ธ๋ฅผ ์ด์šฉํ•˜๊ณ  ๊ด„ํ˜ธ์•ˆ์— ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค!

ํ•จ์ˆ˜์ด๋ฆ„<ํƒ€์ž…๋งค๊ฐœ๋ณ€์ˆ˜>(ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜)

์ด๋Ÿฐ ์‹์œผ๋กœ์š”!

์ด๋ ‡๊ฒŒ generic์„ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ œ๋„ค๋ฆญํ•จ์ˆ˜๋ผ๊ณ ํ•ด์š”!

 

 

์œ„์— ์žˆ๋Š” ํ•จ์ˆ˜์—์„œ๋Š” ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ T๋กœ ์ฃผ์—ˆ์–ด์š”!

์—ฌ๊ธฐ์„œ T๋Š” ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ(Type Parameter)๋ผ๊ณ  ํ•˜๋Š”๋ฐ์š”!

 

 

์ด๊ฑด ์‹ค์ œ ํƒ€์ž…์„ ๋„ฃ์–ด์ฃผ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ํ”Œ๋ ˆ์ด์Šคํ™€๋”(placeholder)์˜ ์—ญํ• ์ธ๋ฐ์š”

 

 

์–ด๋–ค ํƒ€์ž…์ธ์ง€๋Š” ๋ชจ๋ฅด์ง€๋งŒ ์จ‹๋“  ํ•œ ํƒ€์ž…์ด ๋“ค์–ด์˜ฌ๊ฑฐ๊ณ 

๋งค๊ฐœ๋ณ€์ˆ˜๋ผ๋ฆฌ ๊ฐ™์€ ํƒ€์ž…์„ ์จ์•ผ๋ผ~~ ๋ผ๋Š” ์˜๋ฏธ์—์š”

๊ทธ๋ฆฌ๊ณ  ๊ทธ ํƒ€์ž…์€ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์ˆœ๊ฐ„ ์ •ํ•ด์ง€๋Š”๊ฑฐ์ฃ !

 

 

๋งŒ์•ฝ์— ์„œ๋กœ ๋‹ค๋ฅธํƒ€์ž…์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

์ฒ˜์Œ์— ๋ณ€์ˆ˜ c๊ฐ€ Intํƒ€์ž…์œผ๋กœ ๋“ค์–ด์™€์„œ ํƒ€์ž…์ด T๋กœ ์ •ํ•ด์กŒ๊ณ ,

๋ณ€์ˆ˜ d๊ฐ€ Stringํƒ€์ž…์ด๋‹ˆ๊นŒ ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…์— ๋งž์ง€ ์•Š๋‹ค๋Š” ์—๋Ÿฌ๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค!!

 

 

 

๊ทธ๋Ÿผ ์ด ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” T๋ผ๊ณ ๋งŒ ์“ฐ๋‚˜? ๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ค ์ˆ˜ ์žˆ๋Š”๋ฐ

๋˜ ๊ทธ๊ฑด ์•„๋‹ˆ์—์š”!

 

์‚ฌ์‹ค ๋งˆ์Œ๋Œ€๋กœ ์ด๋ฆ„์„ ์ •ํ•ด์ฃผ์…”๋„ ๋˜๊ณ 

์ผ๋ฐ˜์ ์œผ๋กœ T,U,V๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด์š”!

 

๊ทธ๋ฆฌ๊ณ  ํƒ€์ž… ์ด๋ฆ„์ด๊ธฐ๋•Œ๋ฌธ์— ๋Œ€๋ฌธ์ž ์นด๋ฉœ์ผ€์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค!

 

์ฐธ๊ณ  : swapTwoValuesํ•จ์ˆ˜๋Š” ๋”ฐ๋กœ ๋งŒ๋“ค์ง€ ์•Š์•„๋„ ์‹ค์ œ ๊ธฐ๋ณธ ํ•จ์ˆ˜๋กœ ๊ฐ™์€ ๊ธฐ๋Šฅ์ธ Swapํ•จ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค~~

 

 

 

 

์ œ๋„ค๋ฆญ ํƒ€์ž…(Generic ํƒ€์ž…)

 

์ž ์ง€๊ธˆ๊นŒ์ง€๋Š” ํ•จ์ˆ˜์— ์ œ๋„ค๋ฆญ์ด ์ ์šฉ๋œ ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜์—๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋Š”๋ฐ

์ œ๋„ค๋ฆญ ํƒ€์ž…์ด๋ผ๋Š” ๊ฐœ๋…๋„ ์žˆ์Šต๋‹ˆ๋‹ค!

 

์ด๊ฑด ๋˜ ๋ญ๋ƒ

๋ฐ”๋กœ ๊ตฌ์กฐ์ฒด, ํด๋ž˜์Šค, ์—ด๊ฑฐํ˜•์— ์ œ๋„ค๋ฆญ์„ ์ ์šฉ์‹œํ‚จ๊ฒ๋‹ˆ๋‹ค!

 

 

์˜ˆ์ œ๋ฅผ ํ†ตํ•ด์„œ ๊ณต๋ถ€ํ•ด๋ณผ๊ฒŒ์š”!!

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ์ธ Stack์„ ๋งŒ๋“ค์–ด๋ณผ๊ฒŒ์š”!!

 

Stack์€ ํ›„์ž…์„ ์ถœ(last in first out) ํŠน์ง•์„ ๊ฐ€์ง€๋Š”๋ฐ์š”!

์Šคํƒ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์„ ๋•Œ๋Š” push, ๋บ„๋•Œ๋Š” pop์ด๋ผ๊ณ  ํ•ด์š”

 

 

์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•ด์„œ Stack์„ ๋งŒ๋“ค์—ˆ์–ด์š”!

struct Stack<Element> {
    var items: [Element] = []
    mutating func push(_ item: Element) {
        items.append(item)
    }
    mutating func pop() -> Element {
        return items.removeLast()
    }
}

 

 

ํ•œ๋ฒˆ ์‚ฌ์šฉํ•ด๋ณผ๊ฒŒ์š”!!

์ œ๋„ค๋ฆญ์œผ๋กœ ๋งŒ๋“œ๋‹ˆ๊นŒ

์ธ์Šคํ„ด์Šค ์ดˆ๊ธฐํ™”๋•Œ ํƒ€์ž…๋งŒ ์ •ํ•ด์ฃผ๋ฉด

์ž˜ ๋™์ž‘ํ•˜๋Š”๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”!!

 

 

์ œ๋„ค๋ฆญ ํƒ€์ž… ํ™•์žฅ

์ œ๋„ค๋ฆญํƒ€์ž…์—์„œ๋„ extension์„ ํ†ตํ•ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์š”!!

๋‹ค๋งŒ extension์˜ ์ •์˜์— ๋”ฐ๋ผ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ช…์‹œํ•˜์ง€ ์•Š์•„์š”!

 

 

๊ทธ๋Ÿผ ํƒ€์ž…ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์“ฐ๋ƒ๊ตฌ์š”?

๊ทธ๋ƒฅ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹คใ…Žใ…Ž

๋ฐ”๋กœ ์ด๋ ‡๊ฒŒ์š”

extension Stack {
    var topElement: Element? {
        return self.items.last
    }
}

stringStack.topElement // ๋ผ๋ฉด

 

 

 

 

ํƒ€์ž…์ œ์•ฝ

 

์ง€๊ธˆ๊นŒ์ง€๋Š” ํƒ€์ž…ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์•„๋ฌด ์ œ์•ฝ์—†์ด ์‚ฌ์šฉํ–ˆ์—ˆ๋Š”๋ฐ์š”!!

์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด ์ œ์•ฝ์„ ์ค˜์•ผํ•  ๊ฒฝ์šฐ๋„ ์ƒ๊ฒจ์š”..ใ… 

 

๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ๋Šฅ์ค‘์— ํ•˜๋‚˜๊ฐ€ ํŠน์ • ํƒ€์ž…๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค๋˜์ง€

ํŠน์ • ํ”„๋กœํ† ์ฝœ์„ ๋”ฐ๋ผ์•ผํ•˜๋Š” ๊ฒฝ์šฐ์— ๋ง์ด์ฃ 

 

์ œ์•ฝ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด๋„ ์žˆ๋Š”๋ฐ์š”!

ํด๋ž˜์Šคํƒ€์ž…, ํ”„๋กœํ† ์ฝœ๋งŒ ํƒ€์ž…์ œ์•ฝ์œผ๋กœ ์ค„ ์ˆ˜ ์žˆ์–ด์š”!!!(๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜• ์•ˆ๋จ)

 

 

๊ทธ๋Ÿผ ์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณผ๊ฒŒ์š”

func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) {
    // function body goes here
}

๊ฐ„๋‹จํ•˜์ฅฌ? 

 

 

์ด๋ ‡๊ฒŒ ์ฃผ๋ฉด ํƒ€์ž…ํŒŒ๋ผ๋ฏธํ„ฐ T๋Š” SomeClass์˜ ํ•˜์œ„ ํด๋ž˜์Šค์—ฌ์•ผ ํ•˜๊ณ 

U๋Š” SomeProtocol์„ ๋”ฐ๋ผ์•ผํ•ด์š”

 

 

๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค

๋งค๊ฐœ๋ณ€์ˆ˜ ๋‘๊ฐœ๋ฅผ ๋”ํ•˜๋Š” ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ๋ณผ๊ฒŒ์š”~

func plus<T>(a: T, b: T) -> T {
    return a + b
}

์ด๋Ÿฐ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ

์ด๋ ‡๊ฒŒ ์ •์˜ํ•˜๊ณ ๋‚˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค..ใ… 

 

์—ฐ์‚ฐ์ž๋ฅผ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ๋‚˜์˜ต๋‹ˆ๋‹ค

 

์™œ ๊ทธ๋Ÿฐ๊ฑธ๊นŒ์š”?

 

 

+,-์™€ ๊ฐ™์€ ์—ฐ์‚ฐ์ž๋Š” BinaryInteger๋ผ๋Š” ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ํƒ€์ž…๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ์š”!

์ด๋Ÿฐ ์ƒํ™ฉ์— ๋ฐ”๋กœ ํƒ€์ž… ์ œ์•ฝ์„ ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค!

์ œ์•ฝ์„ ์ฃผ๊ณ ๋‚˜๋ฉด ์ •์‚ญ ์ž‘๋™์„ ํ•ด์š”!

 

func plus<T: BinaryInteger>(a: T, b: T) -> T {
    return a + b
}

print(plus(a: 7, b: 8)) // 15

 

 

 

์—ฐ๊ด€ํƒ€์ž…(Associated Type)

 

์—ฐ๊ด€ ํƒ€์ž…์€ ๋˜ ๋ญ˜๊นŒ..?

์—ฐ๊ด€ ํƒ€์ž…์€ ํ”„๋กœํ† ์ฝœ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋ ˆ์ด์Šคํ™€๋” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค!

 

 

ํ”Œ๋ ˆ์ด์Šคํ™€๋”..? ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ...?

๋„ค ๋งž์•„์š”

ํ”„๋กœํ† ์ฝœ์—์„œ ์—ฐ๊ด€ํƒ€์ž…์„ ์„ ์–ธํ•ด ์ฃผ๋ฉด ์ œ๋„ค๋ฆญ์—์„œ

์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”~~

 

 

๋ฐ”๋กœ ์˜ˆ์ œ๋กœ ํ™•์ธํ•ด๋ณผ๊ฒŒ์š”~~

protocol Container {
    associatedtype Item
    mutating func append(_ item: Item)
    var count: Int { get }
    subscript(i: Int) -> Item { get }
}

struct Stack<Element>: Container {
    var items: [Element] = []
    mutating func push(_ item: Element) {
        items.append(item)
    }
    mutating func pop() -> Element {
        return items.removeLast()
    }
    // ํ”„๋กœํ† ์ฝœ ์ค€์ˆ˜
    mutating func append(_ item: Element) {
        self.push(item)
    }
    var count: Int {
        return items.count
    }
    subscript(i: Int) -> Element {
        return items[i]
    }
}

์•„๊นŒ ์ œ๋„ค๋ฆญ ํƒ€์ž…์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ Stack์— 

Container ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๊ณ  ์ค€์ˆ˜ํ•˜๊ฒŒ๋” ํ•ด๋ดค์–ด์š”

 

 

๋ฉ”์†Œ๋“œ append์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ฃผ์—ˆ๋Š”๋ฐ 

์ œ๋„ค๋ฆญํƒ€์ž…์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์–ด๋–ค ํƒ€์ž…์ด ๋“ค์–ด์˜ฌ์ง€ ๋ชจ๋ฅด์ž–์•„์š”~

 

๊ทธ๋•Œ ํ”„๋กœํ† ์ฝœ์—์„œ ์—ฐ๊ด€ ํƒ€์ž…์„ ์ง€์ •ํ•ด ์ฃผ๊ณ  ๊ทธ๊ฒƒ์„ ๋ฉ”์†Œ๋“œ ์š”๊ตฌ์‚ฌํ•ญ์œผ๋กœ ์ฃผ๋ฉด

์ œ๋„ค๋ฆญ์˜ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ ์—ญํ• ์„ ํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค!!

 

 

๊ทธ๋Ÿผ ์ œ๋„ค๋ฆญ ํƒ€์ž…์—์„œ ์ด๋ ‡๊ฒŒ ๊น”๋”ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”!!

 

 

 

 

 

 

 

 

์˜ค๋Š˜์€ ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค!

ํœด ์–‘์ด ๋ฐฉ๋Œ€ํ•˜๋„ค์š”ใ…‹ใ…‹ใ…‹ํใ… ใ… ใ… ใ… 

 

๋„ˆ๋ฌด ์ •๋ฆฌํ•˜๊ณ  ์‹ถ์€ ๋‚ด์šฉ์ด์˜€๋Š”๋ฐ ๊ณต๋ถ€ํ•˜๋‹ˆ๊นŒ ๋„ˆ๋ฌด ์ข‹๋„ค์š”!ใ…Žใ…Ž

 

์•ž์—์„œ ์ฐพ์•„๋ณธ ์ œ๋„ค๋ฆญ ์ •์˜์ฒ˜๋Ÿผ

์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์—ฐํ•˜๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜์™€ ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„ค์š”~~!!

 

 

์˜ค๋Š˜๋„ ๊ธ€ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌ๋“œ๋ฆฌ๊ณ 

ํ‹€๋ฆฐ๋ถ€๋ถ„ ์žˆ๋‹ค๋ฉด ๊ผญ ํ”ผ๋“œ๋ฐฑ ๋ถ€ํƒ๋“œ๋ฆด๊ฒŒ์š”~

 

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

 

๋Œ“๊ธ€
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2026/03   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ