




주요 내용 요약
- 패러다임(Paradigm)
프로토콜 지향, 객체 지향, 함수형, 명령형, 선언형, 동시성 등 다양한 멀티 패러다임을 지원한다고 표시되어 있습니다. - 설계자(Designed by)
주 설계자는 **Chris Lattner**이며, 그 외 여러 개발자가 참여했고 **Apple Inc.**이 개발을 주도한 것으로 나와 있습니다. - 개발자(Developer)
Apple Inc. 및 오픈소스 기여자들 - 최초 공개(First appeared)
2014년 6월 2일 - 안정 버전(Stable release)
6.2.3 (2025년 12월 12일 기준으로 표시) - 타입 시스템(Typing discipline)
정적(Static), 강한 타입(Strong), 타입 추론(Inferred) - 운영체제(OS)
iOS, macOS, tvOS, watchOS 등 Apple 계열 운영체제뿐 아니라 Linux, Windows, Android도 지원한다고 나와 있습니다. - 라이선스(License)
Apache License 2.0 기반 (초기 버전은 독점 라이선스) - 파일 확장자
.swift, .SWIFT - 영향 관계(Influenced / Influenced by)
Objective-C, Rust, Haskell 등 여러 언어의 영향을 받았고, 반대로 Rust, V(Vlang) 등에 영향을 주었다고 표시되어 있습니다.
Swift 언어의 개요·기술적 특성·역사·라이선스·생태계 정보를 한눈에 보여주는 위키백과 요약 표 화면입니다.
Swift 학습을 “실무 활용 가능 수준”까지 끌어올리는 데 가장 중요한 문법 10가지를 우선순위 기준으로 정리해드리겠습니다.
(기준: 실사용 빈도 + 이해하지 못하면 다음 단계로 못 넘어가는 요소)
1️⃣ 변수와 상수 (var, let)
Swift의 기본 중 기본입니다.
let name = "Tom" // 상수 (값 변경 불가)
- let을 기본값으로 사용하고, 변경이 필요할 때만 var
- Swift는 타입 추론(Type Inference)을 지원합니다.
2️⃣ 옵셔널 (Optional)
Swift의 핵심 철학입니다. nil 안전성을 강제합니다.
값이 없을 수 있는 경우 반드시 ?를 붙입니다.
옵셔널 바인딩
print(nick)
}
3️⃣ 조건문 (if, guard, switch)
특히 guard는 Swift 스타일에서 매우 중요합니다.
return
}
→ Early exit 구조가 Swift 코드의 기본 패턴입니다.
4️⃣ 함수 (Function)
Swift는 함수 중심 언어입니다.
return "Hello \(name)"
}
- 매개변수 타입 필수
- 반환 타입 명시
5️⃣ 클로저 (Closure)
Swift 실무에서 거의 매일 사용합니다.
return a + b
}
간단히 줄이면:
6️⃣ 컬렉션 (Array, Dictionary, Set)
var user = ["name": "Tom", "age": "20"]
반복문과 함께 매우 자주 사용됩니다.
print(number)
}
7️⃣ 구조체 (Struct)
Swift는 Struct 중심 언어입니다. (Class보다 우선)
var name: String
var age: Int
}
값 타입(Value Type)이라는 점이 중요합니다.
8️⃣ 클래스 (Class)
참조 타입(Reference Type)입니다.
var name: String
init(name: String) {
self.name = name
}
}
상속이 필요한 경우 사용합니다.
9️⃣ 프로토콜 (Protocol)
Swift의 핵심 철학 — Protocol-Oriented Programming
func drive()
}
클래스, 구조체 모두 채택 가능:
func drive() {
print("Driving")
}
}
🔟 에러 처리 (do-catch, try)
안전한 코드 작성을 위해 중요합니다.
case invalid
}
func test() throws {
throw MyError.invalid
}
do {
try test()
} catch {
print("Error 발생")
}
📌 중요도 요약 (실무 기준 체감 순위)
- Optional
- Struct
- Protocol
- Closure
- Function
- var/let
- guard
- Collection
- Class
- Error Handling
iOS 신입 개발자 면접을 의사결정 관점에서 정리해 드리겠습니다.
목표: “문법을 아는지”가 아니라
왜 그렇게 설계되었는지 이해하고 있는지를 검증하는 질문에 대비하는 것
아래는 실제 면접에서 자주 등장하는 Swift 문법 중심 질문 10가지 + 모범 답변 구조입니다.
1️⃣ Optional이 무엇이며 왜 필요한가?
❓ 질문 의도
- Swift 철학 이해 여부
- 런타임 크래시 방지 개념 이해
✅ 모범 답변 구조
Optional은 값이 있을 수도 있고 없을 수도 있음을 명시하는 타입입니다.
Swift는 nil 접근으로 인한 런타임 오류를 방지하기 위해 Optional을 도입했습니다.
컴파일 단계에서 안전성을 확보하기 위한 장치입니다.
- 옵셔널 바인딩과 강제 언래핑 차이까지 설명하면 가산점
2️⃣ Struct와 Class의 차이
❓ 질문 의도
- 값 타입 vs 참조 타입 이해
✅ 핵심 답변
Struct는 값 타입이며 복사되어 전달됩니다.
Class는 참조 타입이며 같은 메모리 주소를 공유합니다.
Swift에서는 기본적으로 Struct 사용을 권장합니다.
추가:
- 상속 가능 여부
- ARC 적용 대상은 Class
3️⃣ ARC란 무엇인가?
❓ 질문 의도
- 메모리 관리 이해
✅ 답변
ARC(Automatic Reference Counting)는 참조 타입 인스턴스의 메모리를 자동 관리하는 시스템입니다.
참조 카운트가 0이 되면 메모리를 해제합니다.
추가:
- Strong / Weak / Unowned 차이
4️⃣ strong, weak, unowned 차이
❓ 질문 의도
- 순환참조 해결 능력
✅ 요약 답변
| strong | 기본값, 참조 카운트 증가 |
| weak | 참조 카운트 증가 X, Optional |
| unowned | 참조 카운트 증가 X, Optional 아님 |
5️⃣ Closure에서 self를 명시하는 이유는?
❓ 질문 의도
- 캡처 리스트 이해
- 메모리 누수 개념
✅ 답변
클로저는 외부 변수를 캡처합니다.
self를 강하게 캡처하면 순환 참조가 발생할 수 있으므로
[weak self] 또는 [unowned self]를 사용합니다.
6️⃣ Protocol이 무엇이고 왜 사용하는가?
❓ 질문 의도
- POP(Protocol Oriented Programming) 이해
✅ 답변
Protocol은 특정 기능을 정의하는 청사진입니다.
다형성을 구현하고, 결합도를 낮추기 위해 사용합니다.
추가:
- extension으로 기본 구현 가능
7️⃣ Extension이란?
❓ 질문 의도
- 기능 확장 개념 이해
✅ 답변
기존 타입의 기능을 확장하는 문법입니다.
원본 코드를 수정하지 않고 기능을 추가할 수 있습니다.
func squared() -> Int {
return self * self
}
}
8️⃣ Guard와 If의 차이
❓ 질문 의도
- Swift 코드 스타일 이해
✅ 답변
guard는 조건이 만족되지 않으면 즉시 함수에서 빠져나가는 Early Exit 패턴입니다.
가독성과 안정성을 높이기 위해 사용합니다.
9️⃣ Error Handling 방식 설명
❓ 질문 의도
- Swift의 에러 전파 구조 이해
✅ 답변
Swift는 do-try-catch 구조를 사용합니다.
throws 키워드를 통해 에러 전파를 명시합니다.
🔟 값 타입이 멀티스레드 환경에서 유리한 이유
❓ 질문 의도
- 동시성 이해 수준 확인
✅ 답변
값 타입은 복사되어 전달되므로
여러 스레드에서 동시에 접근해도 데이터 충돌 가능성이 낮습니다.
참조 타입은 동기화 처리가 필요합니다.
📌 신입 면접 합격 포인트
면접관이 보는 것:
- 문법 암기 ❌
- 설계 철학 이해 ⭕
- 실제 사용 경험 ⭕⭕
- 메모리/안전성 이해 ⭕⭕⭕ (가장 중요)
🎯 합격 확률을 높이는 전략
면접 답변 구조를 이렇게 가져가십시오:
1️⃣ 정의
2️⃣ 왜 필요한가
3️⃣ 문제 상황 예시
4️⃣ 해결 방식
이 구조로 말하면 신입이어도 중급처럼 보입니다.
iOS 신입 면접 기준으로 Swift Optional 언래핑(Unwrapping)의 모든 주요 방법을 정리해드리겠습니다.
(실무 + 면접에서 실제로 언급되는 방식 기준)
✅ 0️⃣ 전제: Optional이란?
String? → 값이 있을 수도 있고(nil) 없을 수도 있는 타입
1️⃣ 강제 언래핑 (Force Unwrapping) !
✔ 특징
- 값이 nil이면 런타임 크래시
- 가장 위험한 방법
- 면접에서 “지양해야 한다”고 말하는 게 좋음
2️⃣ 옵셔널 바인딩 (Optional Binding) – if let
가장 많이 사용되는 안전한 방법
print(unwrappedName)
}
✔ 특징
- 값이 있을 때만 실행
- 블록 내부에서 non-optional로 사용 가능
3️⃣ 옵셔널 바인딩 – guard let
Early Exit 패턴
return
}
print(unwrappedName)
✔ 특징
- Swift 스타일에서 매우 선호
- 함수 초반에 사용
4️⃣ Nil-Coalescing Operator ??
기본값 제공
✔ 의미
name이 nil이면 "Guest" 사용
5️⃣ Optional Chaining ?.
중첩된 Optional 접근
✔ 특징
- 중간에 nil이 나오면 전체가 nil
- 안전하게 접근 가능
6️⃣ Implicitly Unwrapped Optional ! 타입 선언
✔ 특징
- 사용할 때 자동 언래핑
- 주로 IBOutlet에서 사용
- 내부적으로 Optional
7️⃣ switch 패턴 매칭
case .some(let value):
print(value)
case .none:
print("nil")
}
✔ 특징
- Optional은 enum이기 때문에 가능
- .some, .none
8️⃣ if case let 패턴 매칭
print(value)
}
9️⃣ map 활용
Optional을 함수형으로 처리
✔ 특징
- 값이 있으면 클로저 실행
- nil이면 그대로 nil
🔟 flatMap
Optional 중첩 제거
또는
✔ 특징
- Optional<Optional<T>> → Optional<T>
1️⃣1️⃣ try?
에러를 Optional로 변환
✔ 특징
- 에러 발생 시 nil 반환
1️⃣2️⃣ try!
강제 언래핑과 유사
✔ 특징
- 에러 발생 시 크래시
🎯 면접에서 반드시 말해야 할 핵심 3가지
- Force Unwrapping은 지양
- guard let을 선호
- Optional은 Swift 안전성의 핵심
📌 실무에서 가장 많이 쓰는 순위
- guard let
- if let
- ??
- Optional chaining
- map
💡 한 단계 더 들어가면 가산점
Optional은 enum입니다:
case none
case some(Wrapped)
}
이걸 말하면 합격 확률이 올라갑니다.

