5월 2일 (월)

apwierk·2022년 5월 2일
0

TIL

목록 보기
11/33

TIL (Today I Learned)

5월 2일 (월)

학습 내용

  • 구조체와 클래스

공통점

  • 값을 저장하기 위한 프로퍼티 정의
  • 능을 제공하기 위한 메소드 정의
  • 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 해도 되거나 혹은 그래야만 하는 경우가 아니라면 클래스를 써야한다는 결론이다.


일기

뒤쳐지는데 왜 노력안해?


참고 문서

클래스와 구조체
공식문서
블로그
블로그

profile
iOS 꿈나무 개발자

0개의 댓글