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

iOS/Swift

Struct / Class ๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

 

Struct

๊ตฌ์กฐ์ฒด์˜ ๊ฒฝ์šฐ ๊ฐ’ ํƒ€์ž…์ด๋‹ค. ๊ฐ’ ํƒ€์ž…(Value Type) ์€ ํ•ด๋‹น ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ณต์‚ฌ๋  ๋•Œ ์ธ์Šคํ„ด์Šค์˜ ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณต์‚ฌ๋œ๋‹ค. ์ด๋Š” ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ๋ณต์‚ฌ๋ณธ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ฐ’์˜ ์ €์žฅ์€ ์Šคํƒ์—์„œ ์ผ์–ด๋‚˜๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋œ๋‹ค. ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ฅผ let์œผ๋กœ ์„ ์–ธ ์‹œ ์ €์žฅ ์†์„ฑ์ด ์ „๋ถ€ ์ƒ์ˆ˜๋กœ ์ €์žฅ๋œ๋‹ค. ๋˜ ๋ฉค๋ฒ„์™€์ด์ฆˆ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ์ž๋™์œผ๋กœ ์ œ๊ณตํ•˜๋ฉฐ, ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์†์„ฑ ๋ณ€๊ฒฝ์ด ์›์น™์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹ค๋งŒ mutating ํ‚ค์›Œ๋“œ๋กœ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๊ธด ํ•˜๋‹ค. ์†Œ๋ฉธ์ž๋Š” ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ƒ์†์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

struct Student {
	var name: String 
	var gender: String 
	
	init(name: String, gender: String) {
		self.name = name
		self.gender = gender 
	}
	
	func printInfo() {
		print("ํ•™์ƒ์˜ ์ด๋ฆ„์€ \\(name)์ด๊ณ  ์„ฑ๋ณ„์€ \\(gender)์ž…๋‹ˆ๋‹ค")
	}
}

var Brooklyn = Student(name: "Brooklyn", gender: "Female")

 

ํ•ด๋‹น ์ฝ”๋“œ๋Š” ๊ตฌ์กฐ์ฒด๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ๊ฐ๊ฐ์˜ ํ”„๋กœํผํ‹ฐ๋„ String์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์–ด ๊ฐ’ํƒ€์ž…์œผ๋กœ ๊ด€๋ฆฌ๋  ๊ฒƒ ๊ฐ™์€๋ฐ ์™œ ์ด๋“ค์€ ์ฐธ์กฐํƒ€์ž…์ด ๋˜๋Š” ๊ฑธ๊นŒ? String ํƒ€์ž…์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด Copy-On-Write ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค. String์ด ์ˆ˜์ •๋  ๋•Œ ๊นŒ์ง€๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์›๋ณธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.

 

์ด ์ตœ์ ํ™” ๋ฐฉ์‹์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ ์‹œํ‚จ๋‹ค. ์ฆ‰ Brooklyn์ด๋ผ๋Š” ์ธ์Šคํ„ด์Šค๋Š” ์Šคํƒ์— ์กด์žฌํ•˜์ง€๋งŒ, ๋‚ด๋ถ€์˜ ์ฐธ์กฐ ํƒ€์ž… ๋ณ€์ˆ˜๋“ค์€ ๊ฐ๊ฐ ์ˆ˜์ •๋˜๋Š” ์‹œ์ ์— Heap์— ์ €์žฅ๋˜๋ฉด์„œ ๋‘ ๊ฐœ์˜ ์ฐธ์กฐ ์นด์šดํŠธ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ์— ๊ตฌ์กฐ์ฒด๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, ์ฐธ์กฐ ์นด์šดํŠธ์— ๋Œ€ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ด๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ค๊ณ„ํ•ด์•ผํ•œ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฉด ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋ง ํ•ด๋ณด์ž.

 

enum Gender {
    case male
    case female
}

struct Student {
    var name: String
    var gender: Gender
    
    func printInfo() {
        print("ํ•™์ƒ์˜ ์ด๋ฆ„์€ \(name)์ด๊ณ  ์„ฑ๋ณ„์€ \(gender)์ž…๋‹ˆ๋‹ค")
    }
}

var Brooklyn = Student(name: "Brooklyn", gender: .female)

 

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ๋ฐ”๊พธ๋ฉด ๊ฐ’ํƒ€์ž…์ธ enum ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด๋ถ€ ์ฐธ์กฐ ์นด์šดํŒ…์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. gender์˜ ๊ฒฝ์šฐ ์ธ์Šคํ„ด์Šค์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์Šคํƒ์—์„œ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

/**
์ž‘๋™ ์›๋ฆฌ 
1. moveBy๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ํ˜„์žฌ์˜ Point ์ธ์Šคํ„ด์Šค๋Š” ์ž„์‹œ ๋ณต์‚ฌ๋ณธ์œผ๋กœ ๋ณต์ œ๋จ 
2. x, y ํ”„๋กœํผํ‹ฐ๋Š” ์ด ์ž„์‹œ ๋ณต์‚ฌ๋ณธ์—์„œ deltaX, deltaY ๋งŒํผ ์ฆ๊ฐ€ 
3. ๋ฉ”์„œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ž„์‹œ ๋ณต์‚ฌ๋ณธ์ด Counter ์ธ์Šคํ„ด์Šค๋ฅผ ๋Œ€์ฒดํ•จ 
**/

