UIKit — 정의, 핵심 개념 및 아키텍처

저자: IT Sectr 게시일: 2026-04-30 읽는 시간: 10 분

UIKit은 iOS 및 macOS 애플리케이션에서 그래픽 인터페이스를 구축하기 위한 프레임워크입니다. 이 세트에는 UIView, UIViewController, 제어 요소 및 Auto Layout 시스템이 포함되어 있어 적응형 및 대화형 화면을 만들 수 있습니다. Apple Developer Documentation (2025)에 따르면 UIKit은 창, 뷰, 애니메이션, 제스처 및 텍스트 작업을 위한 200개 이상의 클래스를 포함하며 모든 iPhone 및 iPad 애플리케이션의 기초입니다.

핵심 요점

  • UIKit은 iOS, iPadOS 및 macOS에서 인터페이스를 구축하기 위한 Apple의 프레임워크로, 뷰 관리에 명령형 접근 방식을 사용합니다.
  • UIView는 버튼, 텍스트 필드, 이미지 및 컨테이너 등 모든 시각적 요소의 기본 클래스입니다.
  • UIViewController는 뷰 로딩부터 메모리 해제까지 화면 수명 주기를 관리합니다.
  • Auto Layout은 제약 조건 시스템을 통해 요소의 위치를 설명하고 다양한 화면 크기에 인터페이스를 적응시킵니다.
  • 델리게이트와 dataSource는 테이블 및 컬렉션의 핵심 패턴으로, 데이터와 표시를 분리합니다.

UIKit이란?

UIKit은 iOS, iPadOS 및 macOS(Mac Catalyst를 통해)에서 사용자 인터페이스를 만들고 관리하기 위한 클래스를 제공하는 Apple의 프레임워크입니다. Core Animation, Core Graphics 및 Quartz Core 위에서 작동하며 저수준 렌더링을 버튼, 레이블, 이미지 및 컨테이너와 같은 고수준 객체로 추상화합니다. UIKit은 2007년 iPhone OS 1과 함께 등장했으며 SwiftUI와 함께 iOS 개발의 주요 프레임워크로 남아 있습니다.

이 프레임워크는 명령형 접근 방식을 따릅니다. 개발자는 UIButton, UILabel, UIImageView 클래스의 인스턴스를 만들고 속성(색상, 글꼴, 위치)을 설정한 다음 addSubview를 통해 뷰 계층에 추가합니다. 인터페이스의 모든 변경은 명시적으로 수행됩니다. 배후에서 자동 업데이트가 일어나지 않습니다. 이는 상태 설명이 자동으로 인터페이스를 다시 그리는 SwiftUI와 같은 선언형 프레임워크와 UIKit을 구분합니다.

UIKit의 주요 클래스

프레임워크에는 여러 클래스 범주가 포함됩니다. UIView는 모든 시각적 구성 요소가 상속하는 기본 요소입니다. UIWindow는 뷰가 화면에 표시되는 최상위 컨테이너입니다. UIViewController는 뷰 세트를 관리하고 화면 회전, 키보드 나타남 및 시스템 알림에 응답합니다. UIApplication은 터치 이벤트와 버튼 누름을 처리하는 진입점입니다.

텍스트에는 UILabel(정적 텍스트), UITextField(한 줄 입력), UITextView(여러 줄 입력)가 사용됩니다. 버튼에는 UIButton(시스템, 사용자 정의 및 SF Symbols 아이콘 포함)이 사용됩니다. 탐색에는 UINavigationController, UITabBarController 및 UISplitViewController가 사용됩니다. UIKit에는 총 200개 이상의 공개 클래스가 있습니다.

UIKit 아키텍처: 레이어 및 뷰 계층

UIKit 아키텍처는 레이어 위에 구축됩니다. 각 레이어는 표시의 특정 측면을 담당합니다. 최하위 수준에는 Core Graphics(경로, 텍스트 및 이미지용 렌더링 엔진)가 있습니다. 그 위에는 레이어 구성(CALayer)과 상태 간 애니메이션을 관리하는 Core Animation이 있습니다. UIKit은 그 위에 객체 지향 API(UIView, UIViewController 및 UIResponder)를 구축합니다.

