Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Swift/Swift BASIC

[Swift] ๊ธฐ์ดˆ ๋ฌธ๋ฒ• - ํ”„๋กœํ† ์ฝœ (protocol)

๊ฐ์ž ๐Ÿฅ” 2022. 1. 19. 14:57
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์ž์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ํ”„๋กœํ† ์ฝœ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ• ๊ฒŒ์š”! 

๋ณธ ํฌ์ŠคํŒ…์€ ํŒจ์ŠคํŠธ์บ ํผ์Šค์˜ 30๊ฐœ ํ”„๋กœ์ ํŠธ๋กœ ๋ฐฐ์šฐ๋Š” iOS์•ฑ๊ฐœ๋ฐœ with Swift ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•
 

ํŒจ์ŠคํŠธ์บ ํผ์Šค [์ง์žฅ์ธ ์‹ค๋ฌด๊ต์œก]

ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ์˜์ƒํŽธ์ง‘, UX/UI, ๋งˆ์ผ€ํŒ…, ๋ฐ์ดํ„ฐ ๋ถ„์„, ์—‘์…€๊ฐ•์˜, The RED, ๊ตญ๋น„์ง€์›, ๊ธฐ์—…๊ต์œก, ์„œ๋น„์Šค ์ œ๊ณต.

fastcampus.co.kr

ํ”„๋กœํ† ์ฝœ (protocol) ์ด๋ž€?

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

ํ”„๋กœํ† ์ฝœ์˜ ๊ธฐ๋ณธ ํ˜•ํƒœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์ฝ”๋“œ๋ธ”๋ก ์•ˆ์—๋Š” ํ”„๋กœํ† ์ฝœ์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ ๋Š”๋‹ค.

protocol ์ด๋ฆ„ {
	// ~~~
}

๊ทธ๋Ÿผ ์ด์ œ ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ดํŽด๋ณด์ž. ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๋Š” ๋ฐฉ์‹์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

protocol SomeProtocol {

}

struct SomeStructure: SomeProtocol {

}

ํ”„๋กœํ† ์ฝœ์€ ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ”„๋กœํ† ์ฝœ์„ ๋™์‹œ์— ์ฑ„ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋™์‹œ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

protocol SomeProtocol {

}

protocol SomeProtocol2 {

}

struct SomeStructure: SomeProtocol, SomeProtocol2 {

}

 

ํด๋ž˜์Šค์—์„œ๋„ ํ”„๋กœํ† ์ฝœ ์ฑ„ํƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ํด๋ž˜์Šค์—์„œ๋Š” ์ƒ์†์ด๋ผ๋Š” ๊ฐœ๋…์ด ์žˆ๊ธฐ์— ์ฃผ์˜ํ•ด์•ผํ•  ์ ์ด ์žˆ๋‹ค. ์ƒ์†๋„ ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋ฅด ํด๋ก (:) ๋‹ค์Œ์— ์Šˆํผํด๋ž˜์Šค ์ด๋ฆ„์„ ์“ฐ๊ฒŒ๋˜๋Š”๋ฐ, ์ƒ์†๋ฐ›์„ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธํ˜•ํƒœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

class ์ด๋ฆ„: superClass, protocol1, protocol2... {

}

 

ํ”„๋กœํ† ์ฝœ ์ฒญ์‚ฌ์ง„? ๊ทธ๊ฒŒ ๋ญ”๋ฐ?

์•ž์„œ ๊ฐœ๋…์„ ์‚ดํŽด๋ณด๋ฉด, ํ”„๋กœํ† ์ฝœ์€ ํŠน์ • ์—ญํ• ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐํƒ€ ์š”๊ตฌ์‚ฌํ•ญ ๋“ฑ์˜ ์ฒญ์‚ฌ์ง„์„ ์ •์˜ํ•˜๊ณ , ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•œ ๊ตฌ์กฐ์ฒด,ํด๋ž˜์Šค,์—ด๊ฑฐํ˜•์—๊ฒŒ ์ •์˜ํ•œ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ค€์ˆ˜ํ•˜๋ผ๊ณ  ์š”์ฒญํ•œ๋‹ค๊ณ  ํ•˜์˜€๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์–ด๋–ป๊ฒŒ ์ฒญ์‚ฌ์ง„์„ ์ •์˜ํ•ด์•ผ ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ–ˆ์„ ๋•Œ ์ •์˜ํ•œ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ค€์ˆ˜ํ•˜๋ผ๊ณ  ์š”์ฒญํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์ž.

ํ”„๋กœํ† ์ฝœ์€ ์ž์‹ ์„ ์ฑ„ํƒํ•œ ํƒ€์ž…์ด ์–ด๋–ค ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š”์ง€ ์š”๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ํ”„๋กœํ† ์ฝœ์ด ํ”„๋กœํผํ‹ฐ๋ฅผ ์ค€์ˆ˜ํ•˜๋„๋ก ์ •์˜ํ•  ๋•Œ ๊ณ„์‚ฐํ”„๋กœํผํ‹ฐ์ธ์ง€ ์ €์žฅํ”„๋กœํผํ‹ฐ์ธ์ง€ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„๊ณผ ํƒ€์ž…๋งŒ ์ง€์ •ํ•˜๋ฉด ๋œ๋‹ค. ์ด๋•Œ ํ”„๋กœํผํ‹ฐ์˜ ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•œ ํ”„๋กœํผํ‹ฐ์ธ์ง€, ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํ† ์ฝœ์ธ์ง€ get,set์„ ํ™œ์šฉํ•˜์—ฌ ์ •์˜ํ•ด์ค˜์•ผํ•œ๋‹ค. ํ”„๋กœํ† ์ฝœ์—์„œ ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•œ ํ”„๋กœํผํ‹ฐ๋ฅผ ์š”๊ตฌํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ํฌ๋กœํผํ‹ฐ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

