swiftui tutorial ์ ์์ ์ฝ๋๋ฅผ ๊ณต๋ถํ๋ค๋ณด๋ฉด, Struct ๋ค์ ~able ๋ก ๋ถ์ ๊ฒ๋ค์ด ๋ณด์ธ๋ค.
์ด๊ฑด ๋ฌด์์ด๋ฉฐ ๊ฐ๊ฐ ์ด๋ค ์ญํ ์ ํ ๊น?
Hashable๊ณผ Codable์ ์ค์ํํธ ์ธ์ด์์ ํ๋กํ ์ฝ(Protocol)์ด๋ค.
์์์ฝ๋์์ ๊ฐ๊ฐ์ ์๋ฏธ
1. Hashable:
Hashable ํ๋กํ ์ฝ์ ๊ฐ์ฒด๋ฅผ ๊ณ ์ ํ ํด์๊ฐ์ผ๋ก ๋งคํํ ์ ์๋๋ก ํด์ฃผ๋ ํ๋กํ ์ฝ์ด๋ค. ํด์๊ฐ์ ๊ฐ์ฒด๋ฅผ ์๋ณํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, ํด์ ํจ์๋ฅผ ํตํด ๊ณ์ฐ๋๋ค. Hashable ํ๋กํ ์ฝ์ ์ฑํํ๋ฉด ํด๋น ๊ฐ์ฒด๋ฅผ Set์ด๋ Dictionary์ ํค๋ก ์ฌ์ฉํ ์ ์๋ค. ๋ํ, Hashable ํ๋กํ ์ฝ์ ์ค์ํ๋ ๊ฐ์ฒด๋ ์งํฉ(Set)๊ณผ ๊ฐ์ ์๋ฃ ๊ตฌ์กฐ์์ ์ค๋ณต๋ ์์๋ฅผ ์ ๊ฑฐํ ์ ์๋ค. Landmark ๊ตฌ์กฐ์ฒด์ ์ธ์คํด์ค๊ฐ Hashable ํ๋กํ ์ฝ์ ์ค์ํ๋ฏ๋ก, ์ด ๊ฐ์ฒด๋ Set์ด๋ Dictionary์ ํค๋ก ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด๋ค.
2. Codable:
Codable ํ๋กํ ์ฝ์ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ๋ฐ์ดํฐ ํ์์ผ๋ก ๋ณํํ๊ณ , ๋ค์ ํด๋น ํ์์์ ๊ฐ์ฒด๋ก ๋ณํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. ์ฆ, Codable์ ์ค์ํ๋ ๊ฐ์ฒด๋ ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํ(Serialization)ํ๊ณ , ์ญ์ง๋ ฌํ(Deserialization)ํ ์ ์๋ค. ์ด๋ ๊ฐ์ฒด๋ฅผ JSON, XML, Property List ๋ฑ๊ณผ ๊ฐ์ ์ธ๋ถ ๋ฐ์ดํฐ ํ์์ผ๋ก ๋ณํํ๊ฑฐ๋, ์ธ๋ถ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด๋ก ๋ณํํ ๋ ์ ์ฉํ๋ค. Codable์ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด๋ฅผ ์ธ์ฝ๋ฉ(Encoding)ํ๊ฑฐ๋ ๋์ฝ๋ฉ(Decoding)ํ๋ ์์
์ ๊ฐํธํ๊ฒ ์ํํ ์ ์๋ค. Landmark ๊ตฌ์กฐ์ฒด๋ Codable ํ๋กํ ์ฝ์ ์ค์ํ๋ฏ๋ก, ์ด ๊ฐ์ฒด๋ฅผ JSON ๋ฐ์ดํฐ๋ก ์ธ์ฝ๋ฉํ๊ฑฐ๋ JSON ๋ฐ์ดํฐ์์ ๋์ฝ๋ฉํ ์ ์๋ค.
ํ๋กํ ์ฝ์ ์๋ฏธ
ํ๋กํ ์ฝ(Protocol)์ ์ค์ํํธ ์ธ์ด์์ ํน์ ๊ธฐ๋ฅ ๋๋ ์ญํ ์ ์ ์ํ๋ ์ถ์์ ์ธ ์ฒญ์ฌ์ง์ด๋ค. protocol์ method, property ๋ฐ ๋ค๋ฅธ ๋ฉค๋ฒ์ ์งํฉ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค. Class, Struct, Enum ๋ฑ์ ํ์
์ ํ๋กํ ์ฝ์ ์ฑํํ์ฌ ํด๋น ํ๋กํ ์ฝ์ด ์๊ตฌํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋ค.
ํ๋กํ ์ฝ์ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ฐ์ฑ์ ๋์ฌ์ฃผ๋ ์ญํ ์ ํ๋ค. ๋ค์ํ ํ์
์ด ๋์ผํ ํ๋กํ ์ฝ์ ๊ตฌํํ ์ ์๊ธฐ ๋๋ฌธ์, ์ด๋ค์ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ๋ค๋ฃฐ ์ ์๋ค. ๋ํ, ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ฉด ํ์
๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ , ์์กด์ฑ์ ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด์ค๋ค.
๋ช ๊ฐ์ง ์ฃผ์ ํ๋กํ ์ฝ
1. Equatable
Equatable ํ๋กํ ์ฝ์ ํ์
์ ์ธ์คํด์ค๋ค์ ์๋ก ๋น๊ตํ ์ ์๋๋ก ํด์ฃผ๋ ํ๋กํ ์ฝ์ด๋ค. ์ด๋ฅผ ์ค์ํ๋ ํ์
์ ๋๋ฑ ๋น๊ต ์ฐ์ฐ์(==)๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์คํด์ค๋ค์ ๋น๊ตํ ์ ์๋ค.
2. Comparable
Comparable ํ๋กํ ์ฝ์ ํ์
์ ์ธ์คํด์ค๋ค์ ์์๋๋ก ๋น๊ตํ ์ ์๋๋ก ํด์ฃผ๋ ํ๋กํ ์ฝ์ด๋ค. ์ด๋ฅผ ์ค์ํ๋ ํ์
์ ๋น๊ต ์ฐ์ฐ์(<, >, <=, >=)๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์คํด์ค๋ค์ ๋น๊ตํ๊ณ ์ ๋ ฌํ ์ ์๋ค.
3. CustomStringConvertible
CustomStringConvertible ํ๋กํ ์ฝ์ ํ์
์ ์ธ์คํด์ค๋ฅผ ๋ฌธ์์ด๋ก ํํํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ ์ ์ํ๋ ํ๋กํ ์ฝ์ด๋ค. ์ด๋ฅผ ์ค์ํ๋ ํ์
์ description์ด๋ผ๋ ์์ฑ์ ๊ตฌํํ์ฌ ์ธ์คํด์ค๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ ์ ์๋ค.
4. UITableViewDelegate, UITableViewDataSource
UITableViewDelegate์ UITableViewDataSource ํ๋กํ ์ฝ์ ํ
์ด๋ธ ๋ทฐ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ฌ์ฉ์์ ์
๋ ฅ์ ๋์ํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ ์ ์ํ๋ ํ๋กํ ์ฝ์ด๋ค. UITableViewDelegate๋ ํ
์ด๋ธ ๋ทฐ์ ๋์์ ์ปค์คํฐ๋ง์ด์ฆํ๊ณ , UITableViewDataSource๋ ํ
์ด๋ธ ๋ทฐ์ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ ๊ณตํ๋ ์ญํ ์ ํ๋ค.
5. URLSessionDelegate, URLSessionDataDelegate
URLSessionDelegate์ URLSessionDataDelegate ํ๋กํ ์ฝ์ ๋คํธ์ํฌ ์์
์ ๊ด๋ฆฌํ๊ณ ์๋ต ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ์ ์ ์ํ๋ ํ๋กํ ์ฝ์ด๋ค. URLSessionDelegate๋ ๋คํธ์ํฌ ์์
์ ์ํ ๋ณํ๋ฅผ ์ฒ๋ฆฌํ๊ณ , URLSessionDataDelegate๋ ์๋ต ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ณ ์ฒ๋ฆฌํ๋ ์ญํ ์ ํ๋ค.
์ด ์ธ์๋ ๋ค์ํ ํ๋กํ ์ฝ์ด ์ค์ํํธ์์ ์ ๊ณต๋๋ฉฐ, ํ์์ ๋ฐ๋ผ ์ง์ ํ๋กํ ์ฝ์ ์ ์ํ์ฌ ์ฌ์ฉํ ์๋ ์๋ค.
1. Equatable
struct Point: Equatable {
var x: Int
var y: Int
}
let point1 = Point(x: 3, y: 5)
let point2 = Point(x: 3, y: 5)
if point1 == point2 {
print("๋ ์ ์ ๋์ผํฉ๋๋ค.")
} else {
print("๋ ์ ์ ๋ค๋ฆ
๋๋ค.")
}
์์ ์์์์ `Point` ๊ตฌ์กฐ์ฒด๋ `Equatable` ํ๋กํ ์ฝ์ ์ค์ํ๊ณ ์๋ค. ์ด๋ก ์ธํด ๋ ๊ฐ์ `Point` ์ธ์คํด์ค๋ฅผ `==` ์ฐ์ฐ์๋ก ๋น๊ตํ ์ ์๊ฒ ๋๋ค.
2. CustomStringConvertible
struct Person: CustomStringConvertible {
var name: String
var age: Int
var description: String {
return "์ด๋ฆ: \(name), ๋์ด: \(age)์ธ"
}
}
let person = Person(name: "John", age: 30)
print(person)
์์ ์์์์ `Person` ๊ตฌ์กฐ์ฒด๋ `CustomStringConvertible` ํ๋กํ ์ฝ์ ์ค์ํ๊ณ ์๋ค. ์ด๋ก ์ธํด `person` ์ธ์คํด์ค๋ฅผ `print` ํจ์๋ก ์ถ๋ ฅํ ๋, `description` ์์ฑ์ด ์ฌ์ฉ๋์ด "์ด๋ฆ: John, ๋์ด: 30์ธ"๋ผ๋ ๋ฌธ์์ด์ด ์ถ๋ ฅ๋๋ค.
3. UITableViewDelegate
class MyTableViewController: UIViewController, UITableViewDelegate {
// ...
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// ํน์ ์
์ด ์ ํ๋์์ ๋ ์คํ๋๋ ๋ก์ง
}
// ...
}
์์ ์์์์ `MyTableViewController` ํด๋์ค๋ `UIViewController`๋ฅผ ์์ํ๊ณ , `UITableViewDelegate` ํ๋กํ ์ฝ์ ์ค์ํ๊ณ ์๋ค. ์ด๋ก ์ธํด ํด๋น ํด๋์ค๋ ํ
์ด๋ธ ๋ทฐ์ ๋์์ ์ปค์คํฐ๋ง์ด์ฆํ๊ธฐ ์ํ ๋ฉ์๋๋ฅผ ๊ตฌํํ ์ ์๋ค. `didSelectRowAt` ๋ฉ์๋๋ ํน์ ์
์ด ์ ํ๋์์ ๋ ์คํ๋๋ ๋ก์ง์ ๊ตฌํํ ์์์ด๋ค.
์ด๋ ๊ฒ ๋ค์ํ ์ํฉ์์ ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ๊ธฐ๋ฅ์ ์ ์ํ๊ณ ํ์ํ ๊ณณ์์ ์ ์ ํ ํ์
์ ํ๋กํ ์ฝ์ ์ฑํํ๋ฉด ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ฐ์ฑ์ ๋์ผ ์ ์๋ค.
์์ง๋ ํ๋กํ ์ฝ์ ์! ์จ์ผํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด
ํ๋กํ ์ฝ ์ฌ์ฉํ ๋
protocol Drawable {
func draw()
}
struct Circle: Drawable {
func draw() {
print("์์ ๊ทธ๋ฆฝ๋๋ค.")
}
}
struct Rectangle: Drawable {
func draw() {
print("์ฌ๊ฐํ์ ๊ทธ๋ฆฝ๋๋ค.")
}
}
func drawShapes(_ shapes: [Drawable]) {
for shape in shapes {
shape.draw()
}
}
let circle = Circle()
let rectangle = Rectangle()
drawShapes([circle, rectangle])
์์ ์ฝ๋๋ Drawable์ด๋ผ๋ ํ๋กํ ์ฝ์ ์ ์ํ๊ณ , Circle๊ณผ Rectangle ๊ตฌ์กฐ์ฒด๊ฐ ์ด ํ๋กํ ์ฝ์ ์ค์ํ๋๋ก ๊ตฌํํ์๋ค.
๊ทธ๋ฆฌ๊ณ drawShapes ํจ์๋ Drawable ํ๋กํ ์ฝ์ ์ค์ํ๋ ๊ฐ์ฒด๋ค์ ๋ฐฐ์ด์ ์ธ์๋ก ๋ฐ์ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ ๊ธฐ๋ฅ์ ์ํํ๋ค.
ํ๋กํ ์ฝ์ ์ฌ์ฉํจ์ผ๋ก์จ ์ป์ ์ ์๋ ์ด์ ์ ๋ค์๊ณผ ๊ฐ๋ค
- ๋ค์ํ ๋ํ์ ๊ทธ๋ฆฌ๋ ํจ์ drawShapes์์ Drawable ํ๋กํ ์ฝ์ ์ค์ํ๋ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋ฐ์ ์ ์๋ค. ์ฆ, Circle๊ณผ Rectangle ์ด์ธ์ ๋ค๋ฅธ ๊ตฌ์กฐ์ฒด๋ ํด๋์ค๋ drawShapes ํจ์์ ์ ๋ฌํ ์ ์๋ค.
- ์๋ก์ด ๋ํ์ ์ถ๊ฐํ๊ธฐ ์ํด Drawable ํ๋กํ ์ฝ์ ์ค์ํ๋ ๊ตฌ์กฐ์ฒด๋ฅผ ์ถ๊ฐ๋ก ๊ตฌํํ๋ฉด ๋๋ค. ๊ธฐ์กด์ ์ฝ๋๋ฅผ ์์ ํ ํ์๊ฐ ์์ผ๋ฉฐ, ์ด๋ฏธ ๊ตฌํ๋ drawShapes ํจ์๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค.
- Drawable ํ๋กํ ์ฝ์ ์ค์ํ๋ ๊ฐ์ฒด๋ค์ draw ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํ๋ค. ์ด๋ก์จ ํด๋น ๊ฐ์ฒด๋ค์ ๋ํ์ ๊ทธ๋ฆฌ๋ ๊ณตํต๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ฒ ๋๋ค.
ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ง ์์ ๋
struct Circle {
func draw() {
print("์์ ๊ทธ๋ฆฝ๋๋ค.")
}
}
struct Rectangle {
func draw() {
print("์ฌ๊ฐํ์ ๊ทธ๋ฆฝ๋๋ค.")
}
}
func drawShapes(_ shapes: [Any]) {
for shape in shapes {
if let drawable = shape as? Drawable {
drawable.draw()
}
}
}
let circle = Circle()
let rectangle = Rectangle()
drawShapes([circle, rectangle])
์์ ์ฝ๋๋ Drawable ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ง ์๊ณ Circle๊ณผ Rectangle ๊ตฌ์กฐ์ฒด๋ฅผ ๊ตฌํํ ์์์ด๋ค.
drawShapes ํจ์๋ Any ํ์
์ ๊ฐ์ฒด ๋ฐฐ์ด์ ์ธ์๋ก ๋ฐ๊ณ , ๊ฐ์ฒด๊ฐ Drawable ํ๋กํ ์ฝ์ ์ค์ํ๋์ง ๊ฒ์ฌํ ํ์ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ ๊ธฐ๋ฅ์ ์ํํ๋ค.
ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ์ ์ด ์๋ค
drawShapes ํจ์๋ Any ํ์
์ ๋ฐฐ์ด์ ๋ฐ์ ๊ฐ์ฒด์ ํ์
์ ๊ฒ์ฌํด์ผ ํ๋ค. ์ด๋ก ์ธํด ํ์
์์ ์ฑ์ด ๋จ์ด์ง๊ณ , ์คํ ์๊ฐ์ ํ์
์บ์คํ
์ด ํ์ํ๊ฒ ๋๋ค.
์๋ก์ด ๋ํ์ ์ถ๊ฐํ๊ธฐ ์ํด์๋ drawShapes ํจ์์ ๊ตฌํ์ ์์ ํด์ผ ํ๋ค. ์ด๋ฏธ ๊ตฌํ๋ ํจ์๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ค๋ฅ ๊ฐ๋ฅ์ฑ์ ๋์ด๊ณ ๊ธฐ์กด ์ฝ๋์์ ํธํ์ฑ์ ํด์น๋ ์์๊ฐ ๋๋ค.
๊ฐ์ฒด๋ค์ draw ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํ์ง๋ง, ์ด๋ฅผ ๊ฐ์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค. ๋ฐ๋ผ์, ๊ทธ๋ ์ง ์์ ๊ฐ์ฒด๋ฅผ drawShapes ํจ์์ ์ ๋ฌํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๊ฒฐ๋ก
์ด์ ๊ฐ์ด ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ฉด ์ฝ๋์ ์ ์ฐ์ฑ, ์ฌ์ฌ์ฉ์ฑ, ํ์ฅ์ฑ์ด ํฅ์๋๋ฉฐ, ์ธํฐํ์ด์ค์ ๋ช ์ํ์ ํ์ ์ ์ํํ๊ฒ ํ ์ ์๋ค!
๋๊ธ