์๋ ํ์ธ์. ์ด๋ฒ ํฌ์คํธ์์๋ ๊ตฌ์กฐ์ฒด(Structures)์ ํด๋์ค(Classes)์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๊ธฐ๋ณธ์ด ๋๋ ์ด ๊ฐ๋ ๋ค์ Swift์์ ์ด๋ป๊ฒ ๊ตฌํ๋๋์ง, ์ด๋ค ํน์ง์ด ์๋์ง ํจ๊ป ์ดํด๋ด ์๋ค.
๐ ๊ตฌ์กฐ์ฒด์ ํด๋์ค๋?
๊ตฌ์กฐ์ฒด์ ํด๋์ค๋ ํ๋ก๊ทธ๋จ ์ฝ๋์ ๊ตฌ์ฑ ์์๊ฐ ๋๋ ๋ฒ์ฉ์ ์ด๊ณ ์ ์ฐํ ๊ตฌ์กฐ์ ๋๋ค. ๋ ๊ตฌ์กฐ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์บก์ํํ๊ณ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ฌ์ฉ์ ์ ์ ํ์ ์ ๋ชจ๋ธ๋งํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์บก์ํ(Encapsulation): ๊ด๋ จ๋ ๋ฐ์ดํฐ์ ๊ธฐ๋ฅ์ ํ๋์ ๋จ์๋ก ๋ฌถ๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ
Swift์์๋ ๋ค๋ฅธ ์ธ์ด์ ๋ฌ๋ฆฌ ๊ตฌ์กฐ์ฒด์ ํด๋์ค๋ฅผ ์ ์ํ ๋ ๋ณ๋์ ์ธํฐํ์ด์ค ํ์ผ๊ณผ ๊ตฌํ ํ์ผ์ ๋ง๋ค ํ์๊ฐ ์์ต๋๋ค. ๋จ์ผ ํ์ผ์ ๋ชจ๋ ์ ์๊ฐ ์ด๋ฃจ์ด์ง๋๋ค.
๐ ๊ตฌ์กฐ์ฒด์ ํด๋์ค์ ๊ณตํต์
Swift์์ ๊ตฌ์กฐ์ฒด์ ํด๋์ค๋ ๋ง์ ๊ณตํต ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค:
- ํ๋กํผํฐ(Properties): ๊ฐ์ ์ ์ฅํ ์ ์์
- ๋ฉ์๋(Methods): ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํจ์ ์ ์ ๊ฐ๋ฅ
- ์๋ธ์คํฌ๋ฆฝํธ(Subscripts): ๊ฐ์ ์ ๊ทผํ๋ ๊ฐํธํ ๊ตฌ๋ฌธ ์ ๊ณต
- ์ด๊ธฐํ(Initialization): ์ด๊ธฐ ์ํ๋ฅผ ์ค์ ํ๋ ์ด๊ธฐํ ๊ตฌ๋ฌธ ์ ๊ณต
- ํ์ฅ(Extensions): ๊ธฐ๋ณธ ๊ธฐ๋ฅ ํ์ฅ ๊ฐ๋ฅ
- ํ๋กํ ์ฝ(Protocols): ํน์ ๊ธฐ๋ฅ ์ค์ ๊ฐ๋ฅ
๐ ํด๋์ค๋ง์ ์ถ๊ฐ ๊ธฐ๋ฅ
ํด๋์ค๋ ๊ตฌ์กฐ์ฒด๋ณด๋ค ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค:
- ์์(Inheritance): ๋ค๋ฅธ ํด๋์ค์ ํน์ฑ์ ์์ ๊ฐ๋ฅ
- ํ์ ์บ์คํ (Type Casting): ๋ฐํ์์ ํด๋์ค ์ธ์คํด์ค ํ์ ํ์ธ ๋ฐ ํด์ ๊ฐ๋ฅ
- ์ด๊ธฐํ ํด์ (Deinitializers): ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ ๋ ์ ๋ฆฌ ์์ ์ํ ๊ฐ๋ฅ
- ์ฐธ์กฐ ์นด์ดํ (Reference Counting): ์ฌ๋ฌ ์ฐธ์กฐ๋ฅผ ํตํด ํ๋์ ์ธ์คํด์ค ๊ณต์ ๊ฐ๋ฅ
์์: ํ ํด๋์ค๊ฐ ๋ค๋ฅธ ํด๋์ค์ ํน์ฑ์ ๋ฌผ๋ ค๋ฐ๋ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ ๊ธฐ๋ฅ
๐ ์ ์ ๊ตฌ๋ฌธ
๊ตฌ์กฐ์ฒด์ ํด๋์ค๋ ์ ์ฌํ ๊ตฌ๋ฌธ์ผ๋ก ์ ์ํฉ๋๋ค:
// ๊ตฌ์กฐ์ฒด ์ ์
struct Resolution {
var width = 0
var height = 0
}
// ํด๋์ค ์ ์
class VideoMode {
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name: String?
}
์ ์ฅ ํ๋กํผํฐ(Stored Properties): ๊ตฌ์กฐ์ฒด๋ ํด๋์ค์ ์ผ๋ถ๋ก ์ ์ฅ๋๋ ์์๋ ๋ณ์
๐ ์ธ์คํด์ค ์์ฑ
๊ตฌ์กฐ์ฒด์ ํด๋์ค์ ์ธ์คํด์ค๋ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ์์ฑํฉ๋๋ค:
// ๊ตฌ์กฐ์ฒด ์ธ์คํด์ค ์์ฑ
let someResolution = Resolution()
// ํด๋์ค ์ธ์คํด์ค ์์ฑ
let someVideoMode = VideoMode()
์ธ์คํด์ค(Instance): ๊ตฌ์กฐ์ฒด๋ ํด๋์ค ์ ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋ ์ค์ ๊ฐ์ฒด
๐ ํ๋กํผํฐ ์ ๊ทผ
์ธ์คํด์ค์ ํ๋กํผํฐ์๋ ์ ๊ตฌ๋ฌธ(dot syntax)์ ์ฌ์ฉํ์ฌ ์ ๊ทผํฉ๋๋ค:
// ํ๋กํผํฐ ์ ๊ทผ
print("The width of someResolution is \(someResolution.width)")
// "The width of someResolution is 0" ์ถ๋ ฅ
// ์ค์ฒฉ๋ ํ๋กํผํฐ ์ ๊ทผ
print("The width of someVideoMode is \(someVideoMode.resolution.width)")
// "The width of someVideoMode is 0" ์ถ๋ ฅ
// ํ๋กํผํฐ ๊ฐ ๋ณ๊ฒฝ
someVideoMode.resolution.width = 1280
์ ๊ตฌ๋ฌธ(Dot Syntax): ์ธ์คํด์ค์ ๋ฉค๋ฒ์ ์ ๊ทผํ๊ธฐ ์ํ ํ๊ธฐ๋ฒ
๐ ๊ตฌ์กฐ์ฒด์ ๋ฉค๋ฒ๋ณ ์ด๊ธฐํ ๊ตฌ๋ฌธ
๊ตฌ์กฐ์ฒด๋ ์๋์ผ๋ก ๋ฉค๋ฒ๋ณ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ์ ๊ณตํฉ๋๋ค:
// ๊ตฌ์กฐ์ฒด์ ๋ฉค๋ฒ๋ณ ์ด๊ธฐํ ๊ตฌ๋ฌธ ์ฌ์ฉ
let vga = Resolution(width: 640, height: 480)
๋ฉค๋ฒ๋ณ ์ด๊ธฐํ ๊ตฌ๋ฌธ(Memberwise Initializer): ๊ตฌ์กฐ์ฒด๊ฐ ์๋์ผ๋ก ์ ๊ณตํ๋ ์ด๊ธฐํ ๋ฐฉ๋ฒ์ผ๋ก, ๊ฐ ๋ฉค๋ฒ๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ด๊ธฐํํ ์ ์์
ํด๋์ค๋ ์ด๋ฌํ ๋ฉค๋ฒ๋ณ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ์๋์ผ๋ก ์ ๊ณตํ์ง ์์ต๋๋ค. ํด๋์ค์์๋ ์ง์ ์ด๊ธฐํ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค.
๐ ๊ตฌ์กฐ์ฒด์ ์ด๊ฑฐํ์ ๊ฐ ํ์
Swift์์ ๊ตฌ์กฐ์ฒด์ ์ด๊ฑฐํ์ ๊ฐ ํ์ (value type)์ ๋๋ค. ๊ฐ ํ์ ์ ํน์ง:
- ๋ณ์๋ ์์์ ํ ๋น๋ ๋ ๋ณต์ฌ๋จ
- ํจ์์ ์ ๋ฌ๋ ๋ ๋ณต์ฌ๋จ
let hd = Resolution(width: 1920, height: 1080)
var cinema = hd // hd์ ๋ณต์ฌ๋ณธ์ด cinema์ ํ ๋น๋จ
// cinema์ width ๋ณ๊ฒฝ์ hd์ ์ํฅ์ ์ฃผ์ง ์์
cinema.width = 2048
print("cinema is now \(cinema.width) pixels wide") // 2048
print("hd is still \(hd.width) pixels wide") // 1920
๊ฐ ํ์ (Value Type): ํ ๋น์ด๋ ์ ๋ฌ ์ ๊ฐ์ ๋ณต์ฌ๋ณธ์ด ์์ฑ๋๋ ํ์
Swift์ ๊ธฐ๋ณธ ํ์ (Int, Double, String, Array, Dictionary ๋ฑ)๋ ๋ชจ๋ ๊ตฌ์กฐ์ฒด๋ก ๊ตฌํ๋ ๊ฐ ํ์ ์ ๋๋ค.
๐ ํด๋์ค๋ ์ฐธ์กฐ ํ์
ํด๋์ค๋ ์ฐธ์กฐ ํ์ (reference type)์ ๋๋ค. ์ฐธ์กฐ ํ์ ์ ํน์ง:
- ๋ณ์๋ ์์์ ํ ๋น๋ ๋ ๋ณต์ฌ๋์ง ์๊ณ ์ฐธ์กฐ๋จ
- ํจ์์ ์ ๋ฌ๋ ๋ ๋ณต์ฌ๋์ง ์๊ณ ์ฐธ์กฐ๋จ
let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0
// tenEighty์ alsoTenEighty๋ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐ
let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0
// ํ ์ฐธ์กฐ์์ ๋ณ๊ฒฝํ๋ฉด ๋ค๋ฅธ ์ฐธ์กฐ์์๋ ๋ณ๊ฒฝ์ด ๋ฐ์๋จ
print("The frameRate property of tenEighty is now \(tenEighty.frameRate)")
// "The frameRate property of tenEighty is now 30.0" ์ถ๋ ฅ
์ฐธ์กฐ ํ์ (Reference Type): ํ ๋น์ด๋ ์ ๋ฌ ์ ์๋ณธ ์ธ์คํด์ค์ ๋ํ ์ฐธ์กฐ๋ง ์ ๋ฌ๋๋ ํ์
๐ ์๋ณ ์ฐ์ฐ์
์ฐธ์กฐ ํ์ ์์๋ ๋ ๋ณ์/์์๊ฐ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๋์ง ํ์ธํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. Swift๋ ์ด๋ฅผ ์ํ ์๋ณ ์ฐ์ฐ์๋ฅผ ์ ๊ณตํฉ๋๋ค:
- === (๋์ผ ์ธ์คํด์ค): ๋ ์ฐธ์กฐ๊ฐ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๋์ง ํ์ธ
- !== (๋์ผํ์ง ์์ ์ธ์คํด์ค): ๋ ์ฐธ์กฐ๊ฐ ๋ค๋ฅธ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๋์ง ํ์ธ
if tenEighty === alsoTenEighty {
print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")
}
// "tenEighty and alsoTenEighty refer to the same VideoMode instance." ์ถ๋ ฅ
์๋ณ ์ฐ์ฐ์(Identity Operators): ์ฐธ์กฐ ํ์ ์ ์ธ์คํด์ค๊ฐ ๋์ผํ์ง ํ์ธํ๋ ์ฐ์ฐ์
์ฃผ์: ===(๋์ผ ์ธ์คํด์ค)์ ==(๊ฐ์ด ๊ฐ์)์ ๋ค๋ฅธ ๊ฐ๋ ์ ๋๋ค!
๐ ํฌ์ธํฐ
Swift์์๋ C๋ C++์ ํฌ์ธํฐ์ ๋ฌ๋ฆฌ, ์ฐธ์กฐ๋ฅผ ์ผ๋ฐ ์์๋ ๋ณ์์ฒ๋ผ ๋ค๋ฃน๋๋ค. ๋ณํ(*)๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ฃผ์๋ฅผ ์ง์ ๋ค๋ฃฐ ํ์๊ฐ ์์ต๋๋ค.
ํ์ํ ๊ฒฝ์ฐ Swift ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํฌ์ธํฐ์ ๋ฒํผ ํ์ ์ ์ ๊ณตํ์ง๋ง, ์ผ๋ฐ์ ์ธ ๊ฐ๋ฐ์์๋ ํด๋์ค ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์์ ํ๊ณ ํธ๋ฆฌํฉ๋๋ค.
ํฌ์ธํฐ(Pointer): ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ง์ ์ฐธ์กฐํ๋ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋
๐ ๊ตฌ์กฐ์ฒด์ ํด๋์ค ์ค ์ด๋ค ๊ฒ์ ์ ํํด์ผ ํ ๊น?
Swift์์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค์ ์ง์นจ์ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ข์ต๋๋ค:
- ๊ตฌ์กฐ์ฒด๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ์ธ์:
- ๊ฐ๋จํ ๋ฐ์ดํฐ ๊ฐ์ ์บก์ํํ ๋
- ๋ณต์ฌ ์ ์ฐธ์กฐ๋ณด๋ค ๋ณต์ฌ๊ฐ ํฉ๋ฆฌ์ ์ผ ๋
- ์์์ด ํ์ ์์ ๋
- ํด๋์ค๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ:
- ์์์ด ํ์ํ ๋
- ์ฐธ์กฐ ํ์ ์ด ํ์ํ ๋
- ์ธ์คํด์ค์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํด์ผ ํ ๋
'๐ฅ Bread Basics > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์์ (Inheritance) (0) | 2025.04.11 |
---|---|
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์๋ธ ์คํฌ๋ฆฝํธ (Subscripts) (0) | 2025.04.11 |
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ๋ฉ์๋ (Methods) (0) | 2025.04.11 |
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ํ๋กํผํฐ (Properties) (0) | 2025.04.11 |
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ด๊ฑฐํ (Enumerations) (0) | 2025.04.11 |
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ํด๋ก์ (Closures) (0) | 2025.04.11 |
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ํจ์ (Functions) (0) | 2025.04.11 |
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ ์ด ํ๋ฆ (Control Flow) (0) | 2025.04.10 |