๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿฅ– Bread Basics/Swift

Swift ๊ณต์‹ ๋ฌธ์„œ ์ •๋ฆฌ - ๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค (Structures and Classes)

by BreadDev 2025. 4. 11.
728x90

์•ˆ๋…•ํ•˜์„ธ์š”. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” ๊ตฌ์กฐ์ฒด(Structures)์™€ ํด๋ž˜์Šค(Classes)์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ธฐ๋ณธ์ด ๋˜๋Š” ์ด ๊ฐœ๋…๋“ค์€ Swift์—์„œ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜๋Š”์ง€, ์–ด๋–ค ํŠน์ง•์ด ์žˆ๋Š”์ง€ ํ•จ๊ป˜ ์‚ดํŽด๋ด…์‹œ๋‹ค.

๐Ÿ“Œ ๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค๋ž€?

๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค๋Š” ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ์˜ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋˜๋Š” ๋ฒ”์šฉ์ ์ด๊ณ  ์œ ์—ฐํ•œ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๋‘ ๊ตฌ์กฐ ๋ชจ๋‘ ๋ฐ์ดํ„ฐ๋ฅผ ์บก์Аํ™”ํ•˜๊ณ  ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž…์„ ๋ชจ๋ธ๋งํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์บก์Аํ™”(Encapsulation): ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ์™€ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ๋ฌถ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•

Swift์—์„œ๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๋‹ฌ๋ฆฌ ๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ ๋ณ„๋„์˜ ์ธํ„ฐํŽ˜์ด์Šค ํŒŒ์ผ๊ณผ ๊ตฌํ˜„ ํŒŒ์ผ์„ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ํŒŒ์ผ์— ๋ชจ๋“  ์ •์˜๊ฐ€ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

๐Ÿ“Œ ๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค์˜ ๊ณตํ†ต์ 

Swift์—์„œ ๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค๋Š” ๋งŽ์€ ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  1. ํ”„๋กœํผํ‹ฐ(Properties): ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ
  2. ๋ฉ”์„œ๋“œ(Methods): ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜ ์ •์˜ ๊ฐ€๋Šฅ
  3. ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ(Subscripts): ๊ฐ’์— ์ ‘๊ทผํ•˜๋Š” ๊ฐ„ํŽธํ•œ ๊ตฌ๋ฌธ ์ œ๊ณต
  4. ์ดˆ๊ธฐํ™”(Initialization): ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜๋Š” ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ์ œ๊ณต
  5. ํ™•์žฅ(Extensions): ๊ธฐ๋ณธ ๊ธฐ๋Šฅ ํ™•์žฅ ๊ฐ€๋Šฅ
  6. ํ”„๋กœํ† ์ฝœ(Protocols): ํŠน์ • ๊ธฐ๋Šฅ ์ค€์ˆ˜ ๊ฐ€๋Šฅ

๐Ÿ“Œ ํด๋ž˜์Šค๋งŒ์˜ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ

ํด๋ž˜์Šค๋Š” ๊ตฌ์กฐ์ฒด๋ณด๋‹ค ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  1. ์ƒ์†(Inheritance): ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ํŠน์„ฑ์„ ์ƒ์† ๊ฐ€๋Šฅ
  2. ํƒ€์ž… ์บ์ŠคํŒ…(Type Casting): ๋Ÿฐํƒ€์ž„์— ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค ํƒ€์ž… ํ™•์ธ ๋ฐ ํ•ด์„ ๊ฐ€๋Šฅ
  3. ์ดˆ๊ธฐํ™” ํ•ด์ œ(Deinitializers): ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋  ๋•Œ ์ •๋ฆฌ ์ž‘์—… ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ
  4. ์ฐธ์กฐ ์นด์šดํŒ…(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์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ ์ง€์นจ์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค:

  1. ๊ตฌ์กฐ์ฒด๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•˜์„ธ์š”:
    • ๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ์บก์Аํ™”ํ•  ๋•Œ
    • ๋ณต์‚ฌ ์‹œ ์ฐธ์กฐ๋ณด๋‹ค ๋ณต์‚ฌ๊ฐ€ ํ•ฉ๋ฆฌ์ ์ผ ๋•Œ
    • ์ƒ์†์ด ํ•„์š” ์—†์„ ๋•Œ
  2. ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ:
    • ์ƒ์†์ด ํ•„์š”ํ•  ๋•Œ
    • ์ฐธ์กฐ ํƒ€์ž…์ด ํ•„์š”ํ•  ๋•Œ
    • ์ธ์Šคํ„ด์Šค์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ๋•Œ