📚Swift 언어 기본 내용 복습
📙 변수와 상수
- 변수와 상수의 차이
- 변수는 선언 이후 값의 변경이 가능하지만 상수는 불가능
- 변수 = var, 상수 = let
- 변수 = 참조하는 주소값의 변경 가능, 상수 = 참조하는 주소값 변경 불가능
- 참조하는 주소값의 변경은?
class example {
var num : Int
init(_ num : Int) {
self.num = num
}
}
해당 클래스의 인스턴스가 있는 경우 상수는 값을 변경할 수 없다.
class는 참조타입이기 때문에 각 변수와 상수에는 주소값이 들어있기 때문이다.
단 인스턴스 내부의 값은 주소값이 변경이 없기 때문에 변경이 가능하다.
- 타입 추론
- 변수와 상수는 타입을 명시할 수 있고 생략도 할 수 있다.
- 생략하는 경우 컴파일러가 타입 추론을 통한 타입 지정
- 추론 과정 때문에 컴파일에 더 오랜 시간이 소비될 수 있다.
📙Class/Struct
- 차이점
- struct = Value Type, class = Reference Type
- 전달시에 차이 발생
(ValueType = 새로운 인스턴스 생성, ReferenceType = 주소 전달)
- 따라서 class는 ARC(Automatic Reference Counting)를 통해 메모리 관리
- 상속의 유무(class는 가능하지만 struct는 불가능)
- 공통점
- 프로퍼티와 메서드 정의가 가능하다
- 이니셜라이저 통해 초기 상태 지정 가능
- extension 통한 확장
- 프로토콜 준수 가능
- 사용 시점(Apple 권장사항)(struct에 대하여)
- 연관된 값의 캡슐화 목적
- 프로퍼티에 대하여 참조보다는 복사하는 것이 더 적합할 때
- 상속의 필요가 없을 때
- swift의 복사방식
- COW 방식 사용
- 원본과 복사본 중 하나가 수정되기 전까지 리소스 공유하다 수종되면 복사 작업 진행
- 첫 번째 수정시(복사 작업 진행) -> 약간의 오버헤드 발생
- collection type 복사시에만 사용(Array, Set, Dictionary)
- COW는 시간, 공간 효율중 공간의 효율 선택 -> 메모리 낭비 방지
- class 성능 향상 방법 = final
- Static Dispatch 사용으로 오버헤드 감소
- class는 메소드 오버라이딩이 가능하여 Dynamic Dispatch 사용
- final 사용시 상속이 불가능 하여 static 사용
- Dynamic 사용시 런타임에 실행 메소드 결정, Static은 컴파일 타임에 결정
- 위의 시점 차이로 인해 오버헤드 감소 효과 생성
- Dispatch란?
- 어떤 메서드 호출할지 결정하여 실행하는 메커니즘
- ValueType은 staticDispatch 사용하며 참조타입은 오버라이딩 유무에 따라 결정
WMO(Whole Modeule Optimization)
모듈 전체를 하나의 덩어리로 컴파일 -> internal level에 대해 오버라이딩 되지 않는 경우 내부적으로 final 부착 -> 상속되지 않는 클래스에 대해 Dynamic Dispatch의 사용을 줄임
!swift는 파일을 하나씩 컴파일하여 서로 다른 파일에서 상속되었는지 알수 없기 때문에 기본적으로 final을 부착하지 않음!
- 타입 캐스팅
- 실제 타입을 바꾸는 것이 아닌 사용 범위의 전환
- 업캐스팅의 경우를 생각하면 하위 클래스의 프로퍼티와 메서드를 사용하는 것이 불가능 해질 뿐 실제 type이 변하지 않음
- 업캐스팅은 무조건 전환 가능 -> as 사용
- 다운캐스팅은 실패 가능성 존재 -> as? , as! 사용 -> as!의 경우 런타임 에러 가능
📙접근 제어자
-
종류 : open, public, internal, fileprivate, private 존재
-
open과 public의 차이는?
- 공통점
- 차이점
- open은 모듈 외부에서 상속, 오버라이딩 가능 -> class 또는 class 멤버만 사용 가능
- public은 모듈 외부에서 상속 불가능
-
fileprivate과 private의 차이
fileprivate은 구현 소스파일 내부에서만 사용 가능, private는 기능을 정의, 구현한 범윈 내에서만 사용 가능
이부분이 아직 잘 이해가 가지 않는다