UIKit과 SwiftUI의 차이

cheshire0105·2024년 1월 15일
0

iOS

목록 보기
6/42
post-thumbnail

정리가 필요해.

들어가며

swift를 처음 배우기 시작 했을 때 거의 처음 고민 하는 것은 아마 SwiftUI로 시작 할 것인가, 아니면 UIKit으로 시작 할 것 인가 하는 고민일 것이다. 필자는 고민 끝에 좀 더 기초적이고 현업에서 많이 쓰인다고 하는 UIKit으로 입문 하였다. 그러나 최근 공고를 보니 SwiftUI를 사용 한다고 올라온 공고를 몇가지 보게 되었다. 또한 최신 기능들은 SwiftUI로 개발 할 수 있다는 걸 듣고, SwiftUI를 배워보자 마음이 들어 SwiftUI를 사용하면서 UIKit과의 차이점을 정리 해보면서 둘의 차이를 좀 더 명확하게 알아야 겠다는 생각이 들었다. 그러니까 이 글은 "UIKit으로 개발 및 공부 한 사람의 시선에서 적은 SwiftUI의 차이점" 이라고 설명 할 수 있겠다.

선언형과 명령형

SwiftUI로 작업을 시작 하면서 많이 본 단어는 "선언형 프로그래밍"이다. UIKit은 그렇다면 그의 반대인 "명령형 프로그래밍"인데 그 둘이 어떻게 다른지 정리를 해보자.
UIKit으로 작업을 할때는 작업 순서는 다음과 같았다. - 레이아웃을 구성 한다고 가정 하면, 우선 변수에 화면에 보여줄 레이블이나 버튼, 이미지 들을 구현한다. 각각의 버튼엔 addTarget으로 실행할 함수를 넣어놓는다. 그리고 레이아웃을 snapKit이나 오토레이아웃을 활용 하여 위치를 잡는다. 앞서 addTarget으로 넣어놓은 함수를 구현 하여 버튼을 눌렀을 때 동작을 만든다. - 이런 순서로 작업을 했었다. 그 레이아웃을 viewDidLoad 함수 안에 넣어 레이아웃을 구성 하는 식으로 앱을 만들었었다. 그런데 SwiftUI는 그런 구현 방식과 차이가 있었다.

많은 부분이 생략된 느낌이였다. UIKit에 필수적인 viewDidLoad는 함수와 오토레이아웃은 볼 수 없었고, VStack, HStack 같은 새로운 Stack 개념과 padding()이라는 새로운 개념들이 있었다. 처음 든 느낌은 레이아웃을 구성 하는데에 상당히 간결하고 제한적이라는 느낌이였다. 간단하지만 디테일 하게 만들지는 못하는 느낌이랄까. 아래의 간단한 코드가 나의 설명을 보충 할 수 있겠다.

import UIKit
import SnapKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let label = UILabel()
        label.text = "안녕하세요!"
        label.font = UIFont.systemFont(ofSize: 24)
        view.addSubview(label)

        let button = UIButton(type: .system)
        button.setTitle("클릭하세요", for: .normal)
        button.backgroundColor = .blue
        button.setTitleColor(.white, for: .normal)
        button.layer.cornerRadius = 10
        button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
        view.addSubview(button)

        label.snp.makeConstraints { make in
            make.center.equalToSuperview().offset(-20)
        }

        button.snp.makeConstraints { make in
            make.top.equalTo(label.snp.bottom).offset(20)
            make.centerX.equalToSuperview()
            make.width.equalTo(200)
            make.height.equalTo(50)
        }
    }

    @objc func buttonTapped() {
        print("버튼이 클릭되었습니다.")
    }
}

위의 코드는 UIKit으로 구성한 버튼을 눌렀을 때의 코드 이다. 앞서 말한 듯 viewDidLoad 함수와 addTarget으로 동작 함수를 구현 하였다.

import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            Text("안녕하세요!")
                .font(.title)
                .padding()

            Button(action: {
                print("버튼이 클릭되었습니다.")
            }) {
                Text("클릭하세요")
                    .font(.headline)
                    .foregroundColor(.white)
                    .padding()
                    .background(Color.blue)
                    .cornerRadius(10)
            }
        }
    }
}

위의 코드도 같지만 UIKit으로 구성 되었을 때 보다 많이 간략해지고 간소화 되어 있는 모습을 볼 수 있다. 레이아웃의 구성은 stack이 처리 해주고 우리는 요소들의 속성이나 동작만 정의해주면 되는 방식이다.

