* Structures vs Classes
1) Struct ๊ธฐ๋ณธ๊ตฌ์กฐ
struct MyStruct { var aProperty: String func aMethod() { // Do Something } } |
2) struct ์ calss ๊ณตํต์ ๊ณผ ์ฐจ์ด์
struct | class | |
๊ณตํต์ | ์ด๋ฆ ๋๋ฌธ์๋ก ์์. ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ๊ฐ์ง ์ ์์. |
|
์ฐจ์ด์ | ์์๋ฐ๊ธฐ ์๋จ stack ์ ์ ์ฅ (๊ฐ์ฅ ์ต๊ทผ ๋ฐ์ดํฐ์ ๋น ๋ฅด๊ฒ ์ ๊ทผ ๊ฐ๋ฅ) vlaue ํ์(๊ฐ์ด ๋ณต์ฌ๋จ) |
์์๋ฐ๊ธฐ ๋จ Heap ์ ์ ์ฅ (์ฐธ์กฐ๋ฅผ ์ด์ฉํด์ ๊ฐ์ ์ฐพ์) reference ํ์(์ฃผ์๊ฐ ๋ณต์ฌ๋จ) |
ํด๋ํฐ์ ์ ๊ทผ์ด ์ฌ์ด ๊ฐ๋ฒผ์ด RAM ๋ฉ๋ชจ๋ฆฌ์ Stack, Heap ์๋ฃ๊ตฌ์กฐ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํจ.
3) ์์์ฝ๋
ClassHero ํด๋์ค์ StructHero ๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ๊ฐ๊ฐ name, universe ์์ฑ์ ์ถ๊ฐํ์.
//ClassExample.swift
import Foundation
class ClassHero {
var name: String
var universe: String
init(name: String, universe: String){
self.name = name
self.universe = universe
}
}
//StructExample.swift
import Foundation
struct StructHero {
var name: String
var universe: String
}
๊ฐ์ ์ด๋ฆ์ผ๋ก class ์ struct, enum ์ ์ด๊ฑฐํ ์ ์๋ค.
ํด๋์ค์ ์์ฑ์ ๋ถ์ฌํ๋ฉด initialize ๊ฐ ๊ตฌ๋ฌธ์ด ํ์ํ๋ค.
struct์ ์์ฑ์ ๋ถ์ฌํด๋ initailize ๊ตฌ๋ฌธ์ด ํ์์๋ค. ์ฆ initailize ๊ตฌ๋ฌธ ์์ด๋ ๊ฐ์ฒด ์ ์ธ&์์ฑ์ด ๊ฐ๋ฅํ๋ค.
//main.swift
import Foundation
var hero = ClassHero(name: "Iron man", universe: "Marvel")
var anotherMarvelHero = hero
anotherMarvelHero.name = "The Hulk"
print("Hero name = \(hero.name)")
print("anotherMarvelhero name = \(anotherMarvelHero.name)")
Hero name = The Hulk anotherMavelhero name = The Hulk |
ClassHero ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ anotherMarvelHero ๋ณ์์ ๋ณต์ฌํ๋๋ ๊ฐ์ "The Hulk" ๊ฐ์ด ๋์๋ค.
์ด์ ๋ Class ๋ ๊ฐ ๋ณต์ฌ๊ฐ ์๋ ์ฃผ์๋ฅผ ๋ณต์ฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
import Foundation
var hero = StructHero(name: "Iron man", universe: "Marvel")
var anotherMarvelHero = hero
anotherMarvelHero.name = "The Hulk"
print("Hero name = \(hero.name)")
print("anotherMarvelhero name = \(anotherMarvelHero.name)")
Hero name = Iron man anotherMavelhero name = The Hulk |
Struct ๋ก ๋ง๋ StructHero ๋ก ๋ณ๊ฒฝํ๋ฉด ๊ฐ์ ๋ณต์ฌํ์ฌ ์ ์์ ์ผ๋ก ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
import Foundation
var hero = StructHero(name: "Iron man", universe: "Marvel")
var anotherMarvelHero = hero
anotherMarvelHero.name = "The Hulk"
var avengers = [hero, anotherMarvelHero]
avengers[0].name = "Thor"
print("Hero name = \(hero.name)")
print("anotherMarvelhero name = \(anotherMarvelHero.name)")
print("first avenger name \(avengers[0].name)")
Hero name = Iron man anotherMarvelhero name = The Hulk first avenger name Thor |
import Foundation
let hero = ClassHero(name: "Iron man", universe: "Marvel")
hero.name = "Cat Woman"
hero.universe = "DC"
Class๋ ์์๋ก ์ ์ธ&์์ฑํ์ด๋ ์์ฑ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.
Struct๋ ์์๋ก ์ ์ธ&์์ฑํ๋ฉด ์์ฑ ๊ฐ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ๋ค. Struct ๋ ๊ฐ ์ ํ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
import Foundation
struct StructHero {
var name: String
var universe: String
mutating func reverseName() -> String {
self.name = String(self.name.reversed())
}
}
Struct ๋ด์์ ์์ฑ ๊ฐ์ ๋ฐ๊พธ๋ ค๊ณ ํ๋ฉด Error ๊ฐ ๋๋ค. mutating ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ํด๊ฒฐํ ์ ์๋ค.
๋ ๊ฐ๋จํ๊ณ ๋น ๋ฅด๊ณ ๊ฐ๋ณต์ฌ๋ก ์ธํด ์ถ๋์ ๋ฐฉ์งํ ์ ์๊ธฐ์ struct ๋ฅผ ์ฌ์ฉํ๋๊ฒ ๋ซ๋ค.
๋ค๋ง struct ๋ ์์์ ๋ฐ์ ์ ์๊ธฐ ๋๋ฌธ์ ํด๋์ค๋ฅผ ์์ํ๊ณ ์ถ์ ๋ ์ณ์ง ์๋ค.
๋ฐ๋ผ์ Struct๋ก ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ์์์ด ํ์ํ๊ฑฐ๋ Objective-C ๋ก ์์ ํ๊ณ ์ถ์ ๋๋ง Calss ๋ก ๋ฐ๊พธ์.
* Access Levels
- private: { } ์์์๋ง access ๊ฐ๋ฅํจ.
- fileprivate: ์์ฑ์ด๋ ๋ฉ์๋๊ฐ ์ ์ธ๋ ํ์ผ ๋ด์์๋ง access ๊ฐ๋ฅํจ.
- internal: ๋ชจ๋ ๋ด์์ ๋ชจ๋ access ๊ฐ๋ฅ. private or fileprivate ์ ์ ์ธํ์ง ์์์ ๋ defualt ๊ฐ.
- public: ๋ค๋ฅธ ๋ชจ๋๋ผ๋ฆฌ๋ access ๊ฐ๋ฅ. ๋ค๋ฅธ ๋ชจ๋์์ ์ค๋ฒ๋ผ์ด๋ ๋ฐ ์๋ธ ํด๋์ฑ ๋ถ๊ฐ๋ฅ.
- open: ๋ค๋ฅธ ๋ชจ๋๋ผ๋ฆฌ๋ access ๊ฐ๋ฅ. ๋ค๋ฅธ ๋ชจ๋์์ ์ค๋ฒ๋ผ์ด๋ ๋ฐ ์๋ธ ํด๋์ฑ ๊ฐ๋ฅ.
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/accesscontrol/
P.S) public, open ์ ๊ทผ์๋ ๋ง์ด ์ฌ์ฉ์ํ ๊ฑฐ ๊ฐ์๋ฐ framework, sdk ๊ฐ๋ฐ์์ public, open ์ ๊ทผ ์ง์ ์๊ฐ ์ค์ํ๋ค.
* Tuples
: ๋ค๋ฅธ ๋ฐ์ดํฐ ํ์ ์ ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์๋ฃ๊ตฌ์กฐ.
import Foundation
let tuple1 = ("Angela", 12)
let tuple2 = (name: "Angela", age: 12)
let tuple3: (name: String, age: Int)
tuple3.name = "Angela"
tuple3.age = 18
tuple3 = (name: "Angela2", age: 21)
print(tuple1.0)
print(tuple2.name)
์ ์ธ์ ์ํ๋ ๊ฐ์๋งํผ ๋ฐ์ดํฐ๋ฅผ , ๋ก ๊ตฌ๋ถํ์ฌ ๋ฃ์ด์ ๋ง๋ค๋ฉด ๋๋ค.
์ฌ์ฉ์ index ๋ฅผ ์ด์ฉํ์ฌ ํธ์ถํ๋ฉด ๋๋ค.
์ ์ธ ๋ฐ ํธ์ถ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ๊ฐ ์์ผ๋ฏ๋ก ๋ค ์์๋์.