class/ struct, enum 어떤 걸 사용해야 할까?

인생노잼시기·2021년 6월 18일
0

🦅 스위프트 문법

목록 보기
10/13

찾아본 계기

음악 재생 프로그램을 만들면서 아래와 같은 상황이 있었기 때문이다

  1. url로 데이터를 가져온다
  2. model에 값을 저장한다
  3. 저장한 값 중 웹에 저장된 mp3 파일을 원할 때 가져오고 싶다

해당 노래를 누르면
노래 정보를 가져온 후(1)
원할 때마다 노래 파일 정보만 가져와서 재생하고 싶은데(3)
노래 파일 정보가 담겨 있는 모델의 데이터 타입이 클래스가 되어야 하나? 싶어서 찾아보고 있다.

참조타입과 값타입의 특징

참조타입: class, objective-C와 같이 NSObject를 상속받았다
값타입: struct, enum

간단하게 말하면 참조타입의 값을 변경하면 원본에 있는 값도 변한다는 것이다


// Value type example
struct S { var data: Int = -1 }
var a = S()
var b = a						// a is copied to b
a.data = 42						// Changes a, not b
println("\(a.data), \(b.data)")	// prints "42, -1"

// Reference type example
class C { var data: Int = -1 }
var x = C()
var y = x						// x is copied to y
x.data = 42						// changes the instance referred to by x (and y)
println("\(x.data), \(y.data)")	// prints "42, 42"

언제 무엇을 사용할 것인가?

값타입을 사용하는 경우

  • 인스턴스의 값(data)을 비교해야할 때
    == 사용할 때
extension Point: Equatable { }
func ==(lhs: Point, rhs: Point) -> Bool {
  return lhs.x == rhs.x && lhs.y == rhs.y
}
  • 카피된 인스턴스의 값이 독립적이어야 할 때
struct Shape {
  var center: Point
}

let initialPoint = Point(x: 0, y: 0)
let circle = Shape(center: initialPoint)
var square = Shape(center: initialPoint`

square.center.x = 5   // {x: 5.0, y: 0.0}
circle.center         // {x: 0.0, y: 0.0}
//square의 center 값을 바꾸어도 circle에 영향을 주지 않는다

참조타입을 사용하는 경우

  • 인스턴스를 비교해야할 때
    === 사용할 때
  • shared, mutable(변하기 쉬운) 인스턴스를 만들 때
    은행 거래를 생각하면 된다
class Account {
  var balance = 0.0
}

class Person {
  let account: Account

  init(_ account: Account) {
    self.account = account
  }
}

let account = Account()

let person1 = Person(account)
let person2 = Person(account)

person2.account.balance += 100.0

person1.account.balance    // 100
person2.account.balance    // 100

출처
https://www.raywenderlich.com/9481-reference-vs-value-types-in-swift
https://developer.apple.com/swift/blog/?id=10
https://velog.io/@msi753/2-1.-값타입과-참조타입-스위프트

결론
음... 개념은 대충 잡혔지만
섞어서 쓰는 단계까진 못왔다
이것 저것 고려한 뒤 결정을 내리고
내가 선택하기 나름의 문제인 거 같다

profile
인생노잼

0개의 댓글