모든 애플리케이션에는 UIWindow를 루트로 하는 트리인 뷰 계층이 있습니다. 그 아래에 루트 UIViewController, 해당 뷰 및 내부에 중첩된 하위 뷰가 있습니다. 터치 이벤트는 응답자 체인을 따라 전파됩니다. 가장 깊이 중첩된 뷰에서 부모를 거쳐 UIApplication까지 전달됩니다. 어떤 객체도 터치를 처리하지 않으면 무시됩니다.

UIView 및 CALayer

UIView에는 화면의 픽셀 렌더링을 처리하는 CALayer가 포함됩니다. 뷰는 터치 및 접근성을 관리하고 레이어는 그래픽(그림자, cornerRadius, 테두리, 변환)을 처리합니다. 이 분리를 통해 무거운 그래픽을 메인 스레드를 차단하지 않고 별도의 스레드(렌더 서버)로 오프로드할 수 있습니다. Apple은 화면에 200개 이상의 뷰가 있는 경우 CALayer로 직접 작업할 것을 권장합니다. 이렇게 하면 CPU 부하가 줄어듭니다.

응답자 체인 상세

응답자 체인은 터치 이벤트를 먼저 수신하는 객체에서 시작됩니다. 해당 객체가 이벤트를 처리하지 않으면(touchesBegan 메서드가 재정의되지 않은 경우) 이벤트는 체인의 다음 응답자(next, superview, next responder, UIViewController, UIWindow, UIApplication, App Delegate)로 전달됩니다. 이를 통해 모든 뷰에 핸들러를 추가하지 않고도 장면 수준에서 전역 제스처 및 키보드 이벤트를 가로챌 수 있습니다.

UIViewController의 수명 주기

UIViewController는 엄격하게 정의된 일련의 이벤트를 거칩니다. 수명 주기에는 초기화, 뷰 로딩, 화면에 나타남, 회전 시 레이아웃 업데이트, 숨김, 화면 이탈 및 메모리 해제 단계가 포함됩니다. 개발자는 각 단계에서 사용자 정의 코드를 실행하기 위해 해당 메서드를 재정의합니다.

swift
class ProfileViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        loadUserProfile()
    }

    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        clearCache()
    }
}

viewDidLoad에서는 인터페이스가 구성됩니다. 하위 뷰가 생성되고 제약 조건이 설정되며 델리게이트가 구독됩니다. viewWillAppear에서는 표시 전 작업(네트워크에서 최신 데이터 로드, 값 업데이트)이 수행됩니다. viewDidDisappear는 알림 구독 취소 및 임시 데이터 정리를 위한 장소입니다. 모든 재정의에서 super 호출은 필수입니다. 그렇지 않으면 이벤트 체인이 손상됩니다.

메모리 관리 및 viewDidUnload

이전 iOS 버전에는 메모리가 부족할 때 호출되는 viewDidUnload 메서드가 있었습니다. iOS 6부터 이 메서드가 제거되었습니다. 이제 UIKit은 보이지 않는 컨트롤러의 뷰를 자동으로 언로드합니다. 개발자는 시스템 경고를 받을 때 ARC가 메모리를 적절히 해제할 수 있도록 뷰 참조를 weak로 선언하기만 하면 됩니다.

컨트롤러 간 전환

UIKit은 두 가지 유형의 전환을 지원합니다. segue(Storyboard를 통해) 및 UINavigationController를 통한 프로그래밍 방식 탐색입니다. 프로그래밍 방식 전환은 다음과 같습니다. navigationController?.pushViewController(detailVC, animated: true). 이 경우 detailVC의 수명 주기는 정상적으로 진행됩니다. viewDidLoad는 한 번 호출되고 viewWillAppear는 나타날 때마다 호출됩니다.

Auto Layout 및 적응형 레이아웃

Auto Layout은 수학적 관계(제약 조건)를 기반으로 하는 위치 지정 시스템입니다. 하드 코딩된 X 및 Y 좌표 대신 개발자는 규칙을 설명합니다. “버튼은 레이블 오른쪽에 16pt 간격으로 위치” 또는 “뷰는 왼쪽과 오른쪽에 20pt 여백으로 화면 너비에 걸쳐 늘어납니다.” 시스템은 런타임에 결과 연립 방정식을 풀어 모든 화면 크기에 인터페이스를 적응시킵니다.

제약 조건은 Interface Builder(드래그 앤 드롭을 통해) 또는 프로그래밍 방식으로 Swift에서 설정할 수 있습니다. 각 제약 조건은 firstItem, firstAttribute, relation, secondItem, secondAttribute, multiplier, constant 매개변수가 있는 NSLayoutConstraint 클래스의 인스턴스입니다. 제약 조건은 isActive = true를 통해 또는 일괄적으로 NSLayoutConstraint.activate()를 통해 활성화됩니다.