struct Point {
    var x: Int
    var y: Int

    mutating func moveBy(x deltaX: Int, y deltaY: Int) {
        x += deltaX
        y += deltaY
    }
}

 

Class

ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ ์ฐธ์กฐ ํƒ€์ž…์ด๋‹ค. ๊ฐ’์˜ ์ €์žฅ์€ Heap์—์„œ ์ด๋ฃจ์–ด์ง€๋ฉฐ, ์ฃผ์†Œ ์ „๋‹ฌ์˜ ๋ฐฉ์‹์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฒฝ์šฐ ARC๋กœ ๊ด€๋ฆฌ๋œ๋‹ค. ์ธ์Šคํ„ด์Šค๋ฅผ let์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณ ์ •๋˜์–ด, ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์—†๋‹ค. ๋˜ ํŽธ์˜ ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์†์„ฑ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์†Œ๋ฉธ์ž๊ฐ€ ์กด์žฌํ•˜๋ฉฐ ์ƒ์†์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

class Student {
	var name: String 
	var gender: String 
	
	init(name: String, gender: String) {
		self.name = name
		self.gender = gender 
	}
	
	func printInfo() {
		print("ํ•™์ƒ์˜ ์ด๋ฆ„์€ \(name)์ด๊ณ  ์„ฑ๋ณ„์€ \(gender)์ž…๋‹ˆ๋‹ค")
	}
}

var Brooklyn = Student(name: "Brooklyn", gender: "Female")

 

์ด ๊ฒฝ์šฐ์—๋Š” Brooklyn ์ธ์Šคํ„ด์Šค๊ฐ€ Heap์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ”๋ผ๋ณด๋Š” ํ˜•ํƒœ๊ฐ€ ๋˜๊ณ , ์ฐธ์กฐ ์นด์šดํŒ…์ด ํ•œ ๋ฒˆ ์ผ์–ด๋‚˜๊ฒŒ ๋œ๋‹ค. 

 

SwiftUI์—์„œ Struct๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

์—ฌ๊ธฐ์„œ ๊ถ๊ธˆ์ฆ์ด ์ƒ๊ฒผ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด SwiftUI์—์„œ ์™œ Struct๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ผ๊นŒ?

 

 ๐Ÿ”‘ ์ด์œ 

  1. ๊ฐ’ ํƒ€์ž…์˜ ํŠน์„ฑ: ๊ตฌ์กฐ์ฒด๋Š” ๊ฐ’ํƒ€์ž…์ด๋‹ค. ์ด๋Š” ๊ตฌ์กฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ณต์‚ฌ๋  ๋•Œ, ์‹ค์ œ ๊ฐ’์ด ๋ณต์‚ฌ๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ, ๊ฐ ์ธ์Šคํ„ด์Šค๋Š” ๋…๋ฆฝ์ ์ธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ํŠน์„ฑ ๋•๋ถ„์— UI ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๊ฐ€ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์— ์˜ํ•ด ์˜๋„์น˜ ์•Š๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ๋ถˆ๋ณ€์„ฑ ์ง€์›: SwiftUI๋Š” UI์˜ ์ƒํƒœ๋ฅผ ๋ถˆ๋ณ€์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•œ๋‹ค. ํ”„๋กœํผํ‹ฐ๋“ค์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถˆ๋ณ€์ด๋ฉฐ, ์ƒํƒœ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ช…์‹œ์ ์œผ๋กœ mutating ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ์ƒˆ๋กœ์šด ๊ตฌ์กฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ์‹์„ ์ทจํ•˜๊ธฐ ๋•Œ๋ฌธ์— UI๋ฅผ ๋” ์•ˆ์ •์ ์ด๊ณ  ๋ฒ„๊ทธ๋ฅผ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค.
  3. ์„ฑ๋Šฅ ์ตœ์ ํ™”: ๊ตฌ์กฐ์ฒด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์Šคํƒ์— ํ• ๋‹น๋˜๋ฉฐ, ํด๋ž˜์Šค์˜ ํž™ ํ• ๋‹น๊ณผ ์ฐธ์กฐ ์นด์šดํŒ…์œผ๋กœ ์ธํ•ด ๊ฒช๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์—†๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ์— SwiftUI๋Š” ๋งค์šฐ ๋น ๋ฅธ ์†๋„๋กœ ๋ทฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋‹ค.
  4. UI ์„ ์–ธ์  ์—…๋ฐ์ดํŠธ: SwiftUI๋Š” ์„ ์–ธ์  UI ์—…๋ฐ์ดํŠธ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ทฐ์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ตฌ์กฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์ƒˆ๋กœ์šด ๊ตฌ์กฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  SwiftUI ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ด๋ฅผ ํ†ตํ•ด UI๋ฅผ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŽธ๋ฆฌํ•˜๋‹ค.
  5. ์บก์Šํ™”: ๊ฐ’ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ๋ทฐ ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๊ฐ€ ์™„์ „ํžˆ ์บก์Šํ™” ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒํƒœ ์˜ค์—ผ์˜ ์œ„ํ—˜์ด ์ค„์–ด๋“ ๋‹ค.