์๋ ํ์ธ์, ๊ฐ์์ ๋๋ค. ์ค๋์ ๊ตฌ์กฐ์ฒด์ ํด๋์ค์ ๋ํด์ ์ ๋ฆฌํด๋ณด์์ต๋๋ค.
swift document chap.09 Structures and Classes
Structures and Classes
๊ตฌ์กฐ์ฒด์ ํด๋์ค๋ ์ฌ๋ฌ ๊ฐ์ ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ํ ๋ฒ์ ๋ค๋ฃฐ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค. ํ๋ก๊ทธ๋จ ์ฝ๋์์ ๊ฑด์ถ ์์ฌ ์ญํ ์ ํ๋ ๋ฒ์ฉ์ ์ด๊ณ ์ ์ฐํ ๊ตฌ์กฐ๋ฌผ์ด๋ผ๊ณ ๋ ํ๋ค.
๋ค๋ฅธ ์ธ์ด์๋ ๋ฌ๋ฆฌ Swift๋ ๊ตฌ์กฐ์ฒด์ ํด๋์ค๋ฅผ ๋ง๋๋๋ฐ ๋ณ๋์ ์ธํฐํ์ด์ค๋ ํ์ผ์ ์์ฑํ ํ์๊ฐ ์๋ค. ํ๋์ ํ์ผ ๋ด์์ ๊ตฌ์กฐ์ฒด์ ํด๋์ค๋ฅผ ์ ์ํ๋ฉด ์ธ๋ถ ์ธํฐํ์ด์ค์์ ํด๋น ๊ตฌ์กฐ์ฒด๋ฅผ ์๋์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ํ๋ค.
Comparing Structures and Classes
๐ ๊ตฌ์กฐ์ฒด, ํด๋์ค ๊ณตํต์
- ๋ณ์๋ ์์์ ๊ฐ์ ์ ์ฅํ๋ ํ๋กํผํฐ๋ฅผ ์ ์ํ ์ ์๋ค.
- ํจ์(๋ฉ์๋)๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํด๋์ค, ๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ค.
- init ๋ฉ์๋๋ฅผ ๋์ด์ ๊ฐ์ฒด๋ฅผ ์ํ๋ ํํ๋ก ์ค์ ํด์ฃผ๋ ์ด๊ธฐํ ๋ธ๋ก์ ์ ์ํ ์ ์๋ค.
- ๊ฐ์ฒด ํจ์์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ํ์ฅ(extends) ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค.
- ์์ฑ๊ฐ์ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ์๋ธ์คํฌ๋ฆฝํธ๋ฅผ ์ ์ํ ์ ์๋ค. (get, set)
- ํน์ ํ์์ ํจ์์ ํ์ค์ ์ ๊ณตํ๊ธฐ ์ํ ํ๋กํ ์ฝ์ ๊ตฌํํ ์ ์๋ค.
๐ ๊ตฌ์กฐ์ฒด, ํด๋์ค ์ฐจ์ด์
โถ Class (ํด๋์ค)
- ์ฐธ์กฐ ํ์ ์ด๋ค.
- ARC๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ค.
- ๊ฐ์ ํด๋์ค ์ธ์คํด์ค๋ฅผ ์ฌ๋ฌ ๊ฐ์ ๋ณ์์ ํ ๋นํ ๋ ๊ฐ์ ๋ณ๊ฒฝ์ํค๋ฉด ํ ๋นํ ๋ชจ๋ ๋ณ์์ ์ํฅ์ ์ค๋ค. (๋ฉ๋ชจ๋ฆฌ๋ง ๋ณต์ฌ)
- ์์์ด ๊ฐ๋ฅํ๋ค.
- ํ์ ์บ์คํ ์ ํตํด ๋ฐํ์์์ ํด๋์ค ์ธ์คํด์ค์ ํ์ ์ ํ์ธํ ์ ์๋ค.
- deinit์ ์ฌ์ฉํด์ ํด๋์ค ์ธ์คํด์ค์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํด์ ํ ์ ์๋ค.
โถ Struct (๊ตฌ์กฐ์ฒด)
- ๊ฐํ์ ์ด๋ค.
- ๊ตฌ์กฐ์ฒด ๋ณ์๋ฅผ ์๋ก์ด ๋ณ์์ ํ ๋นํ ๋๋ง๋ค ์๋ก์ด ๊ตฌ์กฐ์ฒด๊ฐ ํ ๋น๋๋ค.
- ์ฆ ๊ฐ์ ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ๋ฌ ๊ฐ์ ๋ณ์์ ํ ๋นํ ๋ค ๊ฐ์ ๋ณ๊ฒฝ์ํค๋๋ผ๋ ๋ค๋ฅธ ๋ณ์์ ์ํฅ์ ์ฃผ์ง ์๋๋ค. (๊ฐ ์์ฒด๋ฅผ ๋ณต์ฌ)
Definition Syntax
๊ตฌ์กฐ์ฒด์ ํด๋์ค๋ฅผ ์ ์ํ๋ ๊ตฌ๋ฌธ์ ๋น์ทํ๋ค. ๊ตฌ์กฐ์ฒด ์ ์ธ์ ํค์๋๋ struct, ํด๋์ค ์ ์ธ ํค์๋๋ class ์ด๋ค.
struct Resolution {
var width = 0
var height = 0
}
class VideoMode {
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name: String?
}
์ด๋ ๊ฒ ๊ตฌ์กฐ์ฒด๋ ํด๋์ค๋ฅผ ์ ์ธํ ๋๋ ์ค์ํํธ์ ์คํ์ผ์ ์ค์ํ๋๊ฒ ์ข๋ค. ๋๋ฌธ์๋ก ํด๋์ค๋ ๊ตฌ์กฐ์ฒด์ ์ด๋ฆ์ ์ค์ ํ๋๊ฒ ์ข๊ณ , ๊ทธ ์์ ๋ฉ์๋๋ ํ๋กํผํฐ๋ ์๋ฌธ์๋ก ๋๋ถ๋ถ ์์ํ๋ค.
์ ์ฝ๋์์๋ resolution ๋ณ์ ์์ Resolution() ๊ตฌ์กฐ์ฒด ์ธ์คํด์ค๋ฅผ ๋ฃ์๋ค.
Structure and Class Instances
์์์ ์ ์ํ Resolution ๊ตฌ์กฐ์ฒด์, VideMode ํด๋์ค๋ ๊ตฌ์กฐ์ฒด์ ํด๋์ค์ ๋ชจ์๋ง ์ ์ํ ๊ฒ์ด์ง ์ค์ ๋ก ์ฌ์ฉ๋๋ ๊ฐ์ ์๋๋ค. ์ ์๋ ๊ตฌ์กฐ์ฒด์ ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉํด์ผํ๋ค.
let someResolution = Resolution()
let someVideoMode = VideoMode()
์ ์ฝ๋๋ ๊ฐ๊ฐ์ ๊ตฌ์กฐ์ฒด์ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ง๋ ์ฝ๋์ด๋ค. ๊ตฌ์กฐ์ฒด๋ ํด๋์ค์ ์ด๋ฆ์ ์ฐ๊ณ ๋ค์ () ๋ฅผ ๋ถ์ฌ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค. ์ด๊ธฐ ๊ฐ์ default ๊ฐ์ผ๋ก ์์ฑ๋๋ค.
Accessing Properties
์ (.) ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ํ๋กํผํฐ์ ์ ๊ทผํ ์ ์๋ค. ์ ๊ตฌ๋ฌธ์ ์ธ์คํด์ค ์ด๋ฆ ๋ฐ๋ก ๋ค์ ์ด๋ค ๊ณต๋ฐฑ๋ ์์ด ์์ฑํ ํ, ์์ฑ์ ์ด๋ฆ์ ์์ฑํ๋ฉด ๋๋ค.
print ( "The width of someResolution is \\(someResolution.width)")
// "The width of someResolution is 0" ๋ฅผ ์ธ์ํจ
์๊น ์ ์ธํ someVideoMode ํด๋์ค์ resolution ํ๋กํผํฐ๋ ๊ตฌ์กฐ์ฒด์๋ค. resolution ํ๋กํผํฐ์ ์ ๊ทผํ๊ธฐ ์ํด์๋ ๋ ๋ค์ํ๋ฒ . ์ ์ฐ์ด์ฃผ๋ฉด ๋๋ค.
print ( "The width of someVideoMode is \\(someVideoMode.resolution.width)")
// "The width of someVideoMode is 0" ๋ฅผ ์ธ์ํจ
๋ณ์์์ฑ์ ์๋ก์ด ๊ฐ์ ํ ๋นํ๊ธฐ ์ํด์๋ . ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค.
someVideoMode.resolution.width = 1280
print ( "The width of someVideoMode is now \\(someVideoMode.resolution.width)")
// "The width of someVideoMode is now 1280" ๋ฅผ ์ธ์ํจ
Memberwise Initializers for Structure Types
๋ชจ๋ ๊ตฌ์กฐ์ฒด์๋ ์๋ก์ด ๊ตฌ์กฐ์ฒด ์ธ์คํด์ค์ ํ๋กํผํฐ๋ค์ ์ด๊ธฐํํ๊ธฐ ์ํด ์๋์ ์ผ๋ก ์์ฑ๋๋ Memberwise initializer๊ฐ ์กด์ฌํ๋ค. ์๋ก์ด ์ธ์คํด์ค์ ์ด๊ธฐํ ๊ฐ์ ํ๋กํผํฐ์ ์ด๋ฆ์ผ๋ก ์ด๊ธฐํํ ์ ์๋ค.
let vga = Resolution(width: 640, height: 480)
๊ตฌ์กฐ์ฒด์ ๋ฌ๋ฆฌ ํด๋์ค ์ธ์คํด์ค๋ default memberwise initializer๊ฐ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์์ฑ์๋ก ์ง์ ์ด๊ธฐํ ์์ผ์ฃผ์ด์ผ ํ๋ค.
Structures and Enumerations Are Value Types (๊ฐํ์ )
๊ฐํ์ ์ ๋ณ์๋ ์์์ ํ ๋น๋๊ฑฐ๋ ํจ์์ ์ ๋ฌ๋ ๋ ๊ฐ์ด ๋ณต์ฌ๋๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ด์ ์ ๋ฐฐ์ ๋ Int, String, Bool, Float, Double, Array, Dictionary ๋ชจ๋ ๊ฐํ์ ์ด๋ค. Swift์ ๋ชจ๋ ๊ตฌ์กฐ์ฒด์ ์ด๊ฑฐํ ๋ํ ๊ฐํ์ ์ด๋ค. ์ฆ, ๋ชจ๋ ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ ์ธ์คํด์ค๋ ๊ฐํ์ ์ด๊ณ , ๊ทธ๊ฒ๋ค์ ํ๋กํผํฐ๋ ํญ์ ๋ณต์ฌ๋๋ฉฐ ์ ๋ฌ๋๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
Array, Dictionary, String๊ณผ ๊ฐ์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด ์ ์๋ ์ปฌ๋ ์ ํ์ ์ ์ต์ ํ๋ฅผ ํตํด ๋ณต์ฌ๋น์ฉ์ ์ค์ธ๋ค. ์ด๋ฌํ ์ปฌ๋ ์ ์ ์๋ณธ์ ์ฆ์ ๋ณต์ฌํ์ง์๊ณ , ์๋ณธ ์ธ์คํด์ค์ ๋ณต์ฌ๋ณธ ์ฌ์ด์ ์ ์ฅ๋๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ค. ๋ง์ฝ ๋ณต์ฌ๋ณธ ๊ฐ์ด ์์ ๋๋ ค๊ณ ํ๋ฉด ์์ ์ง์ ์ ์๋ณธ์ ๋ณต์ฌํ๋ค. ์ด๋ ๊ฒ ๋๋ฌธ์ ์ฝ๋์์๋ ์ฆ์ ๋ณต์ฌ๋ ๊ฒ ์ฒ๋ผ ๋ณด์ธ๋ค.
๊ฐํ์ ์ ์ดํดํ๊ธฐ ์ํ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
let hd = Resolution(width : 1920, height : 1080)
var cinema = hd
cinema.width = 2048
print("cinema is now \\(cinema.width) pixels wide")
// "cinema is now 2048 pixels wide" ๋ฅผ ์ธ์ํจ
print("hd is still \\(hd.width) pixels wide")
// "hd is still 1920 pixels wide" ๋ฅผ ์ธ์ํจ
- ์ฝ๋์ค๋ช
- hd๋ผ๋ ์์๋ฅผ ์์ฑํ๊ณ Full HD ์์ ๋๋น์ ๋์ด๋ก ์ด๊ธฐํํ Resolution ์ธ์คํด์ค๋ฅผ ์ค์
- cinema๋ผ๋ ๋ณ์๋ฅผ ์ ์ธํ๊ณ ์ฌ๊ธฐ์ ํ์ฌ hd๋ฅผ ์ค์ (Resolution์ ๊ตฌ์กฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด ์ธ์คํด์ค์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค๊ณ , ์ด ์ ๋ณต์ฌ๋ณธ์ cinema์ ํ ๋นํ ๊ฒ์.)
- ์ด์ hd์ cinema์ ๋๋น์ ๋์ด๋ ๋๊ฐ๋๋ผ๋, ์ด๋ค์ ์์ ๋ค๋ฅธ ๋ ๊ฐ์ ์ธ์คํด์ค์.
- cinema ์ ๋๋น๋ฅผ 2048๋ก ์ด๊ธฐํ ํ ํ, ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํด๋ณด๋ฉด, cinema ์ ๋๋น๋ ๋ณํ์ง๋ง, hd์ ๋๋น๋ ๊ทธ๋๋ก์ด๋ค.
์ฝ๋๋ฅผ ํด์ํด๋ณด๋ฉด, cinema์ ํ์ฌ hd ๊ฐ์ ์ค ๋, hd์ ์ ์ฅ๋ ๊ฐ์ ์๋ก์ด cinema๋ผ๋ ์ธ์คํด์ค๋ก ๋ณต์ฌํ๋ค๋ ๊ฒ์ผ๋ก ํด์ํ ์ ์๋ค. ์ด๋ ๊ฒ ์์ ํ ๋ถ๋ฆฌ๋ ๋ ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ ๊ฒ์ด๋ค. ๋ถ๋ฆฌ๋ ์ธ์คํด์ค์ด๊ธฐ ๋๋ฌธ์ ์๋ ๊ทธ๋ฆผ์์ ๋ณด๋ ๊ฒ์ฒ๋ผ, cinema์ ๋๋น๋ฅผ ๋ณ๊ฒฝํ๋ฉด, hd์๋ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
์ด๊ฑฐ์ฒด๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐํ์ ์ด๊ธฐ ๋๋ฌธ์, ๊ฐ์ ๋์ ๋ฐฉ์์ด ์ ์ฉ๋๋ค.
enum CompassPoint {
case north, south, east, west
mutating func turnNorth() {
self = .north
}
}
var currentDirection = CompassPoint.west
let rememberedDirection = currentDirection
currentDirection.turnNorth()
print("The current direction is \\(currentDirection)")
print("The remembered direction is \\(rememberedDirection)")
// "The current direction is north" ๋ฅผ ์ธ์ํจ
// "The remembered direction is west" ๋ฅผ ์ธ์ํจ
Classes Are Reference Types (ํด๋์ค๋ ์ฐธ์กฐํ์ )
๊ฐํ์ ๊ณผ ๋ฌ๋ฆฌ, ์ฐธ์กฐํ์ ์ ๋ณ์๋ ์์์ ํ ๋นํ ๋๋ ํจ์์ ์ ๋ฌํ ๋, ๋ณต์ฌํ์ง ์๋๋ค. ๊ธฐ์กด๊ณผ ๋์ผํ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ์ฌ ์ฌ์ฉํ๋ค.
let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0
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" ๋ฅผ ์ธ์ํจ
์ ์ฝ๋๋ ์ ์์์ ์ ์ํ VidioMode ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ ๊ฒ ์ ์ธํ tenEighty๋ฅผ ์์ alsoTenEighty์ ํ ๋นํ ํ, alsoTenEighty์ ํ๋กํผํฐ๋ฅผ ์์ ํ๋ฉด ์ด๋ป๊ฒ ๋ ์ง ์ดํด๋ณด์. ๋น์ฐํ alsoTenEighty์ ํ๋กํผํฐ ๊ฐ๋ ์์ ๋์ง๋ง, tenEighty์ ๊ฐ๋ ์์ ๋๋ค.
์ด ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ๋ค.
๋ ๊ฐ์ ํด๋์ค ์ธ์คํด์ค๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐ๋ง ํ๊ธฐ ๋๋ฌธ์ ๋ ์ค ํ๋๊ฐ ์์ ๋๋ฉด, ๋ค๋ฅธ ํ๋ ์ฆ ๋ชจ๋ ์ธ์คํด์ค์ ์ํฅ์ ์ค๋ค.
Identity Operators
ํด๋์ค๊ฐ ์ฐธ์กฐ ํ์ ์ด๊ธฐ ๋๋ฌธ์, ์ฌ๋ฌ ๊ฐ์ ์์๋ ๋ณ์๊ฐ ๋์ผํ ๋จ์ผ ํด๋์ค ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ ๊ฐ๋ฅํ๋ค. (๊ตฌ์กฐ์ฒด๋ ์ด๊ฑฐ์ฒด๋ ์์๋ ๋ณ์์ ํ ๋น๋๊ฑฐ๋ ํจ์์ ์ ๋ฌํ ๋ ํญ์ ๋ณต์ฌ๋๊ธฐ ๋๋ฌธ์ ์ด์ ๋ค๋ฅด๋ค.)
๋ ์์ ๋๋ ๋ณ์๊ฐ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๋์ง ์์๋ณด๊ธฐ ์ํ ์ฐ์ฐ์๊ฐ ์กด์ฌํ๋ค. ๊ฐ์์ง ํ์ธํ๋ === ์ฐ์ฐ์์ ๊ฐ์ง ์์์ง ํ์ธํ๋ !== ๊ฐ ์๋ค.
if tenEighty === alsoTenEighty {
print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")
}
// "tenEighty and alsoTenEighty refer to the same VideoMode instance." ๋ฅผ ์ธ์ํจ
์ฃผ์ํ ์ ์, ==๊ณผ ===๋ ๋ค๋ฅด๋ค. ===๋ ํด๋์ค ํ์ ์ธ ๋ ์์ ๋๋ ๋ณ์๊ฐ ์ ํํ๊ฒ ๋์ผํ ํด๋์ค ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๋ค๋ ์๋ฏธ๋ก๋ง ์ฌ์ฉ๋๋ค.
Pointers
C, C++, Objective-C ์์ ์ฒ๋ผ ์ด๋ฌํ ์ฐธ์กฐ๊ฐ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์ ์ ์์ ๊ฒ์ด๋ค. ์ผ๋ถ ์ฐธ์กฐํ์ ์ ์ธ์คํด์ค๋ฅผ ๊ฐ์ง๋ ์์, ๋ณ์๋ C์ ํฌ์ธํฐ์ ๋น์ทํ์ง๋ง ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ์ง์ ์ ์ธ ํฌ์ธํฐ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ *(๋ณํ)๋ฅผ ์จ์ฃผ์ง ์์๋ ๋๋ค. ํ์ค๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํฌ์ธํฐ์ ์ง์ ์ํธ์์ฉ์ด ํ์ํ ๊ฒฝ์ฐ, ํฌ์ธํฐ์ ๋ฒํผ ํ์ ์ ์ ๊ณตํ๋ค.
์ด์ ๋ํ ๋ด์ฉ์ ์๋ ๋งํฌ๋ฅผ ํ๊ณ ์ฐธ๊ณ ํด๋ณด์.
https://developer.apple.com/documentation/swift/swift_standard_library/manual_memory_management