์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- components
- nodejs
- RxSwift
- Cloud Firestore
- Core Data
- SWiFT
- Filter
- Encodable
- CRUD
- ํ๋ก๊ทธ๋๋จธ์ค
- Figma
- String.Index
- ExpressJS
- ios
- Codable
- UIRefreshController
- MongoDB
- AVAudioPlayer
- Firestore
- Reduce
- ์๊ณ ๋ฆฌ์ฆ
- mongoose
- ์ง๋ฒ๋ณํ
- Mac
- Firestore CRUD
- map
- Decodable
- ์ฑ๋ง๋ค๊ธฐ
- ์ฑ๋์์ธ
- DispatchQueue
- Today
- Total
Focus On Develop ๐ค๐ค
[Swift] Class vs Struct ๋ณธ๋ฌธ
์ด๋ฒ ํฌ์คํ ์์๋ ๋งค์ฐ ๊ธฐ๋ณธ์ด๋ฉด์๋, ๋งค์ฐ ์ค์ํ Class์ Struct์ ๋ํด์ ์ข ์ดํด๋ณด๋ ค๊ณ ํด์!
๋์๋ณด๋ค ๋ณด๋, ์ด๋ฐ Swift์ ๋ํด ๊ธฐ๋ณธ์ด์ง๋ง ๋งค์ฐ ์ค์ํ ๋ด์ฉ๋ค์ ๋ฐ๋ก ๋ค๋ฃจ์ง ์์๋ ๊ฒ ๊ฐ์์ ์ข ๋ค๋ฃจ๋ ค๊ณ ์!! ๐ง๐ป
๋จผ์ Struct์ Class๋ ์ฌ์ฉ์๊ฐ ์์๋ก ๋ง๋ "๋ฐ์ดํฐ ํ์ "์ด์์.
๋ฐ์ดํฐ๋ฅผ ํน์ ์ฉ๋์ ๋ง๊ฒ ๋ฌถ์ด ํํํ๊ณ ์ ํ ๋, ๋ด๋ถ์์ ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ์ ์ํด์ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ ํ์ ์ด ๋ ์ ์์ด์.
๋จผ์ ๊ฐ๋ตํ๊ฒ ๊ณตํต์ ๊ณผ ์ฐจ์ด์ ์ ์์ฝํด๋ณด๊ณ , ์ค์ํ ์ฐจ์ด์ ์ ๋ํด์๋ ์ข ๋ ์ดํด๋ณผ๊ฒ์!
๊ณตํต์
- ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํ ํ๋กํผํฐ ์ ์ ๊ฐ๋ฅ
- ๊ธฐ๋ฅ ์คํ์ ์ํ ๋ฉ์๋ ์ ์ ๊ฐ๋ฅ
- initializer(์์ฑ์) ์ ์ ๊ฐ๋ฅ
- extension ์ ํตํ ํ์ฅ ๊ฐ๋ฅ
- protocol ์ฑํ ๊ฐ๋ฅ
์ฐจ์ด์
struct
- Value Type
- stack ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ ์ฅ
- ์ฐธ์กฐ์ ๋ํด ์ถ์ ์ด ๋ถํ์ํด์ ์๋๊ฐ ๋น ๋ฆ
- ์์ ๋ถ๊ฐ๋ฅ
- AnyObject๋ก ํ์ ์บ์คํ ์ด ๋ถ๊ฐ๋ฅ
- ์์ฑ์๋ฅผ ๊ตฌํํ์ง ์์ ์ ๊ธฐ๋ณธ ์์ฑ์ ์ฌ์ฉ ๊ฐ๋ฅ
class
- Reference Type
- heap ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ ์ฅ
- ์ฐธ์กฐ์ ๋ํ ์ถ์ ์ด ํ์ํด์ ์๋๊ฐ ๋๋ฆผ
- ์์ ๊ฐ๋ฅ
- Reference Count๊ฐ ์ ์ฉ (ARC ์์๋ณด๊ธฐ)
- deinitializer(์๋ฉธ์) ์ ์ ๊ฐ๋ฅ
์ด ์ค์์, ๊ฐ์ฅ! ์ค์ํ ์ฐจ์ด์ ์ value type์ธ์ง, reference type์ธ์ง ์์.
์ด ๋๊ฐ์ง์ ๊ทผ๋ณธ์ ์ธ ์ฐจ์ด์ ์ ์ด๋ฏธ ๋ง๋ค์ด์ง ์ธ์คํด์ค๋ก ๊ฐ์ ํ ๋นํ ๋, ๊ฐ์ด ๋ณต์ฌ๋๋์ง, ์๋๋ฉด ๊ฐ์ด ์ ์ฅ๋์ด ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฐธ์กฐํ๊ฒ ๋๋์ง์์.
์ ๋ง ๊ฐ๋จํ์ฃ ? ๊ทธ๋ฐ๋ฐ๋ ์ค์ํ๊ฒ ๋ค๋ค์ง๋ ์ด์ ๋, ์ด ๊ทผ๋ณธ์ ์ธ ์ด์ ๋ก ์ธํด ์ฑ์ ์ฑ๋ฅ์ด ์ข์ฐ๋๊ธฐ๋ ํ๊ณ , Crash๋ก ๋ถํฐ ์ํํ๊ฑฐ๋ ํน์ ์์ ํ๊ฒ ๋ ์๋ ์๊ธฐ ๋๋ฌธ์ด์์.
์์๋ฅผ ํ๋ฒ ๋ค๋ฉด์ ์ดํด๋ณผ๊ฒ์.
struct Cat {
var name: String
var age: Int
}
class Dog {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
๋จผ์ ๊ณ ์์ด๋ struct๋ก, ๊ฐ์์ง๋ class๋ก ๋ง๋ค์ด ์คฌ์ด์.
Dog๋ ๋ช ์์ ์ผ๋ก init์ ์จ์ค ๊ฒ ๋ณด์ด์๋์~? ์์์ ๋ดค๋ฏ์ด struct๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฑ์๋ฅผ ์์ฑํด์ฃผ๊ธฐ ๋๋ฌธ์ด์์.
๊ทธ๋ผ ๊ฐ๊ฐ ์ฐจ์ด๋ฅผ ํ์ธํ๊ธฐ ์ํด ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด๋ณผ๊ฒ์.
var cat1 = Cat(name: "cat1", age: 3)
var cat2 = cat1
cat2.name = "cat2"
cat2.age = 5
print("cat1 -> name : \(cat1.name), age: \(cat1.age)") // cat1 -> name : cat1, age: 3
print("cat2 -> name : \(cat2.name), age: \(cat2.age)") // cat2 -> name : cat2, age: 5
cat1์ Cat์ ์ธ์คํด์ค๋ก ๋ง๋ค์ด์ฃผ๊ณ , cat2์ ํ ๋นํด์คฌ์ด์. ๊ทธ๋ฆฌ๊ณ cat2์ ์ด๋ฆ๊ณผ ๋์ด๋ฅผ ๋ณ๊ฒฝํด์คฌ์ด์.
๊ทธ๋ฆฌ๊ณ cat1, cat2์ ๋ํ ์ ๋ณด๋ฅผ ์ถ๋ ฅํด๋ณด๋.. ๋๊ฐ๊ฐ ์๋ก ๋ค๋ฅด์ฃ !?
์ด๊ฒ ์ ๋ง ์ฌ์ํ์ง๋ง, ์ค์ํ ๋ถ๋ถ์ด์์!!
var cat2 = cat1
์ด๋ ๊ฒ cat2์ ํ ๋นํด์ฃผ๋ ๊ณผ์ ์์, valueํ์ ์ ๊ฐ๋ณต์ฌ๊ฐ ์ผ์ด๋์. struct๋ valueํ์ ์ด๋๊น, ์ด์๊ฐ์ ๊ฐ๋ณต์ฌ๊ฐ ๋ฐ์ํด์. ์ฆ, cat2๋ cat1๊ณผ ๋๊ฐ์ ์ด๋ฆ๊ณผ ๋์ด๋ฅผ ๊ฐ์ง ์๋ก์ด ์ธ์คํด์ค์ธ๊ฑฐ์ฃ !
๊ทธ๋์ cat2์ ์ด๋ฆ๊ณผ ๋์ด๋ฅผ ๋ฐ๊ฟ์คฌ์๋, cat1๊ณผ๋ ์๊ด ์์ด ์๋ก์ด ์ธ์คํด์ค์ธ cat2์ ์ ๋ณด๋ง ๋ฐ๋๊ฑฐ๋๋๋ค!
๋ง์ฐฌ๊ฐ์ง๋ก ์ฐ๋ฆฌ๊ฐ ๋ง์ด ์ฌ์ฉํ๋ Array, Set, Dictionary ๋ฑ์ ์ด๊ฑฐํ ํ์ ์ด๋, Int, Double, String, Bool ๋ฑ ๋ฐ์ดํฐํ์ ์ ๋ชจ๋ Value Type์ด์์.
๋ฐ๋ฉด์.. classํ์ ์ธ ๊ฐ์์ง์ ๋ํด์ ๋~๊ฐ์ ๊ฑธ ํด๋ณผ๊ฒ์.
var dog1 = Dog(name: "dog1", age: 3)
var dog2 = dog1
dog2.name = "dog2"
dog2.age = 5
print("dog1 -> name : \(dog1.name), age: \(dog1.age)") // dog1 -> name : dog2, age: 5
print("dog2 -> name : \(dog2.name), age: \(dog2.age)") // dog2 -> name : dog2, age: 5
์ด๋ผ~~? ์ด๋ฒ์๋ dog2๋ฅผ ๋ฐ๊ฟ์คฌ๋๋ dog1๋ ๊ฐ์ด ๋ฐ๋์ด ๋ฒ๋ ธ์ฃ !?
์ด๊ฒ ๋ฐ๋ก reference ํ์ ์ด ํ ๋น๋ ๋๋ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ๋๊ฒ ์๋๋ผ, ๊ธฐ์กด ์ธ์คํด์ค์ธ dog1๋ฅผ "์ฐธ์กฐ"ํ๊ฒ ๋์. ์ฆ dog1์ด๋ dog2๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ด๋ค ๋์ผํ ๊ณณ์ ์กด์ฌํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ด์ฃ !
๋ ๋ค๋ฅด๊ฒ ์ด์ผ๊ธฐ ํ๋ฉด, ์ฐธ์กฐํ๋ ์ธ์คํด์ค๊ฐ ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ค ๋ผ๊ณ ๋ ์ด์ผ๊ธฐ ํ ์ ์๊ฒ ์ฃ ~~?!
์ด๊ฒ ๋ฐ๋ก! ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ task๊ฐ ์คํ๋ ๊ฒฝ์ฐ, ํด๋์ค ์ธ์คํด์ค๊ฐ ๊ณต์ ๋๋ ์์์ผ๋ก ์ฌ์ฉ๋ ๊ฒฝ์ฐ thred-unsafetyํ๋ค ๋ผ๊ณ ๋งํ๊ฒ ๋๋ ์ด์ ์์. ์ฌ๊ธฐ ์ ๊ธฐ์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฐธ์กฐํ๊ณ , ์ ๊ทผํ๊ฒ ๋์ ๋ฐ์ดํฐ๊ฐ ๊ผฌ์ด๊ฒ ๋๋๊ฑฐ์ฃ ! ใ ใ
๊ฐ์ด ์ข ์ค์๋์~~?ใ ใ
์ค์ผ์ด.. ๊ทธ๋ผ ์ด์ struct์ class์ ์ฐจ์ด์ ๋ํด ์ฝ๊ฐ ๊ฐ์ด ์์ด.. ๊ทธ๋์ ์ธ์ ๋ญ ์จ์ผํ๋๋ฐ~~?
์ ํ์ ์น์ ํ๊ฒ๋ ๊ฐ์ด๋๋ผ์ธ์์, ์๋ ์กฐ๊ฑด ์ค ํ๋๋ผ๋ ํด๋น๋๋ค๋ฉด "๊ตฌ์กฐ์ฒด"๋ฅผ ์ฌ์ฉํ๊ธฐ๋ฅผ ๊ถ์ฅํ๊ณ ์์ด์!
- ์ฐ๊ด๋ ๊ฐ๋จํ ๊ฐ์ ์งํฉ์ ์บก์ํ ํ๋ ๊ฒ๋ง์ด ๋ชฉ์ ์ผ ๋
- ์บก์ํ๋ ๊ฐ์ด ์ฐธ์กฐ๋๋ ๊ฒ๋ณด๋ค ๋ณต์ฌ๋๋ ๊ฒ์ด ํฉ๋นํ ๋
- ๊ตฌ์กฐ์ฒด์ ์ ์ฅ๋ ํ๋กํผํฐ๊ฐ ๊ฐ ํ์ ์ด๋ฉฐ ์ฐธ์กฐ๋๋ ๊ฒ๋ณด๋ค ๋ณต์ฌ๋๋ ๊ฒ์ด ํฉ๋นํ ๋
- ๋ค๋ฅธ ํ์ ์ผ๋ก๋ถํฐ ์์๋ฐ๊ฑฐ๋ ์์ ์ด ์์๋ ํ์๊ฐ ์์ ๋
์ด๋ฒ์๋ ์์ฃผ ๊ฐ๋จํ ์์ ์ ์์ฝ์ ํตํด์ struct์ class์ฐจ์ด์ ๋ํด์ ์์๋ณด์๋๋ฐ์~~!!
์ค๋๋ ๋๊ตฐ๊ฐ์๊ฒ ๋์์ด ๋์๊ธธ ๋ฐ๋์ ๐
'iOS [Swift] > ๊ธฐ์ด๋ฅผ ํํํ!' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[RxSwift] RxSwift ์ฅ๋จ์ (0) | 2021.03.30 |
---|---|
[RxSwift] RxSwift ์ ๋ฌธํ๊ธฐ (4) | 2021.03.30 |
[Swift] Singleton Pattern (์ฑ๊ธํค ํจํด) (0) | 2021.03.16 |
[Swift] FileManager (0) | 2021.03.02 |
[Swift] Audio Recording (0) | 2021.03.01 |