스파르타 코딩 클럽 - iOS 스타터 6기/모의 면접 스터디

58. 스파르타 코딩 클럽 - 모의 면접 스터디 #1

seongpil Heo 2025. 6. 5. 15:01

  📚  모의 면접 스터디

[ 질문 ]

protocol에 대해서 설명해 주세요.

A. Swift의 protocol(프로토콜)은 특정 속성이나 메서드를 요구사항으로 정의해 두고, 해당 프로토콜을 채택한 타입(클래스, 구조체, 열거형)이 이 요구사항을 구현하도록 강제하는 일종의 설계도입니다.

 

특징 설명

다형성 프로토콜을 타입처럼 사용 가능 (예: 함수 매개변수, 배열 등)
다중 채택 하나의 타입이 여러 프로토콜을 채택 가능
클래스 한정 class로 한정할 수 있음: protocol SomeProtocol: AnyObject
Optional 요구사항 @objc와 함께 사용 시 메서드를 선택적으로 구현 가능 (단, 클래스 전용)

 

프로토콜을 사용하는 이유

  1. 유연한 설계 – 다양한 타입이 같은 기능을 구현하게 할 수 있음.
  2. 코드 재사용성 증가 – 함수나 메서드에서 추상적인 타입인 프로토콜을 활용 가능.
  3. 테스트 용이성 – 테스트 시 가짜(mock) 객체를 만들기 쉬움.

 


Codable에 대해서 설명해 주세요.

A. Codable은 Swift에서 객체를 JSON, Property List(plist) 등으로 쉽게 인코딩(encode)하거나 디코딩(decode)할 수 있게 해주는 프로토콜입니다.

 

사용하는 때

 

  • 서버에서 받은 JSON 데이터를 구조체로 변환할 때 (Decoding)
  • 구조체나 클래스를 JSON 형식으로 저장하거나 전송할 때 (Encoding)

 

 

주의할 점

  1. 구조체(또는 클래스)의 모든 프로퍼티가 Codable을 따르거나 기본 타입(Int, String 등)이어야 자동으로 Codable이 적용됩니다.
  2. 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에 적용됨
  • 어떤 걸 사용하는 게 좋을까?
 

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
    • 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를 호출함