Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Swift/Swift Documents

[Swift] ๊ณต์‹ ๋ฌธ์„œ ์ •๋ฆฌ (9) - Structures and Classes (๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค์˜ ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ , ๊ฐ’ ํƒ€์ž…, ์ฐธ์กฐํƒ€์ž…)

๊ฐ์ž ๐Ÿฅ” 2022. 2. 18. 19:25
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์ž์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. 

swift document chap.09 Structures and Classes

 

Structures and Classes — The Swift Programming Language (Swift 5.6)

Structures and Classes Structures and classes are general-purpose, flexible constructs that become the building blocks of your program’s code. You define properties and methods to add functionality to your structures and classes using the same syntax you

docs.swift.org

 


Structures and Classes

๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ํ•œ ๋ฒˆ์— ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค. ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ์—์„œ ๊ฑด์ถ• ์ž์žฌ ์—ญํ• ์„ ํ•˜๋Š” ๋ฒ”์šฉ์ ์ด๊ณ  ์œ ์—ฐํ•œ ๊ตฌ์กฐ๋ฌผ์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค.

๋‹ค๋ฅธ ์–ธ์–ด์™€๋Š” ๋‹ฌ๋ฆฌ Swift๋Š” ๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ ๋ณ„๋„์˜ ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ํ•˜๋‚˜์˜ ํŒŒ์ผ ๋‚ด์—์„œ ๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋ฉด ์™ธ๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ํ•ด๋‹น ๊ตฌ์กฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

 

Comparing Structures and Classes

๐Ÿ‘‰ ๊ตฌ์กฐ์ฒด, ํด๋ž˜์Šค ๊ณตํ†ต์ 

  1. ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜์˜ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ํ•จ์ˆ˜(๋ฉ”์„œ๋“œ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  3. init ๋ฉ”์„œ๋“œ๋ฅผ ๋‘์–ด์„œ ๊ฐ์ฒด๋ฅผ ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ์„ค์ •ํ•ด์ฃผ๋Š” ์ดˆ๊ธฐํ™” ๋ธ”๋ก์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  4. ๊ฐ์ฒด ํ•จ์ˆ˜์  ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ํ™•์žฅ(extends) ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  5. ์†์„ฑ๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. (get, set)
  6. ํŠน์ • ํ˜•์‹์˜ ํ•จ์ˆ˜์  ํ‘œ์ค€์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ‘‰ ๊ตฌ์กฐ์ฒด, ํด๋ž˜์Šค ์ฐจ์ด์ 

โ–ถ Class (ํด๋ž˜์Šค)

  1. ์ฐธ์กฐ ํƒ€์ž…์ด๋‹ค.
  2. ARC๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
  3. ๊ฐ™์€ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•œ ๋œ ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œํ‚ค๋ฉด ํ• ๋‹นํ•œ ๋ชจ๋“  ๋ณ€์ˆ˜์— ์˜ํ–ฅ์„ ์ค€๋‹ค. (๋ฉ”๋ชจ๋ฆฌ๋งŒ ๋ณต์‚ฌ)
  4. ์ƒ์†์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  5. ํƒ€์ž… ์บ์ŠคํŒ…์„ ํ†ตํ•ด ๋Ÿฐํƒ€์ž„์—์„œ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์˜ ํƒ€์ž…์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  6. deinit์„ ์‚ฌ์šฉํ•ด์„œ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ํ•ด์ œํ• ์ˆ˜ ์žˆ๋‹ค.

โ–ถ Struct (๊ตฌ์กฐ์ฒด)

  1. ๊ฐ’ํƒ€์ž…์ด๋‹ค.
  2. ๊ตฌ์กฐ์ฒด ๋ณ€์ˆ˜๋ฅผ ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ตฌ์กฐ์ฒด๊ฐ€ ํ• ๋‹น๋œ๋‹ค.
  3. ์ฆ‰ ๊ฐ™์€ ๊ตฌ์กฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•œ ๋’ค ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œํ‚ค๋”๋ผ๋„ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค. (๊ฐ’ ์ž์ฒด๋ฅผ ๋ณต์‚ฌ)

 

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" ๋ฅผ ์ธ์‡„ํ•จ
  • ์ฝ”๋“œ์„ค๋ช…
    1. hd๋ผ๋Š” ์ƒ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  Full HD ์˜์ƒ ๋„ˆ๋น„์™€ ๋†’์ด๋กœ ์ดˆ๊ธฐํ™”ํ•œ Resolution ์ธ์Šคํ„ด์Šค๋ฅผ ์„ค์ •
    2. cinema๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ์—ฌ๊ธฐ์— ํ˜„์žฌ hd๋ฅผ ์„ค์ • (Resolution์€ ๊ตฌ์กฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด ์ธ์Šคํ„ด์Šค์˜ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค๊ณ , ์ด ์ƒˆ ๋ณต์‚ฌ๋ณธ์„ cinema์— ํ• ๋‹นํ•œ ๊ฒƒ์ž„.)
    3. ์ด์ œ hd์™€ cinema์˜ ๋„ˆ๋น„์™€ ๋†’์ด๋Š” ๋˜‘๊ฐ™๋”๋ผ๋„, ์ด๋“ค์€ ์™„์ „ ๋‹ค๋ฅธ ๋‘ ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค์ž„.
    4. 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

 

Apple Developer Documentation

 

developer.apple.com

 

 

๋ฐ˜์‘ํ˜•