iOS프로그래밍실무(1/15)
iOS 개발자 면접 예상 질문
1. Swift와 Objective-C의 차이점은?
- 답변: Swift는 안전하고 현대적이며 문법이 간결하고, Objective-C는 C 기반으로 동적 런타임을 사용합니다.
2. ARC란 무엇인가요?
- 답변: ARC는 메모리를 자동 관리하며, 객체의 참조 카운트를 추적해 해제합니다.
3. Optional이란 무엇인가요?
- 답변: 값이 있거나 없을 수 있는 변수를 안전하게 처리하기 위한 타입입니다.
4. Closure란 무엇인가요?
- 답변: 이름 없는 함수로, 주변 변수나 상수를 캡처해 실행합니다.
5. Strong, Weak, Unowned의 차이는?
- 답변: Strong은 참조를 유지, Weak는 순환 참조 방지, Unowned는 nil 불가 약한 참조입니다.
6. Delegate 패턴이란?
- 답변: 객체 간 1:1 통신을 위해 책임을 위임하는 패턴입니다.
7. MVC와 MVVM의 차이는?
- 답변: MVC는 데이터-UI-로직 분리, MVVM은 ViewModel로 결합도를 줄입니다.
8. Auto Layout이란?
- 답변: 다양한 화면 크기에 맞춰 UI를 제약 조건으로 설정하는 방식입니다.
9. ViewController 생명주기는?
- 답변: viewDidLoad → viewWillAppear → viewDidAppear → viewWillDisappear → viewDidDisappear.
10. GCD란 무엇인가요?
- 답변: 비동기 작업을 멀티코어에서 처리하는 Apple의 기술입니다.
11. URLSession이란?
- 답변: 네트워크 요청을 처리하는 API로, 데이터 전송을 지원합니다.
12. REST API란?
- 답변: HTTP로 자원을 주고받는 아키텍처입니다.
13. Core Data란?
- 답변: 로컬 데이터베이스를 관리하는 프레임워크입니다.
14. Singleton 패턴이란?
- 답변: 클래스의 인스턴스를 하나만 생성하도록 보장합니다.
15. Codable 프로토콜이란?
- 답변: JSON 데이터를 Swift 객체로 변환하는 데 사용합니다.
16. Unit Test와 UI Test의 차이는?
- 답변: Unit Test는 코드 단위 테스트, UI Test는 인터페이스 동작 테스트입니다.
17. Dependency Injection이란?
- 답변: 객체 의존성을 외부에서 주입해 결합도를 낮춥니다.
18. SwiftUI란?
- 답변: 선언형으로 UI를 작성하는 Apple의 프레임워크입니다.
19. Memory Leak과 Retain Cycle은?
- 답변: Memory Leak은 메모리 낭비, Retain Cycle은 강한 참조 순환으로 해제 불가입니다.
20. iOS 개발자로서 중요한 역량은?
- 답변: 문제 해결, 코드 품질, 사용자 경험 이해가 핵심입니다.
1. 프로그래밍 언어 학습 (Swift)
- 중요성: iOS 개발의 핵심 언어는 Swift입니다. Objective-C도 여전히 사용되지만, 현대 iOS 개발은 대부분 Swift로 이루어집니다.
- 투자 시간:
- 초보자: 100~200시간 (기본 문법, 객체지향 프로그래밍, 함수형 프로그래밍 개념 익히기)
- 중급 이상: 50~100시간 (Swift 고급 기능, 예: 프로토콜, 제네릭, 옵셔널 체이닝 등 심화 학습)
- 추천 학습 방법:
- 온라인 강의 (Udemy, Coursera 등)나 Apple 공식 Swift 문서 활용
- 간단한 프로젝트(계산기, To-Do 앱)로 실습
- 목표: 변수, 함수, 클래스, 구조체, 클로저 등 Swift의 기본과 고급 개념을 자유롭게 다룰 수 있어야 함.
2. iOS 개발 환경 익히기 (Xcode)
- 중요성: Xcode는 iOS 앱을 개발, 디버깅, 배포하는 데 필수적인 도구입니다.
- 투자 시간: 20~50시간
- 내용:
- 인터페이스 빌더 사용법
- 디버깅 도구 활용
- 시뮬레이터로 앱 테스트
- 추천 학습 방법: 간단한 앱을 만들어보며 Xcode의 기능을 하나씩 익히기 (예: 버튼 클릭 시 텍스트 변경).
- 목표: Xcode에서 UI를 설계하고, 코드를 작성하며, 오류를 찾아 수정할 수 있는 수준.
3. iOS 프레임워크 이해 (UIKit, SwiftUI)
- 중요성: UIKit은 전통적인 iOS UI 개발 프레임워크이고, SwiftUI는 최신 선언형 UI 프레임워크입니다. 둘 다 알아두는 것이 경쟁력을 높입니다.
- 투자 시간:
- UIKit: 50~100시간 (뷰, 컨트롤러, 제스처, 애니메이션 등)
- SwiftUI: 30~70시간 (선언형 UI, 상태 관리 등)
- 추천 학습 방법: 공식 문서와 샘플 프로젝트(예: Apple의 WWDC 튜토리얼) 활용.
- 목표: 간단한 UI(버튼, 리스트, 네비게이션)를 만들고, 사용자 인터랙션을 처리할 수 있어야 함.
4. 데이터 관리 및 네트워킹
- 중요성: 앱은 데이터를 저장하고 서버와 통신해야 합니다.
- 투자 시간: 50~100시간
- 내용:
- 로컬 데이터: Core Data, UserDefaults, 파일 시스템 (20~40시간)
- 네트워킹: REST API 호출, JSON 파싱, Alamofire 같은 라이브러리 사용 (30~60시간)
- 추천 학습 방법: 가상 API(예: JSONPlaceholder)를 사용해 데이터 가져오기 연습.
- 목표: 서버에서 데이터를 가져와 앱에 표시하고, 로컬에 데이터를 저장/로드할 수 있어야 함.
5. 앱 개발 프로세스와 배포
- 중요성: 앱을 실제로 출시하려면 Apple의 가이드라인과 배포 과정을 알아야 합니다.
- 투자 시간: 20~40시간
- 내용:
- App Store Connect 설정
- 인증서, 프로비저닝 프로파일 관리
- 테스트(단위 테스트, UI 테스트)
- 추천 학습 방법: 작은 앱을 만들어 App Store에 올려보기.
- 목표: 앱을 빌드하고, 테스트하며, App Store에 제출할 수 있어야 함.
6. 프로젝트 경험 쌓기
- 중요성: 이론만으로는 부족하며, 포트폴리오로 실력을 증명해야 합니다.
- 투자 시간: 100
300시간 (프로젝트 23개 기준) - 추천 프로젝트:
- To-Do 리스트 앱
- 날씨 앱 (API 연동)
- 간단한 소셜 미디어 앱 클론
- 목표: GitHub에 업로드해 면접관에게 보여줄 수 있는 완성도 있는 앱 제작.
7. 컴퓨터 과학 기초 (선택적이지만 유리)
- 중요성: 알고리즘, 데이터 구조 등은 기술 면접에서 자주 등장하며, 효율적인 코드를 작성하는 데 도움.
- 투자 시간: 50~100시간
- 내용: 배열, 리스트, 스택, 큐, 트리, 정렬/검색 알고리즘 등
- 추천 학습 방법: LeetCode, HackerRank로 문제 풀이 연습.
- 목표: 기본적인 알고리즘 문제를 해결할 수 있는 수준.
총 시간 추정
- 완전 초보자: 400
1,000시간 (하루 23시간 투자 시 약 6개월~1년) - 프로그래밍 경험이 있는 경우: 200
500시간 (36개월) - 집중 학습 시: 하루 6
8시간 투자하면 24개월 내 가능
추가 팁
- 커뮤니티 참여: Stack Overflow, Reddit(iOS Programming 서브레딧)에서 질문하고 답변하며 네트워크를 넓히세요.
- 취업 준비: LinkedIn에 프로필을 최적화하고, iOS 개발자 채용 공고를 분석해 요구 사항에 맞춰 학습 방향 조정.
- 실제 경험: 인턴십, 프리랜서 프로젝트, 오픈소스 기여로 실무 경험 쌓기.
| Storyboard | - UI를 눈으로 보면서 드래그 앤 드롭으로 만들 수 있어 쉬움<br>- 초보자에게 친화적<br>- 빠르게 프로토타입 제작 가능 | - 큰 프로젝트에서는 파일이 복잡해지고 느려질 수 있음<br>- 팀 작업 시 충돌(merge conflict) 발생 쉬움<br>- 코드 재사용성이 떨어짐 |
| SwiftUI | - 코드가 간결하고 직관적<br>- 실시간 미리보기 제공<br>- Apple의 최신 기술이라 미래지향적<br>- 반응형 UI 설계 쉬움 | - iOS 13 이상에서만 동작(구형 디바이스 지원 안 됨)<br>- 아직 학습 자료가 UIKit보다 적음<br>- 복잡한 UI는 구현이 까다로울 수 있음 |
| 코드 (UIKit) | - 완전한 제어 가능, 자유도 높음<br>- 큰 프로젝트 관리에 유리<br>- 코드 재사용성과 유지보수성 좋음 | - UI를 코드로만 작성해야 해서 처음엔 어려움<br>- 시간이 더 걸릴 수 있음<br>- 시각적 피드백 없음(Storyboard처럼 눈으로 못 봄) |
1. nil coalescing 연산자란?
- 기호: ??
- 뜻: "만약 값이 있으면 그 값을 써, 없으면(nil이면) 대신 기본값(default value)을 써"라는 의미야.
- 용도: 옵셔널 값이 nil일 경우를 대비해 안전하게 값을 처리할 때 사용해.
쉽게 말하면, 이 연산자는 옵셔널을 까서 값이 있으면 그걸 주고, 없으면 내가 정한 다른 값을 주는 "보험" 같은 거야.
2. 기본 사용법
문법은 간단해:
- 옵셔널값: Optional<T> 타입의 변수나 상수 (예: String?, Int?).
- 기본값: 옵셔널이 nil일 때 대신 사용할 값. 이건 옵셔널이 아닌 일반 값(T)이어야 해.
예제:
- name은 String? 타입이고, nil이야.
- name ?? "친구"는 "name이 nil이니까 '친구'를 써"라는 뜻.
- 결과적으로 result는 "친구"가 돼.
만약 name에 값이 있으면:
- name이 nil이 아니니까 ?? 뒤의 기본값은 무시되고, 민섭이 result에 들어가.
3. 어떻게 동작하는지 더 깊이 이해하기
nil coalescing 연산자는 사실 내부적으로 이런 로직을 간단히 줄인 거야:
- name != nil: name이 nil이 아닌지 확인.
- name!: nil이 아니면 강제로 언래핑(unwrap)해서 값 꺼냄.
- : 뒤: nil이면 "친구"를 사용.
하지만 ??를 쓰면 훨씬 간결하고 안전해. 강제 언래핑(!)을 직접 안 써도 되니까 코드가 깔끔해지고 실수할 확률도 줄어.
4. 실전 예제
예제 1: 사용자 입력 처리
사용자가 입력한 값이 nil일 수도 있는 상황:
예제 2: 여러 개 연속 사용
??는 여러 번 chaining해서 쓸 수도 있어:
- 왼쪽부터 순서대로 nil이 아닌 첫 번째 값을 가져와. 여기선 third가 nil이 아니니까 "세 번째"가 결과야.
예제 3: 계산된 기본값
기본값은 변수나 계산 결과도 가능해:
5. 주의할 점
- 타입 일치:
- ?? 왼쪽(옵셔널)과 오른쪽(기본값)의 타입이 맞아야 해.
- 예를 들어:
해결하려면:swiftCollapse자동 줄바꿈복사let number: Int? = nil let result = number ?? "문자열" // 오류! Int?와 String은 타입이 달라swiftCollapse자동 줄바꿈복사let result = number ?? 0 // OK! Int?와 Int가 맞음
- 옵셔널 체이닝과 함께 사용:
- ?.와 같이 쓰면 더 강력해져:
swiftCollapse자동 줄바꿈복사struct User { var name: String? } let user: User? = User(name: nil) let name = user?.name ?? "익명" print(name) // 출력: "익명"
- ?.와 같이 쓰면 더 강력해져:
- nil이 아닌 옵셔널:
- ??는 옵셔널 타입에만 쓸 수 있어. 일반 값에 쓰면 컴파일 오류가 나:
swiftCollapse자동 줄바꿈복사let normalValue = "안녕" let result = normalValue ?? "기본" // 오류! normalValue는 옵셔널이 아님
- ??는 옵셔널 타입에만 쓸 수 있어. 일반 값에 쓰면 컴파일 오류가 나:
6. 언제 유용할까?
- 기본값 설정: 사용자 입력, 설정값, API 응답처럼 nil이 올 수 있는 상황에서 기본값을 주고 싶을 때.
- 간결한 코드: if-let이나 guard-let으로 옵셔널을 풀 때보다 코드가 짧고 읽기 쉬워.
- 안전성: 강제 언래핑(!) 대신 안전하게 값을 처리할 수 있어.
7. 정리
- **nil coalescing 연산자(??)**는 옵셔널이 nil일 때 기본값을 제공하는 간단하면서 강력한 도구야.
- 문법: 옵셔널 ?? 기본값
- 핵심: "nil이면 기본값, 아니면 옵셔널의 값을 써".
- 실전에서 자주 쓰이니까 익숙해지면 코딩할 때 엄청 편해질 거야!
swift로 이름 10번 찍기
for _ in 1...10 {
print("LJH")
}

