진짜진짜진짜 chatGPT에게 감사하는 마음으로 씁니다. 혼자서 공부하는 것이 진짜 쉽지 않은 데...그나마 ㅠㅠㅠ...
지금까지 제대로 이해하지 않았던 개념을 잡으려고 정리합니다.
프레임워크란?
프레임워크란 애플리케이션의 전체적인 아키텍처를 구성하는 라이브러리 집합체이며, 앱 개발에서 필수적인 여러 기능들을 제공합니다.
라이브러리와의 차이
프레임워크와 라이브러리의 가장 큰 차이는 제어 흐름의 주도성입니다.
라이브러리는 개발자가 필요할 때마다 호출하여 사용하는 방식으로, 개발자가 제어 흐름을 가지고 있습니다. 즉, 개발자가 필요한 기능을 호출하여 사용하는 방식입니다.
반면에 프레임워크는 제어 흐름이 프레임워크에게 있으며, 개발자가 프레임워크에게 필요한 정보를 제공하고 필요한 기능을 호출하는 방식입니다. 즉, 개발자는 프레임워크가 제공하는 규칙과 가이드라인을 따라 개발하며, 프레임워크가 개발의 주도성을 가지고 있습니다.
iOS 프레임워크는 다양한 종류가 있습니다. 여기에는 몇 가지 예시를 들어보겠습니다.
- UIKit 프레임워크: iOS 앱을 개발하기 위한 기본 프레임워크로서, 버튼, 레이블, 텍스트 필드, 이미지 뷰 등과 같은 인터페이스 요소들을 제공합니다.
- SwiftUI 프레임워크: 최근에 출시된 UI 프레임워크로서, 선언적인 방식으로 UI를 작성할 수 있습니다. iOS, macOS, watchOS 및 tvOS에서 모두 사용할 수 있습니다.
- Core Data 프레임워크: 앱 내에 데이터를 관리하는 데 사용되며, 데이터를 저장하고 검색, 정렬 및 필터링하는 기능을 제공합니다.
- Core Animation 프레임워크: iOS 앱에서 2D 및 3D 애니메이션을 만드는 데 사용됩니다.
- Core Location 프레임워크: 위치 기반 서비스를 사용할 수 있도록 도와주는 프레임워크로서, GPS 및 Wi-Fi를 사용하여 위치를 결정합니다.
- AVFoundation 프레임워크: 오디오 및 비디오 녹음 및 재생을 지원하는 프레임워크입니다.
- CloudKit 프레임워크: 앱에서 데이터를 iCloud에 저장하고 동기화할 수 있도록 도와주는 프레임워크입니다.
*프레임워크가 라이브러리로서 사용될 수도 있습니다.
SwiftUI가 라이브러리로서 사용되는 예제코드
import UIKit
import SwiftUI
struct User {
var name: String
var age: Int
}
class UserViewController: UIViewController {
var user: User!
override func viewDidLoad() {
super.viewDidLoad()
let userView = UIHostingController(rootView: UserSwiftUIView(user: user))
addChild(userView)
userView.view.frame = view.bounds
view.addSubview(userView.view)
userView.didMove(toParent: self)
}
}
struct UserSwiftUIView: View {
var user: User
var body: some View {
VStack {
Text("Name: \(user.name)")
Text("Age: \(user.age)")
}
}
}
이 코드에서 SwiftUI는 흐름 제어를 가지고 있지 않습니다. UIViewController가 흐름 제어를 담당하고 있으며, SwiftUI View는 UIViewController의 자식 뷰로 추가되어 사용됩니다. SwiftUI View는 UIHostingController를 통해 UIKit에서 사용 가능한 View Controller로 래핑되어 UIViewController에서 사용됩니다. 따라서 SwiftUI View는 UIKit의 일부로 취급되며, 흐름 제어는 UIKit에서 담당됩니다.
UIKit과 CoreLocation 프레임 워크의 혼용 예제 코드
import UIKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
if let location = locations.last {
print(location.coordinate)
}
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print(error.localizedDescription)
}
}
위 코드에서 CoreLocation은 CLLocationManagerDelegate 프로토콜을 채택하여 CLLocationManager 객체를 사용하여 위치 업데이트를 요청하고 이벤트를 수신하는데 사용됩니다. 이 프로토콜 메서드들은 CLLocationManager 객체가 위치 관련 이벤트를 수신하면 자동으로 호출되며, 이때 CoreLocation이 제어 흐름의 주도성을 가지게 됩니다. 따라서 CoreLocation이 위치 정보를 관리하고 이를 사용하여 작업을 수행하므로 제어 흐름의 주도성을 가지게 됩니다.
라이브러리란?
라이브러리(library)는 재사용 가능한 코드를 모아둔 소프트웨어 패키지로, 다른 프로그램에서 호출하여 사용할 수 있도록 만들어진 프로그램 모음입니다. 일반적으로 함수, 클래스, 변수 등의 코드 조각들이 미리 작성되어 있으며, 다른 프로그램에서 사용할 수 있도록 컴파일 된 형태로 제공됩니다. 라이브러리를 사용하면 코드의 재사용성을 높일 수 있으며, 개발 시간과 비용을 절약할 수 있습니다. 라이브러리는 프로그래밍 언어나 플랫폼에 따라 제공되는 기능과 형식이 다양합니다.
모듈이란?
모듈(Module)은 코드의 구조화를 위한 개념으로, 코드를 구성하는 일정 수준의 기능 단위를 나타냅니다. 하나의 프로젝트 안에 여러 모듈을 만들거나, 다른 프로젝트에서도 해당 모듈을 재사용할 수 있습니다. 모듈을 만들어서 다른 모듈과 결합해 사용하면 코드의 재사용성이 높아지고, 유지보수가 용이해집니다.
예제코드
//greeting.swift 파일
public func sayHello() {
print("Hello!")
}
func sayGoodbye() {
print("Goodbye!")
}
import greeting
sayHello() // "Hello!" 출력
sayGoodbye() // 오류: 'sayGoodbye'는 선언되어 있지 않습니다.
*** 정리 ***
모듈은 코드를 구성하는 단위이고, 라이브러리는 프로그램에서 필요한 기능을 수행하기 위한 코드 모음입니다. 모듈은 프로젝트 내에서만 사용되거나, 다른 프로젝트에서도 사용될 수 있지만, 라이브러리는 외부에서 제공되는 코드 모음입니다.
함수란?
함수(Function)란, 특정한 기능을 수행하는 코드 블록을 의미합니다.
import Foundation
// 간단한 유틸리티 함수
func add(_ a: Int, _ b: Int) -> Int {
return a + b
}
메서드란?
함수는 객체 지향 프로그래밍과 프로시저 지향 프로그래밍에서 모두 사용됩니다. 함수는 입력 매개변수를 취하고, 그들을 처리하여 결과값을 반환합니다. 함수는 일반적으로 객체의 상태에 따라 결과가 변하지 않습니다.
메서드는 객체 지향 프로그래밍에서 객체의 인스턴스에 속한 함수입니다. 객체는 데이터와 해당 데이터를 조작하는 함수의 조합입니다. 메서드는 객체의 상태를 조작할 수 있으며, 객체의 상태에 따라 결과가 달라질 수 있습니다.
함수는 독립적으로 존재하고 입력값을 처리하여 출력값을 반환합니다. 반면에 메서드는 객체의 일부이며 객체의 상태를 변경하거나 객체의 정보를 반환합니다.
메서드 예제 코드
class Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
func sayHello() {
print("안녕하세요, 제 이름은 \(name)이고, \(age)살입니다.")
}
}
let person = Person(name: "John", age: 30)
person.sayHello() // 출력: 안녕하세요, 제 이름은 John이고, 30살입니다.
Person이란 인스턴스 안에 있으므로 sayHello()는 함수이기도 하고, 메서드 이기도 합니다. 하지만 앞의 add 함수의 경우 어떠한 인스턴스에도 속해있지 않기 때문에 메서드라고 할 수 없습니다. :)
'iOS' 카테고리의 다른 글
ViewController Life Cycle (0) | 2023.04.27 |
---|---|
iOS 면접 질문 (0) | 2023.04.26 |
API 키 숨기기, xcconfig파일로 (0) | 2023.04.20 |
Feature, ViewModel, UseCase (0) | 2023.04.20 |
iOS 터치-4 (0) | 2023.04.16 |