Safe Area 및 Layout Margins

iPhone X(2017)의 도입과 함께 Apple은 Safe Area를 도입했습니다. 노치, 둥근 모서리 및 홈 바 표시기가 없는 화면 영역입니다. 제약 조건은 view가 아닌 view.safeAreaLayoutGuide에 연결해야 합니다. Layout Margins은 뷰에 내부 패딩을 추가하며 기본적으로 컨텍스트에 따라 8pt 또는 16pt입니다. safeAreaLayoutGuide를 사용하면 모든 iPhone 및 iPad 세대에서 올바르게 표시됩니다.

제약 조건 애니메이션

Auto Layout은 제약 조건 상수를 변경하여 애니메이션을 지원합니다. 제약 조건의 constant를 업데이트하고 애니메이션 블록 내에서 layoutIfNeeded와 함께 UIView.animate를 호출하면 됩니다. 시스템은 계층 구조의 모든 뷰 위치를 부드럽게 다시 계산합니다. 이 기술은 확장 가능한 블록, 적응형 키보드 패널 및 화면 방향 변경에 사용됩니다.

테이블 및 컬렉션 작업

UITableViewUICollectionView는 목록과 그리드를 표시하기 위한 두 가지 강력한 UIKit 도구입니다. UITableView는 단일 열 세로 목록(채팅, 설정, 뉴스 피드)에 적합합니다. UICollectionView는 그리드, 가로 목록, 캐러셀 및 사용자 정의 레이아웃(갤러리, 제품, 달력)에 적합합니다. 두 클래스 모두 위임 패턴을 사용하여 데이터와 모양을 분리합니다.

데이터 소스는 필수 메서드 numberOfRowsInSectioncellForRowAt이 있는 UITableViewDataSource 프로토콜입니다. UITableViewDelegate는 셀 탭, 행 높이 및 스크롤 이벤트를 처리합니다. 재사용 식별자 메커니즘은 화면 밖으로 스크롤된 셀을 재사용하며, 이는 큰 목록의 성능에 매우 중요합니다.

swift
class ContactsViewController: UITableViewController {

    private let contacts = ["안나", "보리스", "빅토르"]

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(UITableViewCell.self,
                           forCellReuseIdentifier: "cell")
    }

    override func tableView(_ tableView: UITableView,
                          numberOfRowsInSection section: Int) -> Int {
        return contacts.count
    }

    override func tableView(_ tableView: UITableView,
                          cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell",
                                                 for: indexPath)
        var content = cell.defaultContentConfiguration()
        content.text = contacts[indexPath.row]
        cell.contentConfiguration = content
        return cell
    }
}

예제는 문자열 배열을 표시하기 위한 최소한의 컨트롤러를 보여줍니다. 셀은 UIListContentConfiguration(더 이상 사용되지 않는 textLabeldetailTextLabel을 대체한 최신 API, iOS 14+)을 통해 구성됩니다. viewDidLoad에서 셀 클래스를 등록하는 것은 필수입니다. 그렇지 않으면 애플리케이션이 런타임 예외와 함께 충돌합니다.

UICollectionView 및 Compositional Layout

iOS 13부터 Apple은 복잡한 레이아웃 구축을 위해 UICollectionViewCompositionalLayout을 권장합니다. 개발자는 섹션, 그룹, 항목 및 크기를 선언적으로 설명합니다. 결과적으로 스트립, 2x2 그리드, 캐러셀 또는 장식과 같은 임의의 지오메트리를 가진 그리드가 생성됩니다. Compositional Layout은 모든 새 프로젝트에서 오래된 UICollectionViewFlowLayout을 대체했습니다. DiffableDataSource와 결합하면 컬렉션 업데이트가 단일 apply(snapshot) 호출로 간소화되고 변경 애니메이션이 자동으로 수행됩니다.

Swift 코드 예제

다음은 실제 작업에서 UIKit을 사용하는 두 가지 실용적인 예입니다. 그림자와 둥근 모서리가 있는 사용자 정의 뷰 만들기와 목록에서 항목을 삭제하기 위한 스와이프 제스처 처리입니다.

