๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ ๊ธฐ๋ก/TIL

[TIL] 20231123

๊ตฌ์กฐ์ฒด(struct)์™€ ํด๋ž˜์Šค(class)

๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์šฉ๋„์— ๋งž๊ฒŒ ๋ฌถ์–ด ํ‘œํ˜„ํ•˜๊ณ ์ž ํ•  ๋•Œ ์œ ์šฉํ•จ

๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค๋Š” ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ์™€ ๊ธฐ๋Šฅ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

ํด๋ž˜์Šค๋‚˜ ๊ตฌ์กฐ์ฒด๋ฅผ ์ •์˜ํ•œ๋‹ค == ํ•˜๋‚˜์˜ ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž ์ •์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ฒƒ

๊ตฌ์กฐ์ฒด vs. ํด๋ž˜์Šค

๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค ๋น„๊ต(๊ณต์‹๋ฌธ์„œ ๋ฒˆ์—ญ, WWDC ์ž๋ฃŒ ์ฐธ๊ณ )

๊ณตํ†ต์ 

  • ๊ฐ’์„ ์ €์žฅํ•  ํ”„๋กœํผํ‹ฐ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ํ†ตํ•ด ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • extension์„ ์‚ฌ์šฉํ•ด ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํŠน์ • ์ข…๋ฅ˜์˜ ํ‘œ์ค€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ฐจ์ด์ 

class 

  • ์ฐธ์กฐ ํƒ€์ž…(Reference Type)
  • ์ƒ์†์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ํƒ€์ž… ์บ์ŠคํŒ…์„ ํ†ตํ•ด ๋Ÿฐํƒ€์ž„์— ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์˜ ํƒ€์ž…์„ ์ฒดํฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • deinitializer๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ARC๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

struct

  • ๊ฐ’ ํƒ€์ž… (Value Type)

+ WWDC ์ž๋ฃŒ๋ฅผ ์ฐธ๊ณ ํ•ด struct์™€ class๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ์ธก๋ฉด์—์„œ ๋น„๊ตํ•ด๋ณด๊ธฐ

 

1. ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์—์„œ ํ• ๋‹น๋˜๋Š” ์œ„์น˜

- struct๋Š” stack ์˜์—ญ์— ์ €์žฅ๋จ

stack ์˜์—ญ์— ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ํฌ๊ธฐ๊ฐ€ ๊ฒฐ์ •๋จ -> ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋”ฐ๋กœ ํ•„์š”์—†์Œ

์ƒํƒœ์ ์œผ๋กœ ํ• ๋‹น๊ณผ ํ•ด์ œ๊ฐ€ ๋น ๋ฅด๊ณ  Thread Safeํ•จ

 

- class๋Š” heap ์˜์—ญ์— ์ฃผ์†Œ ๊ฐ’์ด ์ €์žฅ๋จ

ํž™ ์˜์—ญ์— ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์ด ์•„๋‹Œ ๋Ÿฐํƒ€์ž„์— ํฌ๊ธฐ๊ฐ€ ๊ฒฐ์ •๋จ

ํž™ ์˜์—ญ์€ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค์˜ ์Šค๋ ˆ๋“œ๋“ค์ด ๊ณต์œ ํ•˜๋Š” ์˜์—ญ์ด๊ธฐ ๋•Œ๋ฌธ์— Thread Safeํ•˜์ง€ ์•Š์Œ

ํž™ ์˜์—ญ์€ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์— ์—ฐ์†์ ์œผ๋กœ ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ์Œ

 

2. ํด๋ž˜์Šค๋Š” ARC๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ

struct๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ํ• ๋‹นํ•  ํฌ๊ธฐ๊ฐ€ ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”์—†์Œ

reference count๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ผ์œผํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์„ฑ๋Šฅ ๊ฐœ์„  ํ•„์š”ํ•จ

์„ฑ๋Šฅ ๊ฐœ์„  ๋ฐฉ๋ฒ•? final ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ!

Value ํƒ€์ž…(๊ฐ’ ํƒ€์ž…) vs Reference ํƒ€์ž…(์ฐธ์กฐ ํƒ€์ž…)

Valueํƒ€์ž…๊ณผ Referenceํƒ€์ž…์€ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฐฉ์‹์— ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

  • Value: ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ๊ฐ’์„ ๋ณต์‚ฌํ•˜์—ฌ ์ „๋‹ฌ
  • Reference: ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ๊ฐ’์˜ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜๋ฅผ ์ „๋‹ฌ

