공통점
- 값을 저장하기 위한 프로퍼티 정의
- 능을 제공하기 위한 메소드 정의
- subscript문법을 이용해 특정 값을 접근할 수 있는 정의
- 초기 상태를 설정할 수 있는 initializer정의
- 기본 구현에서 기능 확장
- 특정한 종류의 표준 기능을 제공하기 위한 프로토콜 순응
클래스만 가능한 기능
- 상속(Ingeritance): 클래스의 속성을 다른 클래스에 물려 줌
- 타입 캐스팅(Type casting): 클래스 인스턴스의 타입을 확인
- 소멸자(Deinitializers): 할당된 resouces를 해제
- 참조 카운트(Reference counting): 클래스 인스턴스에 하나 이상의 참조가 가능
참조(reference)타입과 값(value)타입
- mutable, immutable에 대해서 알아보는 중 값 타입과 참조 타입의 차이에 대해서 알아보았다.
구조체의 인스턴스 선언시 저장 프로퍼티의 값을 변경할 경우 함수 앞에 mutating을 붙여주어야한다.
그 이유는 구조체의 기본 특성이 immutable하기 때문인데 그럼 class는 mutalbe한 것인가 라는 의문과, 왜 구조체에만 붙야주는지 의문이 들었다. 공식 문서에는 마치 가불기처럼 값 타입이기 때문에 써준다고 되어있다고 한다. 그 이유에 대해서 생각해보았을 때 참조 타입과 값 타입의 차이를 생각해보게 되었다.struct Person1 { var name: String = "lee" mutating func changeName(_ newName: String) { self.name = newName } } class Person2 { var name: String = "lee" func changeName(_ newName: String) { self.name = newName } } var structBonf = Person1() structBonf.changeName("bonf") let classBonf = Person2() classBonf.changeName("bonf")
코드와 같이 struct로 인스턴스 생성 시 변수로 만들어야 된다. 반면 class로 인스턴스 생성 시에는 상수로 만들어도 된다. 참조 타입인 class의 경우 클래스 내부의 프로퍼티가 바뀌어도 classBonf 인스턴스에 들어있는 주소는 변하지 않기 때문에 상수로 선언하기가 가능하다. 좀 더 이해를 하기 위해서는 stack과 heap 영역의 메모리 구조에 대해서 공부해야겠다.
싱글턴 패턴
- 특정한 용도로 객체의 인스턴스를 최초 1회만 생성(static)하여 사용하는 디자인 패턴
생성 방법
class SingletonClass { static let shared = SingletonClass() private init() {} }
싱글턴 디자인 패턴은 언제 활용하면 좋을까?
- 여러 viewController에서 한 객체의 프로퍼티 값을 넣어줄 때 활용하면 좋다.
싱글턴 디자인 패턴의 장단점
- 인스턴스를 최초 1회만 생성하므로 메모리와 성능 측면에서 효율이 좋다.
- 클래스 간 데이터 공유가 쉽다.
- 클래스 간 데이터 공유가 쉬운 만큼 메모리 보안 측면에서 취약하다.
싱글턴 디자인 패턴을 구현할 때는 어떤 방식 (열거형, 구조체, 클래스 등)을 활용하여 타입을 구현하는 것이 좋을까? 그 이유는?
let csi = MyClassSingleton.sharedInstance csi.state = 42 MyClassSingleton.sharedInstance.helloClass() // 42 var ssi = MyStructSingleton.sharedInstance ssi.state = 42 MyStructSingleton.sharedInstance.helloStruct() // 5
코드와 같이 참조 타입인 class를 이용하는 것이 이용에 편리하다.
클래스는 참조 즉 메모리를 가르키지만 구조체는 그저 복사할 뿐이다.
이런 경우는 구조체로 구현된 싱글톤 객체는 사실상 싱글톤 객체라 볼 수 없다.
따라서 정말 드문 경우지만 싱글톤 객체가 그저 함수만 모아놓은 경우처럼 immuatable 해도 되거나 혹은 그래야만 하는 경우가 아니라면 클래스를 써야한다는 결론이다.
뒤쳐지는데 왜 노력안해?