swift
extension UIView {
    func applyCardStyle() {
        layer.cornerRadius = 12
        layer.shadowOpacity = 0.15
        layer.shadowRadius = 8
        layer.shadowOffset = CGSize(width: 0, height: 2)
        layer.masksToBounds = false
    }
}

@objc private func handleSwipe(_ gesture: UISwipeGestureRecognizer) {
    guard let swipedView = gesture.view else { return }
    UIView.animate(withDuration: 0.3) {
        swipedView.alpha = 0
        swipedView.transform = CGAffineTransform(translationX: 300, y: 0)
    } completion: { _ in
        swipedView.removeFromSuperview()
    }
}

applyCardStyle 확장은 모든 뷰에 그림자와 둥근 모서리를 추가합니다. 제품 카드, 프로필 및 알림에 유용합니다. 애니메이션이 있는 handleSwipe 메서드는 사용자가 항목에서 오른쪽으로 스와이프하면 항목을 삭제합니다. 핸들러는 UISwipeGestureRecognizer(direction: .right) 구성으로 addGestureRecognizer를 통해 뷰에 추가됩니다. masksToBounds = false를 설정하는 것은 그림자가 뷰 경계에 의해 잘리지 않도록 하는 데 중요합니다.

더 복잡한 인터페이스에는 UIStackView를 사용하세요. 중첩된 뷰를 자동으로 가로 또는 세로로 배포하는 컨테이너입니다. Stack View는 레이아웃을 단순화합니다. 각 요소에 제약 조건을 설정할 필요 없이 스택 자체에 하나의 제약 조건만 있으면 됩니다.

자주 묻는 질문

UIView에서 frame과 bounds의 차이점은 무엇인가요?

Frame은 superview의 좌표계에 있는 사각형(위치 + 크기)입니다. Bounds는 뷰 자체 좌표계에 있는 사각형(항상 0,0에서 시작)입니다. Frame은 회전 및 크기 조정 시 변경되지만 bounds는 변경되지 않습니다.

사용하지 않는 뷰에서 메모리를 해제하려면 어떻게 하나요?

UIKit은 숨겨진 컨트롤러의 뷰를 자동으로 언로드합니다. 개발자는 뷰 속성을 weak var로 선언하기만 하면 시스템 경고 시 ARC가 메모리를 해제할 수 있습니다.

2026년에도 Storyboard를 사용해야 하나요?

새 프로젝트의 경우 Apple은 SwiftUI를 권장합니다. 프로젝트가 UIKit을 사용하는 경우 개별 화면에는 XIB를 사용하거나 SnapKit을 통한 프로그래밍 방식 레이아웃을 사용하세요. Storyboard는 병합 충돌을 일으키고 빌드를 느리게 합니다.

UIKit에서 다크 모드를 구현하려면 어떻게 하나요?

traitCollection을 지원하는 UIColor를 사용하세요: UIColor { $0.userInterfaceStyle == .dark ? ... : ... }. Info.plist에서 UIUserInterfaceStyle 키로 다크 모드를 활성화하세요.

수동 제약 조건보다 UIStackView가 더 나은 점은 무엇인가요?

UIStackView는 alignment, distribution 및 spacing을 기반으로 중첩된 뷰의 위치와 크기를 자동으로 계산합니다. 제약 조건 코드를 60–80% 줄이고 다양한 화면에 적응을 단순화합니다.

요약

  • UIKit은 iOS, iPadOS 및 macOS 인터페이스를 명령형 접근 방식으로 구축하기 위한 Apple의 기본 프레임워크입니다.
  • UIView는 렌더링 및 터치를 관리하며 그래픽 부분은 별도 스레드에서 실행되는 CALayer 레이어가 처리합니다.
  • UIViewController는 viewDidLoad부터 메모리 해제까지 각 단계를 재정의할 수 있는 엄격한 수명 주기를 따릅니다.
  • Auto Layout은 고정 좌표를 제약 조건 시스템으로 대체하여 모든 화면 크기와 방향에 인터페이스를 적응시킵니다.
  • UITableViewUICollectionView는 재사용 식별자로 큰 목록에서 성능을 보장하고 최신 Compositional Layout을 지원합니다.
  • UIStackView는 뷰 시퀀스의 레이아웃을 단순화하여 제약 조건 코드를 60–80% 줄입니다.
  • 새 프로젝트의 경우 Apple은 SwiftUI를 권장하지만 UIKit은 이전 iOS 버전 지원 및 복잡한 사용자 정의 인터페이스에 여전히 중요합니다.

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기