{"boxOfficeResult":{"boxofficeType":"일별 박스오피스","showRange":"20250304~20250304","dailyBoxOfficeList":[{"rnum":"1","rank":"1","rankInten":"0","rankOldAndNew":"OLD","movieCd":"20244821","movieNm":"미키 17","openDt":"2025-02-28","salesAmt":"792920440","salesShare":"65.1","salesInten":"-2305081740","salesChange":"-74.4","salesAcc":"13742880540","audiCnt":"82482","audiInten":"-233629","audiChange":"-73.9","audiAcc":"1385475","scrnCnt":"1882","showCnt":"6935"},{"rnum":"2","rank":"2","rankInten":"1","rankOldAndNew":"OLD","movieCd":"20240614","movieNm":"퇴마록","openDt":"2025-02-21","salesAmt":"74486380","salesShare":"6.1","salesInten":"-197541800","salesChange":"-72.6","salesAcc":"2959023580","audiCnt":"7991","audiInten":"-20124","audiChange":"-71.6","audiAcc":"309396","scrnCnt":"806","showCnt":"1383"},{"rnum":"3","rank":"3","rankInten":"-1","rankOldAndNew":"OLD","movieCd":"20242404","movieNm":"캡틴 아메리카: 브레이브 뉴 월드","openDt":"2025-02-12","salesAmt":"66367060","salesShare":"5.5","salesInten":"-244383040","salesChange":"-78.6","salesAcc":"15767989046","audiCnt":"7212","audiInten":"-25350","audiChange":"-77.9","audiAcc":"1591389","scrnCnt":"598","showCnt":"1317"},{"rnum":"4","rank":"4","rankInten":"1","rankOldAndNew":"OLD","movieCd":"20252719","movieNm":"힘내라 대한민국","openDt":"2025-02-27","salesAmt":"40805000","salesShare":"3.4","salesInten":"-60620600","salesChange":"-59.8","salesAcc":"353578840","audiCnt":"4614","audiInten":"-6167","audiChange":"-57.2","audiAcc":"37618","scrnCnt":"105","showCnt":"208"},{"rnum":"5","rank":"5","rankInten":"-1","rankOldAndNew":"OLD","movieCd":"20234689","movieNm":"괜찮아 괜찮아 괜찮아! ","openDt":"2025-02-26","salesAmt":"37355100","salesShare":"3.1","salesInten":"-60896620","salesChange":"-62","salesAcc":"628767400","audiCnt":"4326","audiInten":"-6470","audiChange":"-59.9","audiAcc":"71473","scrnCnt":"483","showCnt":"729"},{"rnum":"6","rank":"6","rankInten":"0","rankOldAndNew":"NEW","movieCd":"20252975","movieNm":"울프맨","openDt":"2025-03-05","salesAmt":"21140000","salesShare":"1.7","salesInten":"21140000","salesChange":"100","salesAcc":"21140000","audiCnt":"3020","audiInten":"3020","audiChange":"100","audiAcc":"3020","scrnCnt":"17","showCnt":"17"},{"rnum":"7","rank":"7","rankInten":"2","rankOldAndNew":"OLD","movieCd":"20240147","movieNm":"컴플리트 언노운","openDt":"2025-02-26","salesAmt":"19319960","salesShare":"1.6","salesInten":"-36043010","salesChange":"-65.1","salesAcc":"402954980","audiCnt":"2039","audiInten":"-3444","audiChange":"-62.8","audiAcc":"42040","scrnCnt":"322","showCnt":"439"},{"rnum":"8","rank":"8","rankInten":"3","rankOldAndNew":"OLD","movieCd":"20252058","movieNm":"첫 번째 키스","openDt":"2025-02-26","salesAmt":"12298420","salesShare":"1.0","salesInten":"-23519200","salesChange":"-65.7","salesAcc":"274269600","audiCnt":"1714","audiInten":"-2610","audiChange":"-60.4","audiAcc":"34506","scrnCnt":"151","showCnt":"346"},{"rnum":"9","rank":"9","rankInten":"3","rankOldAndNew":"OLD","movieCd":"20244762","movieNm":"서브스턴스","openDt":"2024-12-11","salesAmt":"16281100","salesShare":"1.3","salesInten":"-16838300","salesChange":"-50.8","salesAcc":"5245349480","audiCnt":"1675","audiInten":"-1641","audiChange":"-49.5","audiAcc":"538613","scrnCnt":"156","showCnt":"193"},{"rnum":"10","rank":"10","rankInten":"-3","rankOldAndNew":"OLD","movieCd":"20241093","movieNm":"그 시절, 우리가 좋아했던 소녀","openDt":"2025-02-21","salesAmt":"14610300","salesShare":"1.2","salesInten":"-61518800","salesChange":"-80.8","salesAcc":"1299172600","audiCnt":"1595","audiInten":"-6864","audiChange":"-81.1","audiAcc":"146267","scrnCnt":"293","showCnt":"376"}]}}