본문 바로가기

iOS/Swift

Swift) String에 대한 고찰 (1) - Struct인데 Heap에 저장 된다고?

안녕하세요? :) 

연휴를 즐기고 온 소들입니다

 

흠.......................................

이번 포스팅은 말 그대로 "고찰" 이에요..........

늘 포스팅을 쓰기 전에 혹여나 잘못된 정보가 있나

되게 열심히 공부하고 쓰는데...

 

이번 내용은 공부 자료가 거의 없엉 엉엉 ㅜㅜ

 

그래서 혼자 고민해본 내용을 일기 쓰듯 쓰는 겁니다.....

 

틀린 내용일 수 있고.. 명확한 답도 없으니

혹시 읽으시는 분은 부디

 

참고......

 

만 하시길..... /_\

고찰인 만큼 최종 결론이 아직 없어요..

있었는데? 아니 그냥 없어요...

(모든 포스팅 내용은 편의상 음슴체......)

 

 

 

 

 

1. String은 Heap에 저장된다

 

고찰이긴 하지만.. 

Swift에서 String이 Heap에 저장된다는 것은 사실임

 

근데 난 듣고 이해가 안 됐음...

왜....?

String은 struct고

 

 

 

 

struct는 값타입 이니까 Swift 메모리 저장 방식이라면 stack에 저장되어야 하잖음??

근데 스위프트 고수들 말론 String은 Heap에 저장된다고 함

 

따라서 왜 Heap에 저장되는지에 대한 고찰임 ...ㅎㅎ

 

 

 

 

 

2. Swift에서 문자열은 두 가지니까..?

 

먼저 String에 대한 고찰을 해봤음

Swift에서 문자열은 대개 String을 쓰지만,  다 알고 있겠지만 사실 두 가지임

 

 

바로 Objective-C의 문법인

 

 

 

 

NSString 이라는 놈도 있음

 

이 둘의 차이점은 다음과 같음

 

 

 

String

NSString

자료형

Struct

Class

특징

값 형식

참조 형식

메모리 저장 위치

Heap

 

 

 

NSString은 String과 달리 Class로 되어 있으며,

따라서 Instance가 생성될 시 자동으로 Heap에 할당되는 게 정상임

 

근데 이 String과 NSString은 다음과 같이 서로 호환됨

 

 

 

 

 

대신

Type Casting을 해준다는 전제 하에....!!!

 

개발자 문서에선 두 문자열이

bridge가 가능한 문자열이라고 설명함

 

bridge는 Objective-C 할 때 꽤나 썼던 것인데,

Core Foundation 자료형 ↔ Objective-C 자료형

이런 식으로 변환할 때 사용함

 

Core Foundation 자료형은 ARC가 적용되지 않아 내가 직접 메모리를 해제해줘야 하지만,

ARC가 적용된 Objective-C 자료형과 아무런 cost 없이 Type Casting을 통해 쓸 수 있다

(이때, 메모리 해제에 대한 권한을 이전 하느냐 마느냐의 내용도 있는데, Objective-C의 내용이고 길어지니까 스킵)

 

이게 가능한 이유는 Core Foundation 자료형과 Objective-C 자료형이

 

Toll-Free bridging

 

이 되기 때문이라 함

아무런 비용 없이 가능하단 뜻인듯 ㅎㅎ

뭐 어떻게 그게 가능한 건진 애플에게 물어보셈.. ㅜㅜ (내 머리론 한계)

 

 

다시 Swift로 넘어와서,

String과 NSString이 자유자재로 넘나들며 쓸 수 있는 이유는

이 위에서 살펴본

 

Toll-Free bridging

 

이 되기 때문임

 

.

.

 

근데...........

지금 내 결론으론 birdge 개념은 그냥 알아두면 좋은 것일 뿐인 거 같고

핵심은 얘가 아닌 거 같아.... 

 

여기서 중요한 것은 

 

 

String과 NSString이 Type casting 된다는 것

 

같음...!

 

 

 

 

 

2-1. Type Casting은 클래스 Instance를 대상으로 하니까..?

 

 

흠...........

먼저, Type Casting에 대한 Swift 문서를 찾아봤음 

 

 

docs.swift.org/swift-book/LanguageGuide/TypeCasting.html

 

Type Casting — The Swift Programming Language (Swift 5.3)

