본문 바로가기
Swift

주니어 iOS 개발자 Swift 면접 질문

by songmoro 2025. 4. 23.
728x90

 

1. Swift에서 옵셔널이란 무엇인가? 옵셔널을 안전하게 다루려면 어떻게 해야 하는가?

옵셔널이란 변수가 값을 가지거나, 아무런 값(nil)도 가지지 않는 Swift의 기능

 

var name: String? = "John" // 옵셔널 스트링
name = nil // name은 nil

 

안전하게 다루기 위한 방법: 옵셔널 바인딩(Optional Binding), 가드문(Guard Statement), Nil-결합 연산자(Nil-Coalescing)

 

// 옵셔널 바인딩(Optional Binding)
if let unwrappedName = name {
    print(unwrappedName)
}
// 가드문(Guard Statement)
func greet(_ name: String?) {
    guard let name = name else {
        print("No name provied")
        return
    }

    print("Hello, \(name)")
}
// Nil-결합 연산자(Nil-Coalescing)
let user = name ?? "Guest"
print(user) // name이 nil이면 "Guest" 출력

 

2. var와 let의 차이점은 무엇인가?

var는 가변적으로 값의 변경이 가능하고, let은 불변적으로 값이 고정적

var age = 25
age = 30 // 가능

let name = "John"
name = "Doe" // Error: Cannot assign to 'let' constant

 

3. Swift에서 struct와 class의 차이점은 무엇인가?

struct(값 타입)
메모리 영역: 스택
상속: 지원 안 함
불변성: 기본적으로 불변함
복사 동작: 값 복사
성능: 빠름

 

class(참조 타입)
메모리 영역: 힙
상속: 지원
불변성: 가변적
복사 동작: 참조 복사
성능: ARC로 인해 느림

 

struct Person {
    var name: String
}

var person1 = Person(name: "Alice")
var person2 = person1

person2.name = "Bob"

print(person1.name) // "Alice" (변경 안됨)
print(person2.name) // "Bob" (변경 됨)

 

4. Computed property란 무엇인가? Stored property와 어떤 차이점은 무엇인가?

Computed property: 값이 동적으로 계산됨
Stored property: 값이 저장됨

 

struct Rectangle {
    // Stored property
    var width: Double
    var height: Double

    // Computed Property
    var area: Double {
        return width * height
    }
}

let rect = Rectangle(width: 10, height: 5)
print(rect.area) // 50

 

5. Type inference란 무엇인가?

타입 추론은 Swift가 자동으로 데이터의 타입을 결정하는 것

 

let x = 10 // Swift가 x를 Int로 추론
let y = "Hello" // Swift y를 String으로 추론

 

6. mutating과 non-mutating 함수란 무엇인가? 어떤 차이점을 갖는가?

구조체 내부 속성을 수정하기 위해선 mutating이 필요
클래스는 참조 타입으로 mutating을 요구하지 않음

 

struct Car {
    var speed = 0
    mutating func accelerate() {
        speed += 10
    }
}

 

7. Swift의 extension이란 무엇인가? 어떻게 동작하는가?

extension은 기존 타입에 기능을 추가할 때 사용

 

extension Int {
    func square() -> Int {
        return self * self
    }
}

print(4.square()) // 16

 

8. Swift의 protocol이란 무엇인가? 어떻게 정의하고, 사용하는가?

protocol은 메서드와 속성의 설계도를 의미

 

protocol Vehicle {
    var speed: Int { get set }
    func accelerate()
}

struct Car: Vehicle {
    var speed = 0
    func accelerate() {
        print("Accelerating...")
    }
}

 

9. Codable이란 무엇인가? JSON 파싱에서 어떻게 동작하는가?

Codable은 JSON의 인코딩과 디코딩할 때 도움이 됨

 

struct User: Codable {
    var name: String
    var age: Int
}

let json = """
{"name": "Alice", "age": 25}
""".data(using: .utf8)!

let decoder = JSONDecoder()
let user = try? decoder.decode(User.self, from: json)
print(user?.name) // "Alice"

 

10. Swift의 접근 제어 수준에 대해 설명하시오

open: 어디서든 접근 가능, 외부 모듈에서 서브클래싱 가능
public: 어디서든 접근 가능, 외부 모듈에서 서브클래싱 불가
internal: 기본값, 내부 모듈에서 접근 가능
fileprivate: 같은 파일 내에서 접근 가능
private: 같은 영역 내에서 접근 가능

 

11. Swift에서 protocol-oriented programming(POP)이란 무엇인가?