나는 UIKit으로만 작업을 해와서 SwiftUI를 통해 레이아웃을 구성 할 땐 "어? 화면에서 얼마나 띄우는지 어떻게 정의 하지...?" 이런 의문을 가졌다. 하지만 그런 의문은 선언형 일 때만 할 수 있는 질문이였다. 반응형 프로래밍은 다르다.

반응형 프로그래밍에서는, 레이아웃과 UI 요소들의 위치를 절대적인 값으로 지정하는 것이 아니라, 상황에 따라 유동적으로 조절하는걸 목표로 한다. 이는 SwiftUI의 핵심 철학 중 하나로, 다양한 화면 크기와 환경에서 일관된 사용자 경험을 제공하기 위한 것이다. UIKit의 오토레이아웃을 생각 하면 되겠다.

SwiftUI에서는 레이아웃을 구성할 때 '얼마나 띄울지'를 절대적인 수치로 정의하기보다는, 뷰의 관계를 통해 우선 순위를 정한다. 예를 들어, VStack이나 HStack 같은 스택 뷰를 사용하여 요소들을 세로나 가로로 정렬하고, Padding이나 Spacing을 통해 요소들 사이의 간격을 조정하는 것이다. 이러한 방식은 뷰들이 서로 어떻게 배치될지를 '선언'하는 것이며, 구체적인 위치나 크기는 디바이스의 크기와 화면 해상도에 따라 자동으로 조절 된다.

SwiftUI의 그런 방식은 반응형 프로그램의 특징이다. UIKit에서는 각 요소의 정확한 위치와 크기를 계산하고, 오토레이아웃 제약조건을 사용하여 화면 크기가 변해도 적절히 대응할 수 있도록 해야 한다. 반면, SwiftUI는 더 고수준의 추상화를 제공하여, 개발자가 UI의 세부적인 배치보다는 더 큰 그림에 집중할 수 있도록 하는 것이다.

長과 短

그렇다면 SwiftUI는 만능일까? 현재까지의 답은 "아니요"이다. SwiftUI를 사용하면서 느낀 점은, 많은 부분을 생략하면서 일정 수준 이상의 디테일한 조정이 어려울 수 있다는 것이다. SwiftUI를 사용 할 때 신기한 기능이 "프리뷰" 기능인데 실시간으로 레이아웃을 보여주는 이유가 많은 부분을 생략 하기 때문에 코드만 보고는 UI를 상상 하는 것에 한계가 있기 때문일까? 하는 생각도 들었다. 코드가 간결해지는 것은 분명 장점이지만, 때때로 더 세밀한 제어나 복잡한 레이아웃을 구성하고 싶을 때는 한계를 느낄 수 있다. SwiftUI는 아직 발전 중인 기술이기 때문에, UIKit에서 가능한 모든 기능을 완벽하게 대체하기에는 시간이 필요하다.

UIKit을 사용했을 때의 경험은, 더 많은 코드를 작성하긴 하지만, 그만큼 더 많은 제어가 가능하다는 점에서 차이가 있다. UIKit은 오랜 시간 동안 사용되어 왔고, 다양한 환경과 요구사항에 맞게 세밀하게 조정할 수 있는 강력한 도구다. 따라서 복잡한 UI나 높은 수준의 사용자 정의가 필요한 프로젝트에는 여전히 UIKit이 더 적합할 수 있다.

결국, SwiftUI와 UIKit 사이의 선택은 프로젝트의 요구사항, 개발 환경, 그리고 개인적인 선호도에 따라 달라질 수 있다. SwiftUI는 빠르고 효율적인 개발을 가능하게 하지만, 때로는 UIKit의 유연성과 세밀한 제어가 필요할 수 있다. 두 기술 모두 장단점을 가지고 있으며, 각각의 상황에 맞게 적절히 활용하는 것이 중요하다.

하지만 알아둘 필요는 있겠다. 위젯 기능이나 새로 나오는 프레임 워크들은 SwiftUI로 개발되니 알아둔다면 코드를 읽거나 개발 하는데에 많은 이점이 있을 것이다.

기술은 계속 발전하고 있고, SwiftUI도 계속해서 성장하고 있다. 앞으로도 이 두 프레임워크가 어떻게 발전해 나갈지 지켜보는 것도 iOS 개발자로서 흥미로운 일일 것이다. 개발자로서의 여정은 항상 새로운 것을 배우고 적응하는 과정이니까, 끊임없이 새로운 도전을 즐기면서 자신만의 경로를 찾아가는 것이 중요하겠다.

0개의 댓글