영진위 open api
https://www.kobis.or.kr/kobisopenapi/homepg/main/main.do
영화진흥위원회 오픈API
OPEN API 서비스 영화진흥위원회 영화관입장권통합전산망에서 제공하는 오픈API 서비스로 더욱 풍요롭고 편안한 영화 서비스를 즐겨보세요.
www.kobis.or.kr
암호키 (복호화 해서 쓰)
YjczNWQ1Mzk3ZTJiNjIxZGI2ZGRhMTcwMGFlNWJlZWY=
https://kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=자신의키&targetDt=20260228
가져온 데이터

{
"boxOfficeResult": {
"boxofficeType": "일별 박스오피스",
"showRange": "20260302~20260302",
"dailyBoxOfficeList": [
{
"rnum": "1",
"rank": "1",
"rankInten": "0",
"rankOldAndNew": "OLD",
"movieCd": "20242837",
"movieNm": "왕과 사는 남자",
"openDt": "2026-02-04",
"salesAmt": "7031714220",
"salesShare": "83.4",
"salesInten": "-981021880",
"salesChange": "-12.2",
"salesAcc": "88787738910",
"audiCnt": "728972",
"audiInten": "-88230",
"audiChange": "-10.8",
"audiAcc": "9213389",
"scrnCnt": "2150",
"showCnt": "9322"
},
{
"rnum": "2",
"rank": "2",
"rankInten": "0",
"rankOldAndNew": "OLD",
"movieCd": "20241266",
"movieNm": "휴민트",
"openDt": "2026-02-11",
"salesAmt": "415284600",
"salesShare": "4.9",
"salesInten": "-153292180",
"salesChange": "-27",
"salesAcc": "18802244960",
"audiCnt": "41511",
"audiInten": "-13145",
"audiChange": "-24.1",
"audiAcc": "1863684",
"scrnCnt": "754",
"showCnt": "1622"
},
{
"rnum": "3",
"rank": "3",
"rankInten": "0",
"rankOldAndNew": "OLD",
"movieCd": "20256283",
"movieNm": "호퍼스",
"openDt": "2026-03-04",
"salesAmt": "306886650",
"salesShare": "3.6",
"salesInten": "72901400",
"salesChange": "31.2",
"salesAcc": "551482900",
"audiCnt": "29415",
"audiInten": "7230",
"audiChange": "32.6",
"audiAcc": "52411",
"scrnCnt": "538",
"showCnt": "1174"
},
{
"rnum": "4",
"rank": "4",
"rankInten": "0",
"rankOldAndNew": "OLD",
"movieCd": "20247457",
"movieNm": "신의악단",
"openDt": "2025-12-31",
"salesAmt": "109737410",
"salesShare": "1.3",
"salesInten": "10465610",
"salesChange": "10.5",
"salesAcc": "13382035920",
"audiCnt": "11208",
"audiInten": "679",
"audiChange": "6.4",
"audiAcc": "1402944",
"scrnCnt": "286",
"showCnt": "336"
},
{
"rnum": "5",
"rank": "5",
"rankInten": "0",
"rankOldAndNew": "OLD",
"movieCd": "20259583",
"movieNm": "초속 5센티미터",
"openDt": "2026-02-25",
"salesAmt": "82144150",
"salesShare": "1.0",
"salesInten": "-19584890",
"salesChange": "-19.3",
"salesAcc": "642170440",
"audiCnt": "8163",
"audiInten": "-1868",
"audiChange": "-18.6",
"audiAcc": "67750",
"scrnCnt": "487",
"showCnt": "720"
},
{
"rnum": "6",
"rank": "6",
"rankInten": "1",
"rankOldAndNew": "OLD",
"movieCd": "20261181",
"movieNm": "너자 2",
"openDt": "2026-02-25",
"salesAmt": "65029700",
"salesShare": "0.8",
"salesInten": "-7342900",
"salesChange": "-10.1",
"salesAcc": "379668500",
"audiCnt": "6934",
"audiInten": "-315",
"audiChange": "-4.3",
"audiAcc": "41823",
"scrnCnt": "231",
"showCnt": "378"
},
{
"rnum": "7",
"rank": "7",
"rankInten": "-1",
"rankOldAndNew": "OLD",
"movieCd": "20257744",
"movieNm": "28년 후: 뼈의 사원",
"openDt": "2026-02-27",
"salesAmt": "53104160",
"salesShare": "0.6",
"salesInten": "-26861980",
"salesChange": "-33.6",
"salesAcc": "284165090",
"audiCnt": "4978",
"audiInten": "-2522",
"audiChange": "-33.6",
"audiAcc": "26543",
"scrnCnt": "365",
"showCnt": "514"
},
{
"rnum": "8",
"rank": "8",
"rankInten": "0",
"rankOldAndNew": "OLD",
"movieCd": "20250365",
"movieNm": "햄넷",
"openDt": "2026-02-25",
"salesAmt": "44970550",
"salesShare": "0.5",
"salesInten": "1672980",
"salesChange": "3.9",
"salesAcc": "288188560",
"audiCnt": "4601",
"audiInten": "262",
"audiChange": "6",
"audiAcc": "30410",
"scrnCnt": "290",
"showCnt": "337"
},
{
"rnum": "9",
"rank": "9",
"rankInten": "0",
"rankOldAndNew": "OLD",
"movieCd": "20252373",
"movieNm": "넘버원",
"openDt": "2026-02-11",
"salesAmt": "38882300",
"salesShare": "0.5",
"salesInten": "-1653000",
"salesChange": "-4.1",
"salesAcc": "2609582580",
"audiCnt": "3950",
"audiInten": "-230",
"audiChange": "-5.5",
"audiAcc": "272737",
"scrnCnt": "173",
"showCnt": "207"
},
{
"rnum": "10",
"rank": "10",
"rankInten": "0",
"rankOldAndNew": "OLD",
"movieCd": "20261208",
"movieNm": "귀신 부르는 앱: 영",
"openDt": "2026-02-18",
"salesAmt": "29749000",
"salesShare": "0.4",
"salesInten": "-9767800",
"salesChange": "-24.7",
"salesAcc": "911927800",
"audiCnt": "3329",
"audiInten": "-592",
"audiChange": "-15.1",
"audiAcc": "91035",
"scrnCnt": "133",
"showCnt": "168"
}
]
}
}