Type Casting Type casting is a way to check the type of an instance, or to treat that instance as a different superclass or subclass from somewhere else in its own class hierarchy. Type casting in Swift is implemented with the is and as operators. These tw

docs.swift.org

 

 

이 링크인데

 

 

 

 

첫 줄부터 보면

 

Type Casting은 인스턴스 유형을 확인하거나

해당 인스턴스를 자신의 클래스 계층 구조에서, 다른 슈퍼 클래스 또는 하위 클래스로 취급하는 방법이다

 

 

라고 함.. 뭐 이부분만 봐도

Swift에서 Type Casting은 클래스 Instance를 대상으로 한다는 것을 알 수 있음

 

 

당연히 다음과 같이 구조체는 Type Casting을 지원하지 않음

 

 

 

 

타입 캐스팅은 클래스 Instance만 지원하니까..!!!!!!!!!

훔...... 내 의미심장한 결론은 다음과 같음

 

 

Swift에서 String은 구조체로 선언되어 있으나, NSString과 bridge를 하기 위해서

객체 생성 시 클래스 Instance로 할당되어 Heap에 할당된다

 

 

아니 그럼 왜 Struct로 만든거지..?

내가 내린 결론이지만...  가능한 건가......

매우 아리송하다....

 

 

 

 

 

 

3. Array와 NSArray도 Type Casting이 되는데..?

 

 근데 또 궁금한 점.................................................

Array와 NSArray도 다음과 같이 Type Casting이 된단 말임..?

 

 

 

 

이런 시긍루...........

그럼 Array 객체도 Heap에 저장되는 것일까..............................???????????

 

 

포인터가 가리키는 주소값을 찍는 함수를 이용해

 

 

 

 

명확한 구조체 타입인 Int, 커스텀 Struct Type과

Struct지만 타입캐스팅이 가능한 Array, String Type 을 찍어 보았따......

 

 

 

 

결과는 타입 캐스팅이 가능한 두 type만 출력이 가능하다..

 

근데 이거 보고 처음엔 오호? 그래서 그런건가? 했는데

생각해보니까 Array는 Stack vs Heap 여부와 상관 없이 첫 element의 주소값을 가리키는 Pointer 아님?

 

그래서 헷갈렸는데

 

 

 

 

그러기엔 name과 array의 주소값의 범위가 찍을 때마다 거의 비슷함...

무슨 말이냐면 Stack이랑 Heap은 같은 메모리 영역을 공유하기 때문에

한 놈은 스택이고, 한 놈은 힙이라 하면.. 저렇게 비슷하게 나올 수 없지 않나......?

 

그럼  array도  name과 같이 Heap에 저장된단 건가....????

 

 

엥..? 근데 Array를 Swfit에서 Struct로 만든 이유가 뭐임

 

Heap보다 비교적 작고 가볍고 빠르고 cow도 가능하고

뭐 그런 이유에서 Struct로 만든 거 아니겠음...

 

근데 위 내용을 보면 어차피 Heap에 할당 되면

클래스 Instance로 동작하고, 그러면 Struct의 이점을 활용하지 못할텐데

........................................................................

 

뭔가 아주 단단히 잘못 되어가고 있다..

어디서부터 단추를 잘못 꿴 것일까? 하하하하

 

 

 

 

.

.

.

뭐지..?

혹 떼러 왔다가 혹 붙이고 가는 이 기분은.....?

String까진 그러려니 했다만 Array는 용납되지 않는다........ㅠㅠㅠㅠㅠㅠ

 

아니 저렇게 다 Instance로 Heap에 할당 될거면 왜 굳이 Struct로 만들어 놨냐구..!!!!!!!!!!!!!!!!!

Instance와 Heap에 할당되는 것이 아니라면 Type Casting은 어떻게 되는 거냐구..!!!!!!!!!!!!!!!!1

 

후..후.. 이번 포스팅은 고찰인 만큼 여기까지 의문을 남겨두고 떠나겠음.......

Swift 고수님들 혹시 아시면 알려주세요 ㅠ_ㅠ ...

 

더 고찰해보고 위 의문에  대한 정답은 아니지만 나만의 답이라도 찾는다면

2탄을 포스팅 해보겠음...

 

 

빠..2...

 

 



Calendar
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
최근 댓글
Visits
Today
Yesterday