momodudu.zip
#9 Swift - class, struct에 대해서 다시 짚어보기 본문
약 6개월전, 처음으로 swift를 공부하면서 스쳐지나가듯이 본 구절이 있었다.
"Swift에서 class는 reference Type이고, struct는 value Type이다."
그냥 스쳐지나가듯이 본거여서 그러려니, 했었다. 그러다가 오늘 코드를 짜다가 이런 문제(?)가 발생하게 됐는데..
class SomeClass: NSObject {
func setItem(_ item: Int) {
_item = item
}
var _item: Int
}
func test() {
var itemList = [SomeClass]()
var count: Int = 0
for _ in 1...10 {
let someObj = SomeClass()
somObj.setItem(count)
itemList.append(someObj)
count += 1
}
}
위 코드는 그 문제(?)를 그냥 간단하게 나타내는 코드다. Int type의 var를 set할 수 있는 함수를 담고있는 SomeClass가 있다.
그리고 테스트 func에서는 임시객체 역할을 하는 someObj 라는 객체를 만들어서 for문을 돌리면서 count를 하나씩 올려가면서 SomeClass array에 담고 있다.
사실 별 생각 없이 짰을땐 위 코드의 결과가 첫번째는 item이 0인 SomeClass, 두번째는 item이 1인 SomeClass, 세번째는 2인...
하지만 결과는 모두 값이 똑같은 item이 들어있다.. 즉, array에 들어간 객체는 모두 다 같은 객체라는것.
여기서 문득 저 말이 떠올랐다.
"Swift에서 class는 reference Type이고, struct는 value Type이다."
즉 내가 클래스를 만들면 클래스 인스턴스를 담을 수 있는 크기만큼의 메모리 공간이 할당되고, 클래스에 접근하여 변경하는것은 모두 그 메모리 주소를 참조하여 변경이 일어나는것이다. 즉 위와 같은 예제에서 SomeClass를 class Type이 아닌 struct로 구현하게 된다면 원하던 결과값을 얻을 수 있을것이다.
사실 C++에선 struct와 class의 차이는 default 접근제한자의 차이밖에 없다. 그래서 주로 struct를 쓸 땐 약간 복합적인 의미를 담고있는 객체 그 자체보다 Point { int x, int y } 처럼 간단한 데이터 구조만 struct로 쓰는 습관을 가지고 있었는데..
다시 한번 되짚어보니 스위프트에서는 아예 쓰임새가 달라질 수 있다는 점.
실제로 임베디드 소프트웨어쪽 개발을 했었기때문에 for문을 돌면서 스택에 임시객체를 계속 생성하는것은 좋지않다. 라는 관념을 가지고 있었어서... 그래서 그냥 위와 같이 아무생각없이 썼었는데 틀린 코드였다.
요런건 사실 그냥 글로 읽는것보다, 실제로 문제를 겪고 깨달아봐야 머릿속에 깊게 남는것 같다!
사실 6개월동안 계속 옵씨와 스위프트를 써서 이제 머릿속에 생각한건 다 구현할 수 있는 정도라고 생각했는데... 아직 부족하다 -_-...
'ios > Swift' 카테고리의 다른 글
#11 MVC와 MVVM 패턴에 관하여 (0) | 2020.08.28 |
---|---|
#10 Swift - Protocol as Interface (0) | 2020.04.29 |
#8 Swift - Automatic Reference Counting (0) | 2019.12.28 |
#7 Swift - Protocol(1) (0) | 2019.11.28 |
#6 Swift - Extension (0) | 2019.11.28 |