본문 바로가기
Programming/Swift

[Swift] class와 struct에 대하여

by IN.0 2022. 1. 10.
728x90
반응형

요즘 Swift 공부를 시작했는데, class와 struct를 구분하는 개념과 쓰임새에서 막혀서

포스팅을 하며 이해하고자 한다.

가장 이해가 안 되는 안되었던 것 : value type / reference type

class ClassSample {
    var classProperty: Int = 100
}

var test1 : ClassSample = ClassSample()
test1.classProperty = 200
var test2 = test1
test2.classProperty = 300
print(test1.classProperty) // 300

struct StructSample {
    var structProperty: Int = 100
}

var test3 : StructSample = StructSample()
test3.structProperty = 200
var test4 = test3
test4.structProperty = 300
print(test3.structProperty) // 200

class는 test1, 2를 동일 취급하고, struct는 test3, 4를 다르게 가져간다. (복사하는 듯하다)

왜 복사를 하는지? 목적성은 둘째 치고, struct를 어떻게 취급해야 하는지 감이 안 온다. 안 왔다.

의문 해결 :

=> 우리가 a에 있는 (string이나 int같은)값을 b에 할당하고,
b를 다른 값으로 바꾸면 a에 영향이 없는 것(단순히 a의 값이 b에 복사 되었던 것)처럼
struct를 값처럼 취급하는 듯하다.
(조금 더 들어가면, 할당(b=a)할 때가 아니라 값을 변경(b=1)할 때 복사가 일어난다.)

이것을 struct는 value type, classs는 reference type이라고 표현한다.

그래서 struct가 value type이면 뭐가 좋은지? (목적)
=> 독립적인 복제본이 필요할때 쓰인다고 하는데.. 명확한 예제를 찾지 못했다.
프로퍼티가 많은 상황에서 그중 소수의 값만 다른 복제본을 만들때 사용하지 않을까?

 

그다음 이해가 안 되는 안 되었던 것 :

class ClassSample {
    var classProperty: Int = 100
}

let test1 : ClassSample = ClassSample()
test1.classProperty = 200 // 정상작동

struct StructSample {
    var structProperty: Int = 100
}

let test3 : StructSample = StructSample()
test3.structProperty = 200 // 오류발생

test1, 3 모두 let인데 왜.. class를 받은 test1은 정상 작동하고, struct를 받은 test3은 오류가 발생하는지?

단순히 let은 불변이니까 둘 다 오류가 발생해야 하는 것 아닌가? 하는 생각이 들었다.

의문 해결 :

위에서 class는 참조타입, struct는 값타입 이라고 힌트를 얻었다.

참조는 A = B 일때 A가 B의 메모리를 가리키는 것,
값은 A = B 일때 A가 새로운 메모리를 할당하여 그것을 가리키는 것
(struct의 경우 값이 변경될 때 발생)

let은 값이 변하지 않도록 하는 것이 아니라, 자신이 가리키는 메모리가 변하지 않도록 한다.
그래서 가리키는 메모리 안의 값이 변해도 상관이 없다.
=> struct는 메모리 안의 값 변경이 불가능하며, 변경될 경우 다른 메모리로 바뀜을 유추할 수 있다.
* mutating func을 사용하더라도 이것을 상수 변경 행위로 보기 때문에,
굳이 struct 안의 데이터를 수정하고 싶은 경우엔 let을 사용하면 안된다.

참조 : http://seorenn.blogspot.com/2014/07/swift-let.html

728x90
반응형

댓글