Swift는 상속 대신 프로토콜을 사용하는 것을 장려

 

12. delegation과 notification의 차이점은 무엇인가?

Delegation
One to One: O
One to Many: X
사용: protocol

 

Notification
One to One: X
One to Many: O
사용: NotificationCenter

 

13. class의 상속과 protocol의 채택의 차이점은 무엇인가?

클래스의 상속은 하나의 슈퍼 클래스만 가능, 반면에 프로토콜은 여러 개를 채택할 수 있음
프로토콜은 구현되지 않은 동작을 정의

 

14. Swift에서 다중 상속을 다루는 방법은 무엇인가?

Swift는 다중 상속을 지원하지 않음. 대신, 여러 개의 프로토콜을 사용

 

protocol Flyable {}
protocol Swimmable {}\
class Bird: Flyable, Swimmable {}

 

15. Swift protocol의 associated type이란 무엇인가?

연관 타입은 프로토콜이 placeholder 타입을 정의할 때 사용

 

protocol Container {
    associatedtype Item
    func add(item: Item)
}

 

16. Swift에서 generic이란 무엇인가? 어떤 도움이 되는가?

제네릭은 코드를 유연하고, 재사용 가능하게 함

 

func swapValues<T>(a: inout T, b: inout T) {
    let temp = a
    a = b
    b = temp
}

 

17. Swift에서 SOLID 원칙에 대해 설명하시오.

SOLID 원칙은 코드를 유지보수가 가능하고, 확장 가능하게 도움

 

S(SRP, Single Responsibility Principle): 클래스는 변경을 위한 이유가 하나여야 한다.
O(OCP, Open-Closed Principle): 코드는 확장에는 열려 있고, 변경에는 닫혀있어야 한다.
L(LSP, Liskov Substitution Principle): 서브 타입은 베이스 타입을 대체할 수 있어야 한다.
I(ISP, Interface Segregation Principle): 클래스는 사용하지 않는 불필요한 메서드를 채택하지 않아야 한다.
D(DIP, Dependency Inversion Principle): 상위 모듈은 하위 모듈을 의존하지 않아야 한다.

 

18. Swift에서 Automatic Reference Counting(ARC)란 무엇인가?

ARC는 객체에 대한 강한 참조를 추적하여 메모리를 자동으로 관리
객체의 참조가 남아있지 않을 때, 객체는 해제됨

 

19. strong, weak, unowned 참조에는 어떤 차이가 있는가?

strong 참조
소유권: 기본
할당 해제 방지: O
사용 사례: 메모리에 객체 유지

 

weak 참조
소유권: 없음
할당 해제 방지: X
사용 사례: 참조 사이클 방지

 

unowned 참조
소유권: 없음
할당 해제 방지: X
사용 사례: 참조하는 객체가 절대 nil이 되지 않을 때

 

20. retain cycle이란 무엇인가? 어떻게 방지하는가?

참조 사이클은 두 객체가 서로를 강하게 참조하고 있을 때 발생
이로 인해 할당 해제가 되지 않는다.


weak 혹은 unowned 참조를 통해 방지

 

21. Grand Central Dispatch(GCD)란 무엇인가? 어떻게 사용하는가?

GCD는 동시 실행을 위한 애플의 API

 

DispatchQueue.global(qos: .background).async {
    print("Background Task")
    DispatchQueue.main.async {
        print("Back to Main Thread")
    }
}

 

22. iOS의 operation queue란 무엇인가?

OperatingQueue는 GCD보다 더 높은 추상화를 통해 더 나은 종속성 관리를 제공

 

let queue = OperationQueue()
queue.addOperation {
    print("Operation Executed")
}

 

23. Swift의 async/await이란 무엇인가? 어떻게 동시성 제어를 향상하는가?

async/await은 비동기 코드 실행을 간소화

 

func fetchData() async -> String {
    return "Data Received"
}

Task {
    let result = await fetchData()
    print(result)
}

 

24. DispatchGroup이란 무엇인가? 어떤 때에 사용하는가?

DispatchGroup은 여러 작업을 동기화할 때 사용

 

let group = DispatchGroup()
group.enter()
DispatchQueue.global().async {
    print("Task 1")
    group.leave()
}
group.notify(queue: .main) {
    print("All tasks completed")
}

 

25. Auto Layout이란 무엇인가? 중요한 이유는 무엇인가?

Auto Layout은 UI를 다양한 크기의 화면에 맞게 조정하는 제약 기반 레이아웃 시스템

 