Struct๋Š” Value ํƒ€์ž…(๊ฐ’ ํƒ€์ž…)์ด๋ฏ€๋กœ ๊ฐ’์„ ๋ณต์‚ฌํ•˜์—ฌ ์ „๋‹ฌ
๋”ฐ๋ผ์„œ second๋Š” first๋ฅผ ๋˜‘๊ฐ™์ด ๋ณต์‚ฌํ•œ ๋ณ„๋„์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋˜๋Š” ๊ฒƒ
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— second์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด๋„ first์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์—๋Š” ์˜ํ–ฅ์ด ์—†๋‹ค.

 

struct ValueType {
    var property = 1
}

class ReferenceType {
    var property = 1
}
var first = ValueType() 
var second = first 
second.property = 2

print(first.property) // 1
print(second.property) // 2
 

Class๋Š” Reference ํƒ€์ž…(์ฐธ์กฐ ํƒ€์ž…)์ด๋ฏ€๋กœ ๊ฐ’์˜ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜๋ฅผ ์ „๋‹ฌ
๋”ฐ๋ผ์„œ third์™€ fourth๋Š” ๋ณ„๋„๋กœ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ™์€ ์œ„์น˜(๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ)๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฒƒ
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— fourth์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด third์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’๋„ ๋ณ€๊ฒฝ๋œ๋‹ค.

 

var third = ReferenceType() 
var fourth = third
fourth.property = 2

print(third.property) // 2
print(fourth.property) // 2

mutating ํ‚ค์›Œ๋“œ

๊ธฐ๋ณธ์ ์œผ๋กœ, ๊ฐ’ ํƒ€์ž…์˜ ํ”„๋กœํผํ‹ฐ๋Š” ๋‚ด๋ถ€์—์„œ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋‚ด๋ถ€์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค.

 

struct Point {
    var x = 0.0, y = 0.0
    mutating func moveBy(x deltaX: Double, y deltaY: Double) {
        x += deltaX  // error
        y += deltaY  // error
    }
}

 

ํ•˜์ง€๋งŒ ํŠน์ • ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ๊ฐ’ ํƒ€์ž…์ธ ๊ตฌ์กฐ์ฒด(struct) ํ˜น์€ ์—ด๊ฑฐํ˜•(enum)์˜ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ,

func ์•ž์— mutating ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ mutating ๋ฉ”์„œ๋“œ๋ผ๋Š” ๊ฒƒ์„ ๋ช…์‹œํ•˜์—ฌ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ, mutating ๋ฉ”์„œ๋“œ์—์„œ๋Š” ์•”์‹œ์  self ํ”„๋กœํผํ‹ฐ์— ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.

(mutating ๋ฉ”์„œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ๋‹ค์‹œ ๊ธฐ์กด์˜ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ๋จ)

๋‚ด๋ถ€์—์„œ ๊ฐ’ ๋ณ€๊ฒฝํ•˜๊ธฐ

struct Point {
    var x = 0.0, y = 0.0
    mutating func moveBy(x deltaX: Double, y deltaY: Double) {
        x += deltaX
        y += deltaY
    }
}
var somePoint = Point(x: 1.0, y: 1.0)
somePoint.moveBy(x: 2.0, y: 3.0) // x: 3.0, y: 4.0 ์œผ๋กœ ๋ณ€๊ฒฝ๋จ

 

mutating ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์—์„œ ๊ตฌ์กฐ์ฒด ๋‚ด๋ถ€์˜ ๊ฐ’(x, y)์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

โš ๏ธ ์ฃผ์˜ํ•  ์ : mutating ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ๋‹น์—ฐํžˆ ์ƒ์ˆ˜(let) ๊ฐ’์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ

์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค ํ• ๋‹น

struct Point {
    var x = 0.0, y = 0.0
    mutating func moveBy(x deltaX: Double, y deltaY: Double) {
        self = Point(x: x + deltaX, y: y + deltaY)
    }
}

 

์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์—์„œ self๋ฅผ ํ†ตํ•ด ๋‚ด๋ถ€์—์„œ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค ํ• ๋‹น

mutating moveBy(x:y:) ๋ฉ”์„œ๋“œ๋Š” x, y ๊ฐ’์ด ํƒ€๊ฒŸ ์œ„์น˜๋กœ ์„ค์ •๋œ ์ƒˆ ๊ตฌ์กฐ์ฒด๋ฅผ ๋งŒ๋“ฆ

'๐Ÿ“ ๊ธฐ๋ก > TIL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[TIL] 20231129  (1) 2023.11.29
[TIL] 20231128  (3) 2023.11.29
[TIL] 20231124  (1) 2023.11.25
[TIL] 20231122  (0) 2023.11.22
[TIL] 20231121  (0) 2023.11.21