Class / Struct
변수/상수가 클래스/구조체/열거형 등에 들어가면 프로퍼티라고 바뀌고, 함수는 메소드로 바뀜
그래서 프로퍼티랑 메소드는 멤버라고 부른다.
각각을 프로퍼티 멤버, 메소드 멤버라고 부른대!! 꺄!
흔히 알듯이, 클래스에 있는 프로퍼티와 메소드의 속성을 가진 걸 사용하기 위해 만들어주는 객체를 인스턴스라고 하고
이 인스턴스를 통해서 내부 프로퍼티와 메소드에 접근할 수 있다.
예를 들어, 붕어빵틀이라는 클래스가 있으면
슈붕이라는 인스턴스를 만들어서 내부 속재료 프로퍼티에 접근해서
슈붕.속재료 = "슈크림"
팥붕.속재료 = "팥"
이런식인 것처럼 말이지..
여튼 슈붕과 팥붕은 붕어빵틀 클래스의 인스턴스다.
구조체와 클래스의 가장 큰 차이는 상속과 초기화 구문 제공..? 아닐까 싶다.
클래스는 상속이 되고, 초기화 구문을 필수로 작성해줘야 한다.
아래의 오류가 생기는 이유?
매개변수가 아니더라도 가까운 곳의 name을 찾아서 인식해버리는 것임
isInitialViewController도 초기화와 관련되어 있는 것임!!
클래스는 초기화되어 있지 않은 아이들에게 다 초기화를 해줘야 한다.
프로퍼티랑 메소드를 다 합해서 멤버라고 부르는데,
구조체의 경우 초기화 구문을 자동으로 제공해줘서 멤버와이즈 라고 부른다.
그러면 왜? 그렇게 하냐? -> 애플이 그렇게 해줬기 때문임
또 다른 점은 값 타입 / 참조 타입이라는 점이다.
구조체 - 값 타입
클래스 - 참조 타입
이로 인해서 Reference Counting 이라는 메모리 누수와 관련된 문제도 발생하는데
이건 차차 알아보기로 하고,
우리의 메모리는 4단위로 나뉘어져 있다.
코드 / 데이터 / 힙 / 스택
대강 설명해보자면,
[코드] 우리가 작성한 코드가 코드 영역에 올라감.
근데 우리 코드가 엄청 길어질 수 있잖아? 그러면 그 십만줄의 코드 중에서 사용자가 화면을 하나하나씩 띄우기 때문에 띄우지 않은 화면이나 사용하지 않는 코드들은 문자 자체로 남아있는데 그게 코드 영역에 올라간다고 보면 된다.
[데이터] - 전역변수, 프로그램 전체적으로 사용되는 것
모든 공간에서 다 쓰이는 변수, 함수
클래스 바깥에 있는 아이들이 데이터 영역에 올라감
전역변수로 놔두면 편한 거 아닌가? -> 앱이 중지되기 전까지는 항상 메모리 공간을 차지하고 있다는 문제 발생
클래스는 힙 영역
그런데 메모리 주소와 실질적인 데이터는 별개로 저장이 된다.
대신에 클래스 인스턴스를 복사하면 원본이 복사되어서 그 인스턴스 값을 바꾸면 원본도 바뀜!
그리고 실질적인 데이터가 별개로 저장되기 때문에 let이 가능한 거임
구조체는 스택 영역
메모리 주소랑 실질적인 데이터가 같이 저장이 된다.
그래서 let으로 바꿨을 경우에 같이 저장되어서 오류가 발생한다.
그리고 인스턴스를 복사했을 경우에 서로 다른 값이 되어서 존재하기에 영향을 주지 않는다.
https://sujinnaljin.medium.com/swift-class와-struct에서-didset의-차이-f784e34ea33f
힙과 스택은 같은 놈임.
서로 반대의 위치에서 자리를 차지하다가 만나면 stackoverflow라고 하는 것임
근데 여하튼 이 힙과 스택에 클래스와 구조체가 떡하니 자리를 잡았다고 보면 된다..
클래스는 힙에, 구조체는 스택에,,
[스택 영역] - 거꾸로 자리를 차지
구조체는 스택에 저장됨
구조체는 스택 내에서 easy가 복사되어도 hard라는 새로운 값의 형태로 존재하기 때문에
기존 easy가 변경되어도 hard에는 전혀 영향을 주지 않는다. (복사본 개념)
[힙 영역] - 위에서부터 자리를 차지하고,,
클래스는 기본적으로 힙에 저장됨
메모리의 주소도 힙에 저장되고, 실질적인 데이터도 힙에 저장
hard에 있는 주소를 기반으로 데이터를 찾아가고 데이터를 바꾼 게 easy한테까지 영향이 감 (원본개념)
easy가 가리키고 있는 건 메모리를 담고 있고, let으로 선언했기에 자물쇠로 잠군 것이라고 보면 됨
그러나 우리가 바꾸고 싶은 건 값임. 그래서 따로 저장된 데이터는 바뀔 수 있는 상태
클래스는 실질적인 값은 다른 박스에 있어서 let으로 선언해도 값이 바뀌는 게 가능한데,
구조체는 실질적인 값과 주소가 같은 공간에 있고, 그래서 let으로 선언 시에 값의 변경이 불가능
클래스와 구조체가 값을 저장하고 있는 내부적인 구조가 달라서 생기는 문제
읽어볼 자료...
https://corykim0829.github.io/swift/Understanding-Swift-Performance/#
entry point는 스보마다 초기화해주는 개념이기 때문에 각 스보 생성 시에 꼭 해줘야 함
여러개의 스보 중 Main Interface를 바꿔주려면 Targets -> General -> Main Interface에서 선택 후에,
info.plist에서도 Storyboard name을 바꿔주면 된다.
(근데 사실 info.plist에서만 바꿔주면 된다고 함)
다중 창이 지원되기 전에는 Main Interface만 선택하면 됐다고 한다.
Dependency Manager
1. cocoapods
2. carthage - 속도는 빠르지만 지원해주는 라이브러리가 적음
3. swiftpm - 애플에서 관리, Xcode10부터 spm이 들어오게 되면서,,, native가 짱이래~
4. manually
Derived Data가 엑코 플젝을 실행할 때마다 빌드해서 쌓이는 파일
시뮬레이터 돌 때마다 생기는 파일들
프로젝트 파일 자체에는 영향이 조금 있긴 함
연결놓은 링킹된 파일들도 다 끊겨져서 추가했던 SPM들이 삭제되는데 그럴 때는 update to latest package 를 선택해주면 된다.
버전규칙
3.5.2
3 -> major 버전 : 가장 크게 달라지는 지점들에 대한 업데이트 (기존 버전이랑 호환이 안됨)
5 -> minor 버너 : base는 같은데 세세한 기능들이 일부 추가된 것
2 -> patch : 유지보수, 버그 해결 (새로운 기능 추가/삭제는 아님)
예를 들어, swift 2.3 -> 3.0으로 변경되면 이전 2.3에서 사용했던 것과는 호환이 안된다.
deprecated되는 것이 많다.
spm 설치 오류도 기존 스위프트 버전이랑 맞지 않아서 생기는 오류
up to major version : major 버전에 맞추겠다.
up to minor version : 세세한 기능들에 대한 것을 맞추겠다.
range of versions : 5~8 사이의 버전을 선택해서 쓰겠다. 라이브러리는 하나지만 버전의 범위를 설정
exact version : 정확한 특정 버전을 선택해서 설치할 수 있다.
여기 보면 FSCalendar를 메이저 버전 2.0으로 맞추겠다고 했는데 왼쪽에서 실제로 2.8.4로 맞춰지게 된 것이다.
IQKeyboardManager 댕좋다.. 도랏맨..~~
safe area 영역만큼 튄다.
'⭐️ 개발 > iOS & Swift' 카테고리의 다른 글
[Swift] Singleton Pattern (0) | 2022.08.02 |
---|---|
[Swift] ReusableViewProtocol로 뷰컨/셀 식별자 사용하기 (0) | 2022.08.02 |
[Swift] 스위프트 성능 이해하기1 - Struct / Class (0) | 2022.07.29 |
[iOS] DataSource, Delegate | TextView Placeholder | WebKit (0) | 2022.07.29 |
[iOS] PickerView (0) | 2022.07.28 |