view.translateAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    view.leadingAnchor.constraint(equalTo: superview.leadingAnchor),
    view.trailingAnchor.constraint(equalTo: superview.trailingAnchor)
])

 

26. frame와 bounds의 차이점은 무엇인가?

frame: 위치, 크기가 상위 뷰에 연관됨
bounds: 위치, 크기가 스스로와 연관됨

 

print(view.frame) // (x: 10, y: 10, width: 200, height: 200)
print(view.bounds) // (x: 0, y: 0, width: 200, height: 200)

 

27. XIB, Storyboard, programmatic UI의 차이점은 무엇인가?

XIB
장점: 재사용 가능한 UI 컴포넌트
단점: 전체 앱에 이상적이지 않음

 

Storyboard
장점: 드래그 앤 드롭 UI
단점: 큰 프로젝트에서 제어하기 어려움

 

Programmatic UI
장점: 전체적인 제어
단점: 더 많은 코드 작성

 

28. UIViewController 생명 주기란 무엇인가? 각 메서드는 어떤 때 호출되는가?

viewDidLoad: 뷰가 생성될 때 한 번
viewWillAppear: 뷰가 나타나기 전
viewDidAppear: 뷰가 나타난 후
viewWillDisappear: 뷰가 사라지기 전
viewDidDisappear: 뷰가 사라진 후

 

29. UITableView와 UICollectionView의 차이점은 무엇인가?

UITableView: 단일 열(column) 목록
UICollectionView: 그리드 기반 레이아웃

 

30. View controller 간 데이터를 전달하는 방법은 무엇인가?

Segue, Delegation, Closure, NotificationCenter 사용

 

// Segue
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let destination = seque.destination as! SecondVC
    destination.data = "Hello"
}

// Delegation
protocol DataPassingDelegate {
    func sendData(_ data: String)
}

// Closure
class SecondVC {
    var completion: ((String) -> Void)?
}

// NotifincationCenter
NotificationCenter.default.post(name: NSNotification.Name("DataReceived"), object: "Hello")

 

31. Diffable data source란 무엇인가? 테이블 뷰를 어떻게 개선하는가?

Diffable data source는 변경 사항을 자동으로 관리하여 UI 업데이트를 최적화

 

var snapshot = NSDiffableDataSourceSnapshot<Section, Item>()
snapshot.appendSections([.main])
snapshot.appendItesm(["Item1", "Item2"])
dataSoucr.apply(snapshot)

 

32. URLSession이란 무엇인가? 어떻게 네트워크 요청을 하는가?

URLSession은 Swift에서 네트워크 요청을 만드는 기본 API

 

let url = URL(string: "https://api.example.com/data")
let task = URLSession.shared.dataTask(with: url) { data, response, error in
    guard let data = data, error == nil else {
        print("Error:", error ?? "Unknown error")
        return
    }
    print("Data received:", String(data: data, encoding: .utf8)!)
}
task.resume()

 

33. Swift에서 JSON 파싱을 어떻게 다루는가?

9번과 동일

 

34. URLSession과 서드 파티 네트워킹 라이브러리(예를 들어 Alamofire)의 차이점은 무엇인가?

URLSession
복잡도: 더 많은 기본 설정 필요
의존성: 외부 의존성 없음
유연성: 전체 제어

 

Alamofire
복잡도: 더 적은 보일러 플레이트
의존성: Alamofire 필요
유연성: 고수준 추상화

 

import Alamofire

AF.request("https://api.example.com/data").responseJSON { response in
    print(response)
}

 

35. Combine이란 무엇인가? 데이터 처리를 어떻게 개선하는가?

콤바인은 API 응답과 같은 비동기 이벤트를 처리하기 위한 애플의 반응형 프레임워크

 

import Combine

struct User: Codable {
    let name: String
}

let url = URL(string: "https://api.example.com/user")!
let publisher = URLSession.shared.dataTaskPublsiher(for: url)
    .map { $0.data }
    .decode(type: User.self, decoder: JSONDecoder())
    .sink(receiveCompletion: { print($0) },
          receiveValue: { print($0.name) })

 

36. UserDefaults란 무엇인가? 언제 사용하는가?

UserDefaults는 유저 설정과 같은 작은 key-value 쌍을 저장할 때 사용

 

UserDefaults.standard.set("Alice", forKey: "username")
let username = UserDefaults.standard.string(forKey: "username")
print(username) // "Alice"

 

37. Core Data란 무엇인가? 어떻게 사용하는가?

