58. 스파르타 코딩 클럽 - 모의 면접 스터디 #1
📚 모의 면접 스터디
[ 질문 ]
protocol에 대해서 설명해 주세요.
A. Swift의 protocol(프로토콜)은 특정 속성이나 메서드를 요구사항으로 정의해 두고, 해당 프로토콜을 채택한 타입(클래스, 구조체, 열거형)이 이 요구사항을 구현하도록 강제하는 일종의 설계도입니다.
특징 설명
다형성 | 프로토콜을 타입처럼 사용 가능 (예: 함수 매개변수, 배열 등) |
다중 채택 | 하나의 타입이 여러 프로토콜을 채택 가능 |
클래스 한정 | class로 한정할 수 있음: protocol SomeProtocol: AnyObject |
Optional 요구사항 | @objc와 함께 사용 시 메서드를 선택적으로 구현 가능 (단, 클래스 전용) |
프로토콜을 사용하는 이유
- 유연한 설계 – 다양한 타입이 같은 기능을 구현하게 할 수 있음.
- 코드 재사용성 증가 – 함수나 메서드에서 추상적인 타입인 프로토콜을 활용 가능.
- 테스트 용이성 – 테스트 시 가짜(mock) 객체를 만들기 쉬움.
Codable에 대해서 설명해 주세요.
A. Codable은 Swift에서 객체를 JSON, Property List(plist) 등으로 쉽게 인코딩(encode)하거나 디코딩(decode)할 수 있게 해주는 프로토콜입니다.
사용하는 때
- 서버에서 받은 JSON 데이터를 구조체로 변환할 때 (Decoding)
- 구조체나 클래스를 JSON 형식으로 저장하거나 전송할 때 (Encoding)
주의할 점
- 구조체(또는 클래스)의 모든 프로퍼티가 Codable을 따르거나 기본 타입(Int, String 등)이어야 자동으로 Codable이 적용됩니다.
- Date, URL 등 특수 타입은 JSONEncoder/Decoder의 옵션을 설정해 줘야 제대로 처리됩니다.
ARC에 대해서 설명해 주세요.
A. ARC (Automatic Reference Counting)는 Swift가 사용하는 메모리 관리 기법으로, 객체가 더 이상 필요하지 않으면 자동으로 메모리에서 해제되도록 도와주는 시스템입니다.
즉, 개발자가 malloc, free 같은 수동 메모리 관리를 하지 않아도 되게 해 줍니다.
언제 ARC를 신경 써야 하나요?
- 대부분의 경우 ARC는 자동으로 잘 작동합니다.
- 하지만 클래스 간 상호참조가 있을 때는 반드시 weak나 unowned를 고려해야 합니다.
- 클로저 내 self 캡처도 ARC 순환의 원인이 될 수 있으므로 [weak self], [unowned self] 캡처 리스트를 자주 사용합니다.
👨🏫 기술 면접 특강 - [ UIKit, Autolayout ]
[ Frame vs Bounds ]
Frame
- CGRect 타입으로 좌표값 (x, y)과 크기값 (Width, height)으로 이루어져 있음.
- 상위 View의 좌표계를 기준으로 현재 크기와 좌표를 표시
Bounds
- CGRect 타입으로 좌표값 (x, y)과 크기값 (Width, height)으로 이루어져 있음.
[ UIImageView Contents Mode ]
scaleToFill
- imageView 크기에 맞춰 비율 상관없이 늘리거나 줄임
- 이미지가 왜곡되어서 보임
scaleAspectFit
- 비율에 맞춰서 imageView에 맞춤
- imageView에 꽉 차게 보이지 않으며, 이미지뷰의 일부분이 투명으로 채워짐
scaleAspectFill
- 비율에 맞춰서 이미지뷰에 맞춤
- 이미지뷰에 꽉차게 보이며 넘어가는 부분은 잘림
[ clipToBounds , maskToBounds ]
자식 뷰가 부모 뷰의 영역을 넘어갈 때 자르는 것을 선택할 때 사용하는 프로퍼티
공통점
- 기본값 false
- true로 변경하면 부모 뷰나 레이어의 경계를 벗어난 내용을 잘라냄
차이점
- clipToBounds는 UIView의 프로퍼티이고 마스크투 바운드는 UIView에 CALayer에 있는 프로퍼티라는 차이점이 있음
- clipToBounds는 UIView의 SubView에 적용되고 maskToBounds는 CALayer의 SubLayer에 적용됨
- 어떤 걸 사용하는 게 좋을까?
- UIView에서 제공하는 clipToBounds를 사용하는게 좋다
- https://developer.apple.com/forums/thread/736395
masksToBounds vs clipsToBounds | Apple Developer Forums
Yes, in general UIKit covers a lot of CALayer properties like this, although not always in a "light weight" manner (but that usually means there are very good reason to use the UIKit API over the CALayer API if you have a UIView). As such we generally reco
developer.apple.com
[ UITableView, UICollectionView ]
- 반복되는 UI를 쉽게 보여주기 위한 UI컴포넌트
- 셀을 재사용하여 메모리 효율이 좋은 장접이 있음
- Delegate 패턴을 사용하여 DataSource, Delegate를 채택한 곳에서 어떤 데이터를 몇 개 보여줄 건지 정함
- DataSource의 필수 메서드는 2개로 아이템을 몇 개 보여줄 건지, 어떤 셀을 보여줄 건지를 채택한 곳에서 구현해야 함
[ UINavigationController ]
- stack 자료구조를 베이스로 UIViewController를 관리하는 class
- stack base이기 때문에 push, pop을 이용하여 ViewController를 관리
- navigationBar를 제공해 줌
- viewControllers 프로퍼티를 제공(지금까지 stack에 넣은 ViewController를 볼 수 있음)
[ 화면 전환 (present modal VS navigation push) ]
- present modal은 아래서 위로 올라오면서 화면 전환이 됨
- UIViewController에서 호출
- presentedViewController, presentingViewController
- presentedViewController : 자신을 present modal 해준 ViewController
- 나를 띄워주고 있는 ViewController
- presentingViewController : 내가 present modal로 띄워준 ViewController
- 내가 띄워준 ViewController
- presentedViewController : 자신을 present modal 해준 ViewController
- present, dismiss를 사용
[ UIResponder ]
- UIKit에서 발생하는 이벤트(터치, 모션, 프레스 등)를 처리할 수 있는 객체
- iOS에서 유저 입력을 처리하는 기본적인 추상 클래스
- 이벤트를 처리하려면 직접 사용하지 않고, 상속받은 클래스들이 실제 이벤트를 처리함
- 오버라이드 해서 처리해야 함, 처리하지 않으면 Responder Chain에 의해 다음 리스폰더 객체로 넘김
- 대부분의 UIKit 컴포넌트는 UIResponder를 상속받고 있음
[ Autolayout ]
제약 조건(contraints) 기반의 관계형 레이아웃 시스템
- 뷰들 간의 관계를 정의하여 레이아웃을 결정
- 절대적 위치가 아닌 상대적 관계로 UI 구성
- 선언적 방식으로 "어떻게 배치할지"가 아닌 "어떤 관계인지" 기술
- 어떤 관계인지 동적으로 계산하기 때문에 동적인 디자인을 개발할 수 있음
- Autolayout이 해결한 문제들
- 다양한 화면 크기 대응 가능
- 동적 콘텐츠 크기 대응 가능
- 화면 회전 및 safe area 대응 가능
[ safe area ]
- Contents가 보일 안전한 영역
- 상태바, 내비게이션바, 탭바 등을 제외한 진짜 Contents가 보여지는 영역
[ Contraint (제약조건) ]
- 제약조건들이 모여서 Autolayout 디자인을 그려줌
- 만약 제약조건이 겹치거나 오류가 발생한다면 디자인이 이상하거나 Xcode에서 Warning 발생
[ priority (우선순위) ]
제약조건들 사이의 중요도를 숫자로 표현한 것
- 모든 제약조건은 1~1000 사이의 우선순위를 가짐 (1000이 높은 우선순위)
- 제약조건이 겹치거나 충돌 나면 우선순위를 통해서 우선 적용됨
[ Main Thread에서만 UI 업데이트할 수 있는 이유 ]
- iOS에는 Main Run Loop라는 이벤트 처리 루프가 존재함
- 큐에 일이 있으면 일을 하고 없으면 쉬는 루프
- Main Run Loop가 한 바퀴 돌기전에 Update Cycle에서 UI 업데이트할 게 있다면 UI를 업데이트해줌
- 제약 조건 설정 (Constraints)
- 배치 (Layout)
- 보여주기 (Display) 등의 프로세스를 진행함
[ layoutIfNeeded vs setNeedLayout ]
layoutSubViews
- Update Cycle에 필요할 때 호출됨
- 현재의 View와 SubView들의 위치와 크기를 재계산하여 배치함
- 비용이 많이 드는 메서드이며 직접 호출하는 것을 금지함
- 실행이 완료되면 viewDidLayoutSubviews를 호출함
- 직접 사용하면 안 되기 때문에 setNeedLayout, layoutIfNeeded를 호출하여 업데이트 요청
setNeedLayout
- layoutSubView를 호출하는 가장 코스트가 적은 방법
- 메서드를 호출하면 재계산되어야 하는 View라는 상태값을 변경
- 비동기적으로 동작해서 Update Cycle까지 바로 UI가 업데이트되지 않음
layoutIfNeeded
- 즉각적으로 UI를 업데이트하는 방법
- 메서드를 호출하면 동기적으로 동작해서 강제적으로 layoutSubViews를 호출함