상황 1️⃣ : 인터넷 API에서 JSON을 받아오는 경우
1. 모델 만들기 (Codable)
JSON 구조에 맞는 Swift 구조체를 정의합니다.
let boxOfficeResult: BoxOfficeResult
}
struct BoxOfficeResult: Codable {
let boxofficeType: String
let showRange: String
let dailyBoxOfficeList: [DailyBoxOffice]
}
struct DailyBoxOffice: Codable {
let rank: String
let movieNm: String
let openDt: String
let salesAmt: String
let audiCnt: String
}
2. URLSession으로 데이터 요청
최신 방식 (async/await)
let url = URL(string: "https://api주소")!
let (data, _) = try await URLSession.shared.data(from: url)
let decoded = try JSONDecoder().decode(BoxOfficeResponse.self, from: data)
return decoded
}
사용:
do {
let result = try await fetchBoxOffice()
print(result.boxOfficeResult.dailyBoxOfficeList)
} catch {
print(error)
}
}
상황 2️⃣ : 로컬 JSON 파일을 읽는 경우
프로젝트에 boxoffice.json 파일을 추가한 뒤:
guard let url = Bundle.main.url(forResource: "boxoffice", withExtension: "json") else { return }
do {
let data = try Data(contentsOf: url)
let decoded = try JSONDecoder().decode(BoxOfficeResponse.self, from: data)
print(decoded)
} catch {
print(error)
}
}
상황 3️⃣ : JSON을 직접 Data로 변환해서 테스트하는 경우
{
"boxOfficeResult": {
"boxofficeType": "일별 박스오피스",
"showRange": "20260302~20260302",
"dailyBoxOfficeList": []
}
}
"""
let data = Data(jsonString.utf8)
let decoded = try JSONDecoder().decode(BoxOfficeResponse.self, from: data)
print(decoded)
핵심 요약
Swift에서 JSON을 가져오는 과정은 항상 동일합니다:
- Data 형태로 받는다
- Codable 모델을 만든다
- JSONDecoder로 decode한다
이 한 줄이 핵심입니다.
Python 개발환경에서 이 JSON 데이터를 가져오는 방법을 단계별로 정리해 드리겠습니다.
상황은 보통 두 가지입니다:
1️⃣ 인터넷 API에서 JSON을 받아오는 경우
2️⃣ 로컬에 있는 JSON 파일을 읽는 경우
1️⃣ API에서 JSON 가져오기 (가장 일반적)
✔ 1단계: requests 설치
✔ 2단계: 코드 작성
url = "https://api주소" # 실제 API 주소 입력
response = requests.get(url)
if response.status_code == 200:
data = response.json() # JSON → Python dict 변환
print(data)
else:
print("요청 실패:", response.status_code)
✔ 특정 값 접근하기
당신이 준 JSON 구조 기준:
daily_list = box_office["dailyBoxOfficeList"]
first_movie = daily_list[0]
print("영화 제목:", first_movie["movieNm"])
print("일일 관객 수:", first_movie["audiCnt"])
Python에서는 JSON이 자동으로 dict + list 구조로 변환됩니다.
2️⃣ 로컬 JSON 파일 읽기
파일 이름이 boxoffice.json이라면:
with open("boxoffice.json", "r", encoding="utf-8") as f:
data = json.load(f)
print(data)
값 접근 방식은 동일합니다.
3️⃣ 구조를 객체처럼 쓰고 싶다면 (선택 사항)
Python에서는 dataclass를 사용할 수도 있습니다.
@dataclass
class Movie:
rank: str
movieNm: str
audiCnt: str
하지만 일반적으로는 dict로 그대로 사용하는 경우가 많습니다.
4️⃣ 실제 실행 환경
개발 환경은 보통:
- VS Code
- PyCharm
- Jupyter Notebook
- 터미널
어디서든 동일하게 동작합니다.
🔎 정리
Python에서 JSON 가져오는 핵심은 단 두 줄입니다:
data = requests.get(url).json()
또는
data = json.load(open("파일명.json"))
좋습니다.
질문을 실행 관점으로 정리해보겠습니다.
목표:
박스오피스 JSON 데이터를 내 홈페이지 메인 화면에 표시하기
적용 방법은 크게 3가지 구조로 나뉩니다.
1️⃣ 가장 단순한 방법 (정적 HTML + JS)
👉 서버 없이, 프론트엔드에서 직접 API 호출
구조
예시 (HTML + JS)
<script>
fetch("https://api주소")
.then(response => response.json())
.then(data => {
const list = data.boxOfficeResult.dailyBoxOfficeList;
const first = list[0];
document.getElementById("boxoffice").innerHTML = `
<h2>${first.movieNm}</h2>
<p>관객수: ${first.audiCnt}명</p>
<p>매출: ${first.salesAmt}원</p>
`;
});
</script>
✔ 장점
- 가장 쉬움
- 서버 코드 필요 없음
❗ 단점
- API 키 노출 위험
- CORS 문제 발생 가능
2️⃣ 추천 방법 (백엔드에서 API 호출 → 프론트에 전달)
👉 Python Flask / Django / Node 등 서버에서 API 호출
구조
Python Flask 예시
1. 서버 코드
import requests
app = Flask(__name__)
@app.route("/")
def home():
url = "https://api주소"
response = requests.get(url)
data = response.json()
movie = data["boxOfficeResult"]["dailyBoxOfficeList"][0]
return render_template("index.html", movie=movie)
if __name__ == "__main__":
app.run(debug=True)
2. HTML 템플릿
<p>관객수: {{ movie.audiCnt }}</p>
<p>매출: {{ movie.salesAmt }}</p>
✔ 장점
- API 키 보호 가능
- 데이터 가공 가능
- 확장성 높음
3️⃣ React / Vue 같은 SPA로 구현
React 예시:
fetch("/api/boxoffice")
.then(res => res.json())
.then(data => setMovie(data[0]));
}, []);
백엔드에서 /api/boxoffice 엔드포인트를 만들어주는 방식입니다.
🎯 어떤 방식을 써야 할까?
| 개인 블로그 | JS fetch |
| 상업 사이트 | 서버 중간 처리 |
| 확장 계획 있음 | 백엔드 + 캐싱 |
💡 실전 팁
박스오피스는 매일 1번만 바뀝니다.
👉 매 요청마다 API 호출 ❌
👉 서버에서 하루 1번 저장 → DB 또는 캐시 사용 ⭕
🚀 현실적인 최적 구조
2. DB에 저장
3. 메인 페이지는 DB 데이터만 읽음
이렇게 하면:
- 속도 빠름
- API 제한 회피
- 트래픽 안정

1️⃣ Optional이란 무엇인가?
값이 있을 수도 있고(nil) 없을 수도 있음을 표현하는 타입입니다.
Swift는 nil 접근으로 인한 런타임 크래시를 막기 위해 Optional을 사용합니다.
2️⃣ Optional을 안전하게 언랩하는 방법은?
- if let
- guard let
- ?? (nil-coalescing)
- Optional chaining (?.)
- switch
- map, flatMap
- try?
3️⃣ guard let과 if let의 차이
- if let → 조건이 참일 때 블록 실행
- guard let → 조건이 거짓이면 즉시 함수 종료 (early exit)
Swift에서는 가독성 때문에 guard를 선호합니다.
4️⃣ struct와 class의 차이
| 값 타입 | 참조 타입 |
| 상속 불가 | 상속 가능 |
| ARC 대상 아님 | ARC 대상 |
| 기본 생성자 자동 생성 | 직접 정의 필요 |
Swift에서는 기본적으로 struct 사용 권장.
5️⃣ Value Type과 Reference Type 차이
- Value Type → 복사되어 전달 (struct, enum)
- Reference Type → 같은 메모리 참조 공유 (class)
멀티스레드 환경에서는 값 타입이 안전합니다.
6️⃣ ARC는 무엇이며 어떻게 동작하는가?
ARC(Automatic Reference Counting)는
참조 타입 인스턴스의 참조 횟수를 추적하여 0이 되면 메모리를 해제합니다.
7️⃣ weak와 unowned의 차이
| Optional | Optional 아님 |
| 값이 nil 될 수 있음 | 항상 값이 있다고 가정 |
| 안전함 | 잘못 쓰면 크래시 |
순환 참조 방지용으로 사용합니다.
8️⃣ closure에서 캡처 리스트가 필요한 이유
클로저는 외부 변수를 강하게 참조합니다.
self를 강하게 잡으면 retain cycle(순환 참조) 발생 가능.
self?.doSomething()
}
9️⃣ escaping closure와 non-escaping closure 차이
- non-escaping → 함수 실행이 끝나기 전에 실행
- escaping → 함수가 끝난 뒤에도 실행됨 (비동기 코드)
🔟 protocol의 역할
기능의 “규약”을 정의합니다.
다형성 구현, 결합도 감소, 테스트 용이성 확보에 사용됩니다.
Swift는 Protocol-Oriented Programming을 지향합니다.
1️⃣1️⃣ delegate 패턴을 왜 사용하는가?
객체 간 1:1 이벤트 전달을 위해 사용합니다.
UI 이벤트 처리에서 매우 많이 사용됩니다.
1️⃣2️⃣ async/await의 장점
- 코드 가독성 향상
- 콜백 지옥 제거
- 에러 처리 통합 가능
- 비동기 흐름을 동기 코드처럼 작성 가능
1️⃣3️⃣ actor란 무엇이며 어떤 역할을 하는가?
Swift Concurrency에서 사용되는 타입으로
데이터 경쟁(Data Race)을 방지합니다.
actor 내부 상태는 동시 접근이 자동으로 보호됩니다.
1️⃣4️⃣ computed property와 stored property 차이
- stored property → 값을 저장
- computed property → 계산된 값을 반환
return firstName + lastName
}
1️⃣5️⃣ Swift에서 enum이 강력한 이유
- 연관값(associated value) 가능
- raw value 가능
- switch에서 exhaustiveness 체크
- Optional도 enum
case success(String)
case failure(Error)
}
🔥 한 줄 요약
이 질문들의 핵심은:
“Swift 문법을 아는가?”가 아니라
“Swift의 설계 철학(안전성, 값 타입, 메모리 관리, 동시성)을 이해하는가?” 입니다.
'computing' 카테고리의 다른 글
| 20251211-android14 (1) | 2025.12.11 |
|---|---|
| 20251127-android13, 그래픽, Empty Views Activity menu해결 (1) | 2025.11.27 |
| javaweb 13 정리 (0) | 2025.11.26 |
| 20251124_iOS12 (0) | 2025.11.24 |
| 20251117 - iOS12 (0) | 2025.11.17 |