์๋ ํ์ธ์! ๊ฐ์์ ๋๋ค. ์์ฆ ๋งฅ๋ถ์ด ๋์ฐฉํ๊ธฐ ์ ์ ์์ฑ์ผ๋ก ์ค์ํํธ ๋ฌธ๋ฒ ๊ฐ์๋ฅผ ๋ฃ๊ณ ์๋๋ฐ,, 2์ ์ด์ ๋ฐฐ์ก๋ ๊ฑฐ๋ผ๊ณ ํ๋ ๋งฅ๋ถ์ด ์ดํ ๋ค์ ์ฌ๊ฒ ๊ฐ์์... *_* ๋๋ฌด ์ ๋ฉ๋๋ค. ์ผ๋ฅธ ๊ธฐ์ด ํํํ๊ฒ ์๊ณ ๊ฐ๋ฐํ๊ณ ์ถ๋ค์! ๊ทธ๋ผ go!
Struct์ Class
Swift์๋ ๊ตฌ์กฐ์ฒด์ ํด๋์ค๊ฐ ์๋ค. ๊ตฌ์กฐ์ฒด์ ํด๋์ค๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฉ๋์ ๋ง๊ฒ ํํํ๊ณ ์ํ ๋ ์ฉ์ดํ๊ฒ ์ฌ์ฉ๋๋ค. ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ์ ๊ธฐ๋ฅ์ ๊ฐ์ง ์ ์์ด์ ํ๋์ ์๋ก์ด ์ฌ์ฉ์์ ์ ๋ฐ์ดํฐํ์ ์ ๋ง๋ค์ด์ค ์ ์๋ค. Swift์์ ๊ตฌ์กฐ์ฒด์ ํด๋์ค์ ์ฌ์ฉ ๋ฌธ๋ฒ์ ๋น์ทํ์ง๋ง, ์ฐจ์ด์ ์ ๋ถ๋ช ํ ์กด์ฌํ๋ค.
๊ตฌ์กฐ์ฒด์ ์ธ์คํดํธ๋ ๊ฐํ์ ์ด๊ณ , ํด๋์ค์ ์ธ์คํด์ค๋ ์ฐธ์กฐํ์ ์ด๋ค. ์ด ๋ด์ฉ์ ์๋์์ ์กฐ๊ธ ๋ ์์ธํ ๋ค๋ค๋ณด๊ฒ ๋ค.
struct (๊ตฌ์กฐ์ฒด)
struct์ ๊ธฐ๋ณธ ํํ๋ ์๋์ ๊ฐ๋ค. struct ๋ธ๋ก์์ ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ์ ์ํ ์์๋ค. ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ํฉ์ณ์ struct์ ๋งด๋ฒ๋ผ๊ณ ํํํ๋ค. ๋งด๋ฒ๋ณ์๋ผ๊ณ ํ๋ฉด ํ๋กํผํฐ๋ฅผ ์๋ฏธํ๋ค.
struct ๊ตฌ์กฐ์ฒด ์ด๋ฆ {
ํ๋กํผํฐ์ ๋ฉ์๋
}
struct ๊ตฌ์กฐ์ฒด์ ์ฌ์ฉ ๋ฐฉ๋ฒ
์ ์ ์ ์ ๋ณด๋ฅผ ๊ตฌ์ฑํ๋ ๊ตฌ์กฐ์ฒด๋ฅผ ์ ์ํด๋ณด์. ๋๋ถ๋ถ์ ๋ณ์๋ ์๋ฌธ์๋ก ์์ํ๋๊ฒ ๊ท์น?์์?์ง๋ง, ํด๋์ค๋ ๊ตฌ์กฐ์ฒด๋ ๋๋ฌธ์๋ก ์์ํ๋๊ฒ์ด ๊ท์น?์์?๋ผ๊ณ ํ๋ค. ใ ใ ์ด๋ฅผ ์ฐธ๊ณ ํด์ ์ด์ ์ด๋ฆ์ ๋ง๋ค์ด๋ณด์!
struct User {
var nickname: String
var age: Int
}
/* ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ธ์คํด์ค๋ฅผ ์์ฑํด์ค์ผํ๋ค
์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค๋ ๊ฒ์ ๊ตฌ์กฐ์ฒด๋ ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ธฐ์ํด์
๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฑํด์ค๋ค๋ ์๋ฏธ์ด๋ค. ์์ฑ๋ ํด๋์ค , ๊ตฌ์กฐ์ฒด์ ์ค์ฒด ๋ผ๊ณ ์๊ฐํ์. */
var user = User(nickname: "potata", age: 25)
user.nickname // ์ด๋ฐ์์ผ๋ก ์ธ์คํด์ค์ nickname๊ณผ age์ ์ ๊ทผํ ์์๋ค.
// ํ๋กํผํฐ ๊ฐ ๋ณ๊ฒฝ
user.nickname = "ABC"
user.nickname
// prints "ABC" ๊ฐ์ด ๋ณ๊ฒฝ๋์๋ค.
์ฐธ๊ณ ) user ๋ณ์๋ฅผ ์ ์ํ๋ฉด์ ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํ ๋ ์ด๋ ๊ฒ ์๋์ผ๋ก ๋จ๊ฒ ๋๋ค. ๊ตฌ์กฐ์ฒด ์์ ๋ฐ๋ก ์์ฑ์๋ฅผ ์ ์ธ์์ผ์ฃผ์ง ์์๋๋ฐ, ์์ฑ์๋ก ๊ฐ์ ์ด๊ธฐํํ ์ ์๊ฒ ๋์จ๋ค. ๊ตฌ์กฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ํ๋กํผํฐ๋ฅผ ์ด๊ธฐํํ๊ณ ์ํ ๋ ๋ฐ๋ก ์์ฑ์๋ฅผ ์๋ง๋ค์ด์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฑ์๊ฐ ๋ง๋ค์ด์ง๋ค. ์ด๋ ๊ฒ ์๋์ผ๋ก ๋ง๋ค์ด์ง ์์ฑ์์ ๋งค๊ฐ๋ณ์๋ ๊ตฌ์กฐ์ฒด์ ํ๋กํผํฐ ์ด๋ฆ์ผ๋ก ์๋ ์ง์ ๋๋ค.
๊ตฌ์กฐ์ฒด ์์๋ ํ๋กํผํฐ ๋ง๊ณ ๋ฉ์๋(ํจ์)๋ ์ ์ ๊ฐ๋ฅํ๋ค.
struct User {
var nickname: String
var age: Int
func information() {
print("\(nickname), \(age)")
}
}
๊ตฌ์กฐ์ฒด ์์ ์๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ค๋ฉด ํ๋กํผํฐ๊ฐ์ ์ ๊ทผํ๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก . ์ ์ผ๋ก ์ฐ๊ฒฐํด์ฃผ๋ฉด ๋๋ค.
var user = User(nickname: "potato", age: 25)
user.information()
// User๊ตฌ์กฐ์ฒด์ ์ ์์ information ํจ์๊ฐ ํธ์ถ๋๋ฉด์ ๋๋ค์๊ณผ ๋์ด๊ฐ ์ถ๋ ฅ๋๋ค.
// prints "potato, 25"
Class (ํด๋์ค)
ํด๋์ค๋ฅผ ์ ์ํ๊ณ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ตฌ์กฐ์ฒด์ ๋งค์ฐ ๋น์ทํ๋ค. ํด๋์ค๋ classํค์๋๋ก ์ ์ํ๊ณ class ๋ธ๋ก์์ ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์๋ค. ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ๋ ์๋์ ๊ฐ๋ค.
class ํด๋์ค ์ด๋ฆ {
ํ๋กํผํฐ์ ๋ฉ์๋
}
๊ฐ์์ง์ ์ ๋ณด๋ฅผ ๊ตฌ์ฑํ๋ ํด๋์ค๋ฅผ ์์ฑํด๋ณด์.
class Dog {
var name: String = ""
var age: Int = 0
init() {
}
//๋ฉ์๋ ์ ์
func introduce() {
print("name \(name), age \(age)")
}
}
var dog = Dog() // ์ธ์คํด์คํ (์ด๋ ๊ฒ ๋ณ์์ ๊ตฌ์กฐ์ฒด,ํด๋์ค๋ฅผ ์ง์ ํด์ค๊ฒ์ ์ธ์คํด์ค๋ผ๊ณ ํ๋ค.
dog.name = "coco"
dog.age = 3
dog.name // prints "coco"
dog.age // prints "3"
โท class์์๋ ์์ฑ์๋ฅผ ์ ์ํด์ค์ผํ๋ค. ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ์ด๊ธฐํํ๊ณ ์ํ ๋ ๊ธฐ๋ณธ์ ์ธ ์์ฑ์๋ฅผ ์ฌ์ฉํ๋ค. ์์ฑ์๋ฅผ ๋ฐ๋ก ์ ์ ์ํด์ค๋ init() { } ์์ฑ์๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฑ๋๋ค. ์ ์ฝ๋์ ๊ฒฝ์ฐ ํ๋กํผํฐ๋ฅผ ์์ฑํ ๋ ๊ฐ์ ์ด๊ธฐํํด์ฃผ์๋๋ฐ ์์ฑ์๋ฅผ ํตํด์๋ ๊ฐ์ ์ด๊ธฐํํ ์ ์๋ค. ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ๋ํ ๋ด์ฉ์ ๋ค์๊ธ์์ ํฌ์คํ ํ๊ฒ ๋ค.
๊ตฌ์กฐ์ฒด์ ๋ง์ฐฌ๊ฐ์ง๋ก . ์ ์ ์ด์ฉํด์ ๋ฉ์๋๋ฅผ ํธ์ถํด์ฃผ๋ฉด๋๋ค.
dog.introduce()
// prints "name coco, age 3"
Struct์ Class ๊ณตํต์ (๊ตฌ์กฐ์ฒด์ ํด๋์ค์ ๊ณตํต์ )
- ๋ณ์๋ ์์์ ๊ฐ์ ์ ์ฅํ๋ ํ๋กํผํฐ๋ฅผ ์ ์ํ ์ ์๋ค.
- ํจ์(๋ฉ์๋)๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํด๋์ค, ๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ค.
- init ๋ฉ์๋๋ฅผ ๋์ด์ ๊ฐ์ฒด๋ฅผ ์ํ๋ ํํ๋ก ์ค์ ํด์ฃผ๋ ์ด๊ธฐํ ๋ธ๋ก์ ์ ์ํ ์ ์๋ค.
- ๊ฐ์ฒด ํจ์์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ํ์ฅ(extends) ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค.
- ์์ฑ๊ฐ์ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ์๋ธ์คํฌ๋ฆฝํธ๋ฅผ ์ ์ํ ์ ์๋ค. (get, set)
- ํน์ ํ์์ ํจ์์ ํ์ค์ ์ ๊ณตํ๊ธฐ ์ํ ํ๋กํ ์ฝ์ ๊ตฌํํ ์ ์๋ค.
Struct์ Class ์ฐจ์ด์ (๊ตฌ์กฐ์ฒด์ ํด๋์ค์ ์ฐจ์ด์ )
โถ Class (ํด๋์ค)
- ์ฐธ์กฐ ํ์ ์ด๋ค.
- ARC๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ค.
- ๊ฐ์ ํด๋์ค ์ธ์คํด์ค๋ฅผ ์ฌ๋ฌ ๊ฐ์ ๋ณ์์ ํ ๋นํ ๋ ๊ฐ์ ๋ณ๊ฒฝ์ํค๋ฉด ํ ๋นํ ๋ชจ๋ ๋ณ์์ ์ํฅ์ ์ค๋ค. (๋ฉ๋ชจ๋ฆฌ๋ง ๋ณต์ฌ)
- ์์์ด ๊ฐ๋ฅํ๋ค.
- ํ์ ์บ์คํ ์ ํตํด ๋ฐํ์์์ ํด๋์ค ์ธ์คํด์ค์ ํ์ ์ ํ์ธํ ์ ์๋ค.
- deinit์ ์ฌ์ฉํด์ ํด๋์ค ์ธ์คํด์ค์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํด์ ํ ์ ์๋ค.
โถ Struct (๊ตฌ์กฐ์ฒด)
- ๊ฐํ์ ์ด๋ค.
- ๊ตฌ์กฐ์ฒด ๋ณ์๋ฅผ ์๋ก์ด ๋ณ์์ ํ ๋นํ ๋๋ง๋ค ์๋ก์ด ๊ตฌ์กฐ์ฒด๊ฐ ํ ๋น๋๋ค.
- ์ฆ ๊ฐ์ ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ๋ฌ ๊ฐ์ ๋ณ์์ ํ ๋นํ ๋ค ๊ฐ์ ๋ณ๊ฒฝ์ํค๋๋ผ๋ ๋ค๋ฅธ ๋ณ์์ ์ํฅ์ ์ฃผ์ง ์๋๋ค. (๊ฐ ์์ฒด๋ฅผ ๋ณต์ฌ)
1) ๊ฐ ํ์ , ์ฐธ์กฐ ํ์ ์ ์ฐจ์ด ์ดํด๋ณด๊ธฐ
dev_pingu ๋์ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ์ฌ ๊ธ ์์ฑํ์์ต๋๋ค :)
class SimpleClass {
var count: Int = 0
deinit {
print("ํ ๋น ํด์ ")
}
}
struct SimpleStruct {
var count: Int = 0
}
๊ฐ๋จํ ํด๋์ค์ ๊ตฌ์กฐ์ฒด๋ฅผ ์ ์ํ์๋ค. ์ด์ ์ด ์ฝ๋๋ฅผ ํ์ฉํ์ฌ ๊ฐํ์ ์ด ๋ฌด์์ธ์ง, ์ฐธ์กฐํ์ ์ด ๋ฌด์์ธ์ง ์ดํด๋ณด์.
var class1 = SimpleClass()
var class2 = class1
var class3 = class1
class3.count = 3
print(class1.count)
// prints "3"
๋จผ์ SimpleClass ํด๋์ค๋ฅผ ํ์ฉํ์ฌ ์๋ก์ด ์ธ์คํด์ค์ ์ง์์ ์ ๋ฃ์ด์ฃผ๊ณ , ๋ง์ง๋ง์ class3์ ๊ฐ์ ๋ณ๊ฒฝ์์ผ ์ฃผ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ ๋ง์ง๋ง์ class1์ printํด๋ณด๋ class3์ ๋ณ๊ฒฝํ ๊ฐ์ธ 3์ด ์ถ๋ ฅ๋๋๋ผ. ์ด์ ์์์ ๋งํ "๋ฉ๋ชจ๋ฆฌ๋ง ๋ณต์ฌ"๋ผ๋ ๋ง์ด ์ดํด๊ฐ๋๋ค. ํด๋์ค๋ ์ฐธ์กฐ ํ์ ์ด๋ผ ๊ฐ์ ํด๋์ค ๊ฐ์ฒด๋ฅผ ํ ๋นํ ๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝ์ํค๋ฉด ์ฐธ์กฐ๋ ๊ฐ์ฒด์ ๊ฐ์ด ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ณต์ฌํ๋ค๊ณ ํํํ ๊ฒ์ด๋ค. ๊ทธ๋ผ ์ด์ ๊ตฌ์กฐ์ฒด๋ฅผ ์ดํด๋ณด์.
var strunct1 = SimpleStruct()
var struct2 = struct1
var struct3 = struct1
struct2.count = 2
struct3.count = 3
print(struct1.count) // prints "0"
print(struct2.count) // prints "2"
print(struct3.count) // prints "3"
๊ตฌ์กฐ์ฒด๋ ๊ฐ ํ์ ์ด๊ธฐ ๋๋ฌธ์, ๊ฐ ์์ฒด๋ฅผ ๋ณต์ฌํ๋ค. ๋ฐ๋ผ์ ๊ฐ์ ๊ตฌ์กฐ์ฒด ๊ฐ์ฒด๋ฅผ ํ ๋นํ๋๋ผ๋ ๋งค๋ฒ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋์ด ๊ฐ์ ๋ณ๊ฒฝํ๋๋ผ๋, ๋ค๋ฅธ ๊ตฌ์กฐ์ฒด ๋ณ์์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
๋ง๋ฌด๋ฆฌ
์ถ๊ฐ๋ก ์์๋ด์ผํ ๊ฐ๋ ๋ค์ด ๋ง์ต๋๋ค. ARC๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋๊ฒ ๋ญ์ง, ๋ฉ๋ชจ๋ฆฌ๋ ์ด๋ป๊ฒ ํ ๋นํ๋์ง ๋ฑ์ ๋ํ ๊ฐ๋ ๋ง์ ๋๋ค. ์ด๋ ๊ธฐ์ด ๋ฌธ๋ฒ ๋ง๊ณ ์ถํ ๋ค๋ฅธ ํฌ์คํ ์ผ๋ก ์ฐพ์๋ต๋๋ก ํ ๊ฒ์. ์ ๊ฐ ์ฐธ๊ณ ํ ํ๊ตฌ๋์ ๋ธ๋ก๊ทธ๋ ์๋ ๋งํฌ์ ๊ฑธ์ด๋๊ฒ ์ต๋๋ค.