코어 데이터는 객체 그래프를 관리하고, 데이터를 지속시키기 위한 애플의 프레임워크

 

let context = (UIApplication.shared.delegate as! Appdelegate).persistentContainer.viewContext

let newUser = UserEntity(context: context)
newUser.name = "Alice"
newUser.age = 25

try? context.save()

 

38. Core Data와 Realm의 차이점은 무엇인가?

Core Data
성능: 느림
설정 복잡도: 좀 더 많은 설정 필요
동기화: 동기화 내장 X

 

Realm
성능: 빠름
설정 복잡도: 쉬운 설정
동기화: 동기화 내장 O

 

let realm = try! Realm()
let user = User()
user.name = "Alice"

try! realm.write {
    realm.add(user)
}

 

39. MVC 아키텍처란 무엇인가?

Model: 비즈니스 로직, 데이터 저장공간
View: UI
Controller: 유저 입력과 뷰 업데이트 처리

 

class User {
    var name: String
    init(name: String) { self.name = name }
}

class ViewController: UIViewController {
    var user = User(name: "Alice")
    override func viewDidLoad() {
        super.viewDidLoad()
        print(user.name)
    }
}

 

40. MVVM 아키텍처란 무엇인가? MVC를 어떻게 개선하는가?

MVVM은 MVC에 UI 로직과 비즈니스 로직을 구분하는 ViewModel 도입

 

Model: 데이터 & 비즈니스 로직
ViewModel: 뷰에 필요한 데이터 처리
View: UI

 

class UserViewModel {
    var username: String
    init(user: User) {
        self.username = user.name.uppercased()
    }
}

 

41. Singleton pattern이란 무엇인가?

싱글톤은 클래스의 인스턴스가 하나만 존재한다는 걸 보장

 

class APIService {
    static let shared = APIService()
    private init() {} // 인스턴스 생성 방지
}

 

42. iOS 앱의 memory leak를 어떻게 디버그 하는가?

Instruments의 Leaks 사용, Xcode Memory Graph를 사용해 retain cycle 검사

 

43. breakpoint란 무엇인가? 어떻게 사용하는가?

브레이크 포인트는 디버깅을 위해 앱 실행을 정지하는 것

 

symbolic breakpoint 추가, lldb 커맨드를 사용해 디버깅

 

44. 민감한 유저 데이터를 안전하게 보관하는 방법은 무엇인가?

Keychain 사용

 

let password = "secret"
let keychain = KeychainSwift()
keychain.set(password, forKey: "userPassword")

 

45. 앱 실행 시간을 어떻게 개선하는가?

viewDidLoad에서 무거운 작업을 최소화
DispatchQueue.global과 같은 백그라운드 스레드 사용
Image Assets을 사용해 이미지 최적화

 

46. iOS에서 deep linking은 어떻게 처리하는가?

Deep linking을 사용하면 URL을 통해 특정 앱 페이지를 열 수 있음

 

func application(_ app: UIApplication, open url: URL) -> Bool {
    print("Opened via \(url)")
    return true
}

 

47. App Transport Security(ATS)란 무엇인가?

ATS는 보안을 위해 HTTPS 사용을 강제

 

// ATS 끄는법(권장하지 않음)
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

 

48. iOS에서 Unit Test와 UI Test란 무엇인가?

Unit Test: 개별 메서드에 대한 테스트
UI Test: 유저 상호작용에 대한 테스트

 

func testExample() {
    let sum = add(2, 3)
    XCTAssertEqual(sum, 5)
}

 

49. iOS 앱을 어떻게 배포하는가?

App Store, TestFlight(베타 테스팅), Enterprise Distribution(내부 앱)

 

50. 제품에서 앱 크래시를 어떻게 처리하는가?

에러 기록을 위해 Crashlytics 사용
NSExceptionHandler 사용
크래시 리포트 수집

 

참고

https://www.linkedin.com/feed/update/urn:li:activity:7303317244472627200/
https://bbiguduk.gitbook.io/swift/language-guide-1/the-basics
https://bbiguduk.gitbook.io/swift/language-guide-1/control-flow

728x90

'Swift' 카테고리의 다른 글

Swift: add, adds, append, appends 속도 비교  (0) 2025.03.30
Swift: add, append 속도 비교  (0) 2025.03.30
Swift: if let, guard let 속도 비교  (0) 2025.03.30
Swift: async let 수행 순서  (0) 2025.03.30
Swift Concurrency  (0) 2025.02.04