티스토리 뷰
안녕하세요! Swallow입니다!
이번 포스팅은
⭐️ 클래스와 구조체의 특징과 차이점 ⭐️
관한 글입니다!
항상 어떠한 조언, 충고 환영입니다!
시작하기에 앞서 이 글은
앨런 Swift 문법 마스터 스쿨 강의와 야곰님의 스위프트 프로그래밍 책을
공부하고 참고하여 작성하였습니다!
그럼 시작하겠습니다!
이번 포스팅은
기본적인 클래스와 구조체의 이해가 있으셔야
좀 더 쉽게 이해하실 수 있습니다!
첫 번째로
먼저 알아두면 좋은 부분부터 간단히 말씀드리겠습니다!
클래스(Class)의 특징부터 알아볼까요?
클래스(Class)는
Reference Type(참조 타입)입니다!
인스턴스 생성 시에 Heap영역에 저장이 되면서
Heap영역에 생성된 인스턴스의 주소는
Stack영역에 저장이 됩니다!
구조체(Struct)는
Value Type(값 타입)입니다!
인스턴스 생성 시에 클래스와 다르게 Heap영역이 아닌
바로 Stack에 생성이 됩니다!
오잉..? 🙄
그런데 위에서 말한 참조 타입, 값 타입이 뭐죠..?
이해가 되시도록 예시와 설명을 같이 드릴게요!
쉬운 이해를 위해 구조체와 비교를 하면서 말씀드리겠습니다!
클래스(Class)의 참조 타입은
인스턴스를 생성을 하고
새로운 변수에 할당을 했을 때
값이 복사가 되는 것이 아닌,
같은 인스턴스를 참조합니다!
말이 좀 어렵죠..ㅎ
예시를 바로 보여드릴게요!

Person클래스를 하나 만들어서
name과 age라는 저장 속성을 만들었습니다!
기본값을 넣어주고
man변수에 Person()을 통해서
인스턴스를 생성을 하고
man.name
즉, 생성한 인스턴스의 name을 알아보았습니다!
"swallow"가 보이네요?
그러면 이제
위에서 말씀드린, 새로운 변수에
할당을 했을 때
값의 복사가 아닌, 같은 인스턴스를 참조한다
라는 말의 의미를 알아볼게요!

짜잔!! 😋
새로운 male변수에 man을 할당을 했습니다!
밑에, male.name을 알아보고 있네요!
위의 예시와 같이
"swallow"가 보입니다???
어라..?
근데 같은 "swallow"가 보이는데
이게 값의 복사가 아니면
도대체 뭐죠?
라고 생각하실 수 있어요!
바로 해결해드릴게요!

자!
man.name에 "스왈로"라는 값을 주었습니다
그 후에 male.name을 확인해 보니까
"스왈로"라고 보이네요?
그런데 그 밑에
다시 male.name에 "제비"를 넣어주었습니다!
그리고 다시 man.name을 확인해 보니
"제비"?????????????
분명 위에서 "스왈로"라는 값을 넣어주었는데
male.name에 "제비"값을 넣어준 후
다시 확인해 보면
"스왈로" -> "제비"
이렇게 변하게 됩니다!
이것이 제가 말한
값의 복사가 아닌,
같은 인스턴스를 참조한다 라는 말입니다!
아직 이해가 좀 덜 오 실 수도 있어요!
그런데 구조체(Struct)의
예시를 보신다면 바로 이해가 되실 겁니다!
구조체는 클래스와 반대로 참조가 아닌, 값의 복사입니다!

Chicken구조체를 만들었고
brand라는 저장속성을 만들어서 값을 넣어주었습니다!
favorite변수에 Chicken()으로
인스턴스를 생성을 했습니다!
그 후에
favorite.brand를 알아보면
당연히! "비비큐"가 나옵니다!
바로 밑에
sencond변수에 favorite을 할당하고
second.brand를 알아보면
"비비큐"가 나오네요?
어? 그러면 위의 클래스 예시랑 도대체
뭐가 다른 겁니까?
라고 생각하실 수 있어요!

이렇게 다르답니다!
위의 사진에서는
favorite.brand에는 "비비큐" 값이 할당되어있고
second.brand에도 "비비큐" 값이 들어가 있었습니다!
그런데 이번 예시에서
second.brand에 "BHC" 값을 할당해 주었죠!
그런 뒤에
second.brand
favorite.brand
둘 다 확인을 해보니
오....!!!
클래스 예시와는 다르게
서로 다른 값을 가지고 있네요?
이런 점이 구조체는 참조가 아닌 값의 복사다!
라고 말씀드릴 수 있습니다!
정리하자면
클래스는 같은 인스턴스를 참조하고 있으니
복사를 해서 새로운 변수에 담는다면
하나가 바뀌면 당연히 똑같은 인스턴스를 참조하고 있는 녀석도
같이 바뀐다! 🔥
라는 내용입니다!
구조체는 참조가 아닌 값의 복사로 인해
새로운 변수에 복사를 한다면
새로운 메모리를 하나 생성을 하는 것이고
하나가 바뀌어도 다른 하나는 이것과 별개로 다른 메모리 공간을
가지고 있는 것이기에,
하나의 메모리에 값의 변화를 주어도
다른 하나는 변하지 않는다! 💧
라는 내용입니다!
그리고
클래스와 구조체의 메모리 관리 방식에 대한 차이점이 존재합니다!
구조체의 경우
값 타입이기 때문에
스택에 저장이 된다고 말씀을 드렸습니다!
그렇기 때문에
값이 들어있는 스택의 스코프(범위)가 종료가 되면
메모리에서 자동 제거됩니다!
클래스의 경우
참조 타입이기 때문에
Heap에 저장이 되는데,
ARC로 관리를 해주어야 합니다!
ARC에 관한 내용은 나중에 다루겠습니다!
오늘 준비한 내용은 여기까지 입니다!
다음 포스팅에서는
⭐️ 클래스와 구조체의 특징과 차이점 ⭐️
두 번째 이야기를 해보겠습니다!
감사합니다!
피드백 언제나 환영입니다!
'Swift' 카테고리의 다른 글
| 속성(프로퍼티) 정복하기 - 1장 (0) | 2022.06.24 |
|---|---|
| 클래스(Class)와 구조체(Struct)의 특징과 차이점 정복하기 - 2장 (0) | 2022.06.24 |
| 열거형(Enumeration) 정복하기 - 4장 (0) | 2022.06.02 |
| 열거형(Enumeration) 정복하기 - 3장 (0) | 2022.06.01 |
| 열거형(Enumeration) 정복하기 - 2장 (0) | 2022.05.30 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
TAG
- 옵셔널 추출
- SWiFT
- 속성 감시자
- 원시값
- optional unwrapped
- 열거형
- enum
- 옵셔널 바인딩
- 옵셔널 패턴
- Swift enum
- 옵셔널
- Type Methods
- 연관값
- 스위프트 메서드
- 열거형 case 패턴
- swift struct
- Optional pattern
- swift class
- 클래스 구조체 차이
- 서브스크립트
- Swift Instance
- Instance Methods
- 저장 타입 속성
- 저장 타입 프로퍼티
- optional
- 스위프트
- Property Observers
- 프로퍼티 옵저버
- optional unwrapping
- Swift Methods