ํฐ์คํ ๋ฆฌ ๋ทฐ
์๋ ํ์ธ์?
๋๊ตฌ๋ฆฌ์ ๋๋ค~~
์ค๋์ ์ ๋ง์ ๋ง ์ ๋ฆฌํ๊ณ ์ถ์๋
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์ ๋งค๊ฐ๋ณ์๋ก ์๊ตฌ์ฌํญ์ ์ฃผ์๋๋ฐ
์ ๋ค๋ฆญํ์ ์์ ์ฌ์ฉํ ๋๋ ์ด๋ค ํ์ ์ด ๋ค์ด์ฌ์ง ๋ชจ๋ฅด์์์~
๊ทธ๋ ํ๋กํ ์ฝ์์ ์ฐ๊ด ํ์ ์ ์ง์ ํด ์ฃผ๊ณ ๊ทธ๊ฒ์ ๋ฉ์๋ ์๊ตฌ์ฌํญ์ผ๋ก ์ฃผ๋ฉด
์ ๋ค๋ฆญ์ ํ์ ํ๋ผ๋ฏธํฐ ์ญํ ์ ํ๊ฒ๋ฉ๋๋ค!!
๊ทธ๋ผ ์ ๋ค๋ฆญ ํ์ ์์ ์ด๋ ๊ฒ ๊น๋ํ๊ฒ ์ฌ์ฉํ ์ ์์ด์!!
์ค๋์ ์ ๋ค๋ฆญ์ ๋ํด ์์๋ณด์์ต๋๋ค!
ํด ์์ด ๋ฐฉ๋ํ๋ค์ใ ใ ใ ํใ ใ ใ ใ
๋๋ฌด ์ ๋ฆฌํ๊ณ ์ถ์ ๋ด์ฉ์ด์๋๋ฐ ๊ณต๋ถํ๋๊น ๋๋ฌด ์ข๋ค์!ใ ใ
์์์ ์ฐพ์๋ณธ ์ ๋ค๋ฆญ ์ ์์ฒ๋ผ
์ ๋ค๋ฆญ์ ์ฌ์ฉํ๋ฉด ์ ์ฐํ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํจ์์ ํ์ ์ ์ฌ์ฉํ ์ ์๋ค์~~!!
์ค๋๋ ๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌ๋๋ฆฌ๊ณ
ํ๋ฆฐ๋ถ๋ถ ์๋ค๋ฉด ๊ผญ ํผ๋๋ฐฑ ๋ถํ๋๋ฆด๊ฒ์~
๊ฐ์ฌํฉ๋๋ค!
'iOS > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [iOS/Swift] Access Control(์ ๊ทผ ์ ์ด) (0) | 2022.12.23 |
|---|---|
| [iOS/Swift] ARC(Automatic Reference Counting)์ ์์๋ณด์ (0) | 2022.07.24 |
| [iOS/Swift] map ํ์ ๋ค flatMap๊ณผ compactMap (0) | 2022.06.26 |
| [iOS/Swift] swift์ ๊ณ ์ฐจํจ์๋ค map, filter, reduce... ๋๋จ ๋ญ๋? (0) | 2022.06.25 |
| [iOS/Swift] NotificationCenter.. ๋ ๋ญ๋? (1) | 2022.06.20 |
- Total
- Today
- Yesterday
- XCTest
- func
- xcode
- ์ค์ํํธ ๊ณต๋ถ
- set
- URLSession
- RxSwift
- ํ ์คํธ
- swift
- test
- network
- Protocol
- Unit Test
- autolayout
- RX
- ๊ณต๋ถ
- swift ๊ณต๋ถ
- ํ๋กํ ์ฝ
- ํ๋กํผํฐ
- Swift Network
- observable
- ์ค์ํํธ ํ๋กํ ์ฝ
- swift urlsession
- ios
- swift ํ๋กํ ์ฝ
- Property
- ์ค์ํํธ
- ์คํ ๋ ์ด์์
- Clean
- ์ค์ํํธ map
| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 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 |