protocol FirstProtocol {
	var name: Int {get set} //์ฝ๊ณ ์“ฐ๊ธฐ ๊ฐ€๋Šฅ
    var age: Int {get} // ์ฝ๊ธฐ ๊ฐ€๋Šฅ
}

ํ”„๋กœํ† ์ฝœ์€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์š”๊ตฌํ•  ๋•Œ, ์ฝ”๋“œ์™€ ๊ฐ™์ด ํ•ญ์ƒ varํ‚ค์›Œ๋“œ ์ฆ‰ ๋ณ€์ˆ˜๋กœ ์ •์˜ํ•ด์•ผํ•œ๋‹ค. ์ฝ๊ณ ์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ”„๋กœํผํ‹ฐ๋Š” get set ์„ ์ž‘์„ฑํ•ด์ฃผ๊ณ , ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•œ ํ”„๋กœํผํ‹ฐ๋Š” get์„ ์ž‘์„ฑํ•ด์ฃผ์ž.

๊ทธ๋ฆฌ๊ณ  ํ”„๋กœํ† ์ฝœ์—์„œ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋ฅผ ์š”๊ตฌํ•˜๋ ค๋ฉด ํ•ญ์ƒ staticํ‚ค์›Œ๋“œ๋ฅผ ์จ์ค˜์•ผํ•œ๋‹ค.

protocol AnotherProtocol {
	static var someTypeProperty: Int {get set}
}

 

โ–ถ ๊ทธ๋Ÿผ ์ด์ œ ํ”„๋กœํ† ์ฝœ์—์„œ ํ”„๋กœํผํ‹ฐ์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ •์˜ํ•˜๊ณ  ๊ตฌ์กฐ์ฒด์— ์ •์˜ํ•œ ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•ด๋ณด์ž.

protocol FullyNames {
	var fullName : String { get set }
}

struct Person: FullyNames {
	var fullName: String // ํ”„๋กœํ† ์ฝœ์—์„œ ์ •์˜ํ•œ ๋ณ€์ˆ˜๋ฅผ person์—์„œ ์ง€์ •ํ•ด์ฃผ๋ฉด ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑํ–ˆ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
}

 

โ–ถ  ํ”„๋กœํ† ์ฝœ์€ ์ž์‹ ์„ ์ฑ„ํƒํ•œ ํƒ€์ž…์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ์š”๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ํ”„๋กœํ† ์ฝœ์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ๋•Œ, ๋ฉ”์„œ๋“œ์— ํ•„์š”ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ด์ค˜์•ผํ•˜๋Š”๋ฐ, ๋ฉ”์„œ๋“œ๊ฐ’์˜ ๋””ํด๋“œ๊ฐ’์€ ์ง€์ •ํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋Ÿผ FullyNamesํ”„๋กœํ† ์ฝœ์— ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•ด๋ณด์ž.

protocol FullyNames {
	var Name: String { get set }
    func printFullName()
}

์ด๋ ‡๊ฒŒ FullyNamesํ”„๋กœํ† ์ฝœ์ด ๋ณ€๊ฒฝ๋˜์–ด์„œ ์•„๋ž˜์ฒ˜๋Ÿผ person๊ตฌ์กฐ์ฒด์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์™œ FullyNames ํ”„๋กœํ† ์ฝœ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ค€์ˆ˜ํ•˜์ง€ ์•Š์•˜๋ƒ? ์ด๋œป์ด๋‹ค. ์š”๊ตฌ์‚ฌํ•ญ์„ ์ค€์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค˜์•ผํ•œ๋‹ค.

struct Person: FullyNames {
	var fullName: String
    func printFullName() {
    	print(fullName)
	}
}

 

โ–ถ ์ƒ์„ฑ์ž(initializer) ์š”๊ตฌ์‚ฌํ•ญ์„ ์‚ดํŽด๋ณด์ž. ํ”„๋กœํ† ์ฝœ์€ ์ž์‹ ์„ ์ฑ„ํƒํ•œ ํƒ€์ž…์— ์ƒ์„ฑ์ž๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์š”๊ตฌ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

protocol SomeProtocol4 {
	init(someParameter: Int)
}

์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ์ž ์š”๊ตฌ์‚ฌํ•ญ์„ ์ฑ„ํƒํ•ด๋ณด์ž.

protocol Someprotocol5 {
	init()
}

class Someclass: Someprotocol5 {
	required init() {
    
    }
}

๊ตฌ์กฐ์ฒด์—์„œ๋Š” ์ƒ์„ฑ์ž ์š”๊ตฌ์‚ฌํ•ญ์„ ์ค€์ˆ˜ํ• ๋•Œ required ์‹๋ณ„์ž๊ฐ€ ํ•„์š”์—†์ง€๋งŒ, class์—์„œ๋Š” ํ•„์š”ํ•˜๋‹ค. ๋‹จ ์˜ˆ์™ธ์ ์œผ๋กœ ํด๋ž˜์Šค ์ž์ฒด๊ฐ€ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์—†๋Š” final ํด๋ž˜์Šค๋ผ๋ฉด required ์‹๋ณ„์ž๊ฐ€ ํ•„์š”์—†๊ธฐ๋„ ํ•˜๋‹ค.

 

๋ฐ˜์‘ํ˜•