# 월요일 학습활동 # 민성 # 싱글톤 >전역으로 하나의 객체를 생성하여, 공용으로 사용하는 디자인 패턴 ## Singleton 디자인 패턴을 활용하는 경우를 예를 들어 설명해주세요 - Singleton은 설계상 유일해야하는 시스템 컴포넌트일 때 활용하는 것이 좋다 - 앱 설정이나 사용자의 기본 설정을 저장하는 UserDefaluts를 사용할 때 UserDefalust.shared 인스턴스를 한번만 생성하여 여러 곳에서 공유해서 사용한다. ## 장점 - 하나의 인스턴스를 사용하기에 메모리 낭비를 방지할 수 있음 - 전역 Instance로 공유가 쉬움 - 두번째 사용시에는 기존에 생성된 것을 사용하기 때문에 로딩시간 감소 ## 단점 - 공유가 여기저기서 많이 될 경우 클래스의 Instance들 간 결합도가 높아짐 - 따라서 수정과 테스트가 어려워짐 - 여기저기서 사용 및 변경하기 떄문에 변경추적이 용이하지 않음 ### 싱글톤을 대체하는 방법? class의 참조타입을 이용해 인스턴스를 전달전달해서 사용하는 방식으로도 사용할 수 있다 > 인스턴스가 참조되어야 할 때마다 매번 전달해줘야 해서 불편하다 ### Singleton을 생성하는 것은 Multi Threading 환경에서 안전하냐?? swift에서는 static을 사용해 타입 프로퍼티로 인스턴스를 생성하기때문에, 사용 시점에 초기화, Dispatch_once도 자동 적용 따라서 Thread-Safe하다 > Dispatch_once: 응용 프로그램의 수명 동안 한 번만 블록 개체를 실행하게 해줌 > 여러 스레드에서 동시에 호출되는 경우 이 함수는 블록이 완료될 때까지 동기식으로 기다림 > Object-C에서 싱글톤을 만들때 사용 ### Singleton은 왜 안티패턴이라 불리는가? SOLID 원칙의 대부분은 인터페이스 설계와 관련이 있다. 의존성을 구현부(콘크리트 클래스)가 아닌 Interface에 두면, 실제 구현부가 변경되어도 이를 사용한 코드는 큰 영향을 받지 않는다. 그렇기 때문에 SOLID원칙(OCP, LSP, ISP, DIP등)을 지키기 위해서는 인터페이스로 설계를 하는 것이 좋다. 하지만 싱글톤을 이용하는 경우 대부분 인터페이스가 아닌 구현부의 객체를 미리 생성해놓고 정적 메소드를 이용하여 사용하게 된다. 이는 여러 SOLID원칙을 위반할 수 있는 가능성을 열어둠과 동시에, 싱글톤을 사용하는 곳과 싱글톤 클래스 사이에 의존성이 생기게 된다. 클래스 사이에 강한 의존성, 즉 결합도가 높아지면, 단위테스트의 어려움 등 다양한 문제가 발생한다. 아무 객체나 자유롭게 접근하고 수정하고 공유할 수 있는 전역 상태를 갖는 것은 객체지향 프로그래밍에서는 지양되어야 할 모델이다. --- # 원툴 - Custom View를 구현하려면 어떻게 해야하는지 설명해주세요 1. Xib를 이용 - Xcode Interface Builder의 약자로 Nib 파일을 XML 형식으로 변환한 파일 - Nib이란 NextStep Interface Builder의 약자로 바이너리 형식의 파일, 유저 인터페이스를 저장하고 처리속도가 빠름 - Xib파일을 빌드하면 Nib으로 컴파일 되고 그 파일을 배포하는 방식 - 즉 스토리 보드로 뷰만 그리는 것 - @IBDesignable을 이용하면 스토리보드에서 볼 수있음 2. 코드로 view를 작성 - Swift 파일에 코드로만 구현하는 방식 - ViewController의 loadView()를 오버라이딩해서 커스텀 뷰로 변경해주면 됌 ||Xib|코드| |:-:|:-:|:-:| |장점| 직접 보면서 레이아웃 작업이 가능, ViewController에 추가 적인 코드로 작업해줄 필요가 없음, 재사용성이 높음, Layout에서 일어나는 Error를 찾기 쉬움|동적으로 레이아웃을 설정해줄 수 있음, 충돌 시 해결하기가 쉬움, 재사용성이 높음| |단점|코드로 작성한 View에 비해서 오버헤드가 크다.|개발시간이 Xib에 비해서 오래걸림, 유지보수가 힘듬| --- # 마이노 ### Core Graphics에 대해 설명해주세요 ![](https://i.imgur.com/qbGk8PW.png) Core Graphics 프레임워크는 Quartz 고급 드로잉 엔진을 기반으로 합니다. 저수준의 가벼운 2D 렌더링을 제공합니다. 이 프레임워크를 사용하여 경로 기반 그리기, 변형, 색상 관리 등을 처리할 수 있습니다. 하위 계층 Core Graphics 개체 및 기능에 대해 알아야 할 한 가지는 항상 접두사 CG가 있으므로 쉽게 인식할 수 있다는 것입니다. --- Quarts(쿼츠)라는 API 안에 들어있는 기술을 활용하여 2D 렌더링, 수행 경로 기반 드로잉, 안티 얼리어싱 렌더링, 그라디언트, 이미지, 색상, PDF 문서 등등의 처리를 해주는 프레임워크 코어 그래픽스 프레임 워크는 쿼츠 드로잉 엔진 기반으로한 2D 작업 (CG가 앞에 붙은것들) -> 2차원 그래픽을 그릴 수 있는 그래픽 프레임워크 Quarts Quartz 2D는 iOS 환경과 커널 외부의 모든 Mac OS X 응용 프로그램 환경에서 액세스할 수 있는 2차원 그리기 엔진입니다. Quartz 2D API(응용 프로그래밍 인터페이스)를 사용하여 경로 기반 그리기, 투명도를 사용한 페인팅, 음영, 그림자 그리기, 투명 레이어, 색상 관리, 앤티앨리어싱 렌더링, PDF 문서 생성 및 PDF와 같은 기능에 액세스할 수 있습니다. 메타데이터 액세스. 가능할 때마다 Quartz 2D는 그래픽 하드웨어의 성능을 활용합니다. iOS에서 Quartz 2D는 Core Animation, OpenGL ES 및 UIKit 클래스와 같은 사용 가능한 모든 그래픽 및 애니메이션 기술과 함께 작동합니다. ### Core Graphics의 context에 대해 설명해주세요. 그래픽 컨텍스트는 그리기 대상을 나타냅니다. 여기에는 드로잉 시스템이 후속 드로잉 명령을 수행하는 데 필요한 드로잉 매개변수와 모든 장치별 정보가 포함됩니다. 그래픽 컨텍스트는 그릴 때 사용할 색상, 클리핑 영역, 선 너비 및 스타일 정보, 글꼴 정보, 합성 옵션 및 기타 여러 가지와 같은 기본 그리기 속성을 정의합니다. Quartz 컨텍스트 생성 기능을 사용하거나 iOS의 Mac OS X 프레임워크 또는 UIKit 프레임워크 중 하나에서 제공하는 상위 수준 기능을 사용하여 그래픽 컨텍스트를 얻을 수 있습니다. Quartz는 사용자 정의 콘텐츠를 만드는 데 사용할 수 있는 비트맵 및 PDF를 포함한 다양한 Quartz 그래픽 컨텍스트에 대한 기능을 제공합니다. 이 장에서는 다양한 그리기 대상에 대한 그래픽 컨텍스트를 만드는 방법을 보여줍니다. 그래픽 컨텍스트는 불투명 데이터 유형인 CGContextRef 데이터 유형으로 코드에 표시됩니다. 그래픽 컨텍스트를 얻은 후 Quartz 2D 기능을 사용하여 컨텍스트를 그리고 컨텍스트에 대한 작업(예: 번역)을 수행하고 선 너비 및 채우기 색상과 같은 그래픽 상태 매개변수를 변경할 수 있습니다.