
이미지는 프로그래밍 언어 Swift의 기본 정보를 정리한 표
1️⃣ Swift란?
- 애플이 만든 프로그래밍 언어
- iPhone, iPad, Mac 앱을 만들 때 주로 사용
- 문법이 비교적 간결하고 안전성이 높음
2️⃣ 주요 특징
✔ 멀티 패러다임 언어
여러 스타일을 지원합니다:
- 객체지향(Object-Oriented)
- 함수형(Functional)
- 프로토콜 지향(Protocol-Oriented)
- 명령형(Imperative)
- 동시성(Concurrent) 등
즉, 다양한 방식으로 프로그램을 작성할 수 있습니다.
✔ 등장 시기
- 2014년 6월 2일 처음 발표
✔ 최신 버전
- 안정 버전: 6.2.3 (2025년 12월 기준 표기)
- 미리보기 버전: 6.2
✔ 타입 시스템
- 정적 타입(Static) → 컴파일 시 타입 검사
- 강한 타입(Strong typing)
- 타입 추론(Inferred) → 타입을 자동으로 유추해줌
예:
let number = 10 // Int를 자동 추론
✔ 지원 운영체제
- macOS
- iOS
- iPadOS
- tvOS
- watchOS
- Linux
- Windows
- Android
✔ 라이선스
- Swift 2.2 이후부터는 Apache License 2.0 (오픈소스)
✔ 확장자
- .swift
3️⃣ 어디에 쓰이나요?
- iPhone 앱 개발
- iPad 앱 개발
- Mac 프로그램 개발
- 서버 개발 (Swift on Server)
- 일부 Android/Linux 개발
4️⃣ 한 줄 요약
Swift는 애플 생태계 앱 개발을 위한 현대적이고 안전한 프로그래밍 언어
Swift에서 가장 중요한 문법 10개를 입문 → 실전 기준으로 중요도 순서대로 정리
1️⃣ 변수와 상수 (var, let)
가장 기본이자 필수
var name = "Tom" // 변수 (변경 가능)
let age = 20 // 상수 (변경 불가)
- let을 우선적으로 사용하는 것이 좋은 습관
2️⃣ 데이터 타입 & 타입 추론
Swift는 정적 타입 언어
let number: Int = 10
let pi = 3.14 // Double로 자동 추론
주요 타입:
- Int
- Double
- String
- Bool
3️⃣ 조건문 (if, switch)
앱 로직의 핵심
if age >= 20 {
print("성인")
} else {
print("미성년자")
}
switch number {
case 1:
print("one")
default:
print("other")
}
※ Swift의 switch는 매우 강력함
4️⃣ 반복문 (for, while)
for i in 1...5 {
print(i)
}
while true {
break
}
5️⃣ 함수 (func)
코드 재사용의 핵심
func greet(name: String) -> String {
return "Hello \(name)"
}
6️⃣ 옵셔널 (Optional)
Swift에서 가장 중요한 개념
값이 없을 수 있는 경우를 안전하게 처리
var nickname: String? = nil
옵셔널 바인딩:
if let name = nickname {
print(name)
}
7️⃣ 클래스 & 구조체 (class, struct)
객체 모델의 핵심
struct Person {
var name: String
var age: Int
}
class Dog {
var name = ""
}
✔ Swift에서는 struct 사용이 매우 중요함
8️⃣ 프로토콜 (protocol)
Swift 철학의 핵심 (Protocol-Oriented Programming)
protocol Drivable {
func drive()
}
9️⃣ 클로저 (Closure)
비동기 처리, UI, 정렬 등에서 필수
let add = { (a: Int, b: Int) -> Int in
return a + b
}
간단형:
numbers.sorted { $0 < $1 }
🔟 열거형 (enum)
Swift에서 매우 강력함
enum Direction {
case north
case south
case east
case west
}
연관값도 가능:
enum Result {
case success(String)
case failure(Error)
}
🎯 정리 – 진짜 핵심 3개만 꼽으면?
- 옵셔널
- 구조체/프로토콜
- 클로저
이 3개가 Swift다운 코드를 만드는 핵심
iOS 신입 개발자 면접에서 자주 나오는 Swift 문법 질문을
👉 “면접에서 바로 말하기 좋은 한 문장 답변” 형태로 정리
1️⃣ Optional이란?
Q: Optional이 무엇인가요?
A: Optional은 값이 있을 수도 있고 없을 수도(nil) 있는 타입을 명시적으로 표현하는 Swift의 안전 장치입니다.
2️⃣ Optional Binding이란?
Q: Optional Binding은 무엇인가요?
A: Optional Binding은 if let이나 guard let을 사용해 Optional 값을 안전하게 추출하는 방법입니다.
3️⃣ guard let과 if let의 차이?
Q: guard let과 if let의 차이는 무엇인가요?
A: guard let은 조건이 실패하면 반드시 함수가 종료되어 가독성과 안전성이 높고, if let은 조건 범위 안에서만 값을 사용합니다.
4️⃣ Struct와 Class의 차이?
Q: Struct와 Class의 가장 큰 차이점은 무엇인가요?
A: Struct는 값 타입이고 Class는 참조 타입이라는 점이 가장 큰 차이입니다.
5️⃣ 값 타입과 참조 타입 차이?
Q: 값 타입과 참조 타입의 차이는 무엇인가요?
A: 값 타입은 복사되어 전달되고 참조 타입은 메모리 주소를 공유합니다.
6️⃣ ARC란?
Q: ARC는 무엇인가요?
A: ARC는 Automatic Reference Counting으로, 참조 타입 객체의 메모리를 자동으로 관리하는 시스템입니다.
7️⃣ weak와 unowned 차이?
Q: weak와 unowned의 차이는 무엇인가요?
A: weak는 Optional이며 자동으로 nil이 될 수 있고, unowned는 Optional이 아니며 nil이 되지 않는다고 가정합니다.
8️⃣ Protocol이란?
Q: Protocol이 무엇인가요?
A: Protocol은 클래스, 구조체, 열거형이 따라야 할 속성과 메서드의 청사진입니다.
9️⃣ Extension이란?
Q: Extension은 무엇인가요?
A: Extension은 기존 타입의 기능을 원본 수정 없이 확장하는 기능입니다.
🔟 Closure란?
Q: Closure란 무엇인가요?
A: Closure는 이름 없이 전달하거나 저장할 수 있는 실행 가능한 코드 블록입니다.
1️⃣1️⃣ escaping 클로저란?
Q: escaping 클로저는 무엇인가요?
A: 함수 실행이 끝난 뒤에도 실행될 수 있는 클로저를 escaping 클로저라고 합니다.
1️⃣2️⃣ @State와 @Binding 차이? (SwiftUI)
Q: @State와 @Binding의 차이는 무엇인가요?
A: @State는 뷰 내부 상태를 관리하고, @Binding은 부모 뷰의 상태를 참조합니다.
1️⃣3️⃣ Any와 AnyObject 차이?
Q: Any와 AnyObject의 차이는 무엇인가요?
A: Any는 모든 타입을 담을 수 있고, AnyObject는 클래스 타입만 담을 수 있습니다.
1️⃣4️⃣ defer란?
Q: defer는 무엇인가요?
A: defer는 현재 스코프가 종료되기 직전에 반드시 실행되는 코드입니다.
1️⃣5️⃣ 동시성에서 async/await이란?
Q: async/await은 무엇인가요?
A: async/await은 비동기 코드를 동기 코드처럼 읽기 쉽게 작성할 수 있게 해주는 Swift의 동시성 문법입니다.
🎯 실제 면접에서 가장 많이 나오는 TOP 5
- Optional
- Struct vs Class
- ARC
- weak vs unowned
- Closure
Swift에서 Optional을 언래핑(Unwrapping)하는 모든 방법을
👉 실무 + 면접 기준으로 전부 정리 + 예제 포함해서 설명
✅ 0️⃣ Optional 기본 개념
var name: String? = "Tom"
String? → 값이 있을 수도 있고 nil일 수도 있음
1️⃣ 강제 언래핑 (Force Unwrapping) !
옵셔널 뒤에 !를 붙여 바로 꺼냄
var name: String? = "Tom"
print(name!) // "Tom"
⚠️ 단점: 값이 nil이면 런타임 크래시
var name: String? = nil
print(name!) // 💥 crash
👉 확실히 nil이 아닐 때만 사용
2️⃣ Optional Binding – if let
가장 많이 사용하는 안전한 방법
var name: String? = "Tom"
if let unwrappedName = name {
print(unwrappedName)
}
3️⃣ Optional Binding – guard let
실무에서 더 선호됨 (조기 종료)
func printName(_ name: String?) {
guard let name = name else {
print("nil 입니다")
return
}
print(name)
}
👉 가독성 좋고 중첩을 줄임
4️⃣ Nil-Coalescing Operator ??
nil이면 기본값 사용
var name: String? = nil
print(name ?? "Guest") // Guest
👉 실무에서 매우 많이 사용
5️⃣ Optional Chaining ?
옵셔널 내부 속성에 안전하게 접근
class Person {
var pet: Dog?
}
class Dog {
var name = "Coco"
}
let person = Person()
print(person.pet?.name) // nil (크래시 X)
6️⃣ Implicitly Unwrapped Optional !
선언 시 자동 언래핑
var name: String! = "Tom"
print(name) // 자동 언래핑
⚠️ 내부적으로는 Optional이므로 nil이면 크래시
👉 IBOutlet, 초기화 후 항상 값이 있는 경우 사용
7️⃣ Pattern Matching (if case let)
switch나 case 문에서 사용
let name: String? = "Tom"
if case let unwrappedName? = name {
print(unwrappedName)
}
8️⃣ switch 문으로 언래핑
let name: String? = "Tom"
switch name {
case .some(let value):
print(value)
case .none:
print("nil")
}
9️⃣ map()
Optional 내부 값을 변환할 때
let number: Int? = 10
let doubled = number.map { $0 * 2 }
print(doubled) // Optional(20)
🔟 flatMap()
Optional 중첩 제거
let number: Int? = 10
let result = number.flatMap { Optional($0 * 2) }
👉 Optional(Optional()) 방지
1️⃣1️⃣ try? (에러 → Optional 변환)
에러 발생 시 nil 반환
func throwingFunction() throws -> String {
return "Success"
}
let result = try? throwingFunction()
📌 정리 – 실무에서 가장 많이 쓰는 순서
- guard let
- if let
- ??
- Optional chaining
- map / flatMap

https://www.kobis.or.kr/kobisopenapi/homepg/main/main.do
영화진흥위원회 오픈API
OPEN API 서비스 영화진흥위원회 영화관입장권통합전산망에서 제공하는 오픈API 서비스로 더욱 풍요롭고 편안한 영화 서비스를 즐겨보세요.
www.kobis.or.kr
json 형식으로 요청한 데이터



Code Beautify 를 이용하여 code나 트리 형식 등 다양한 형식으로 json 파일을 편하게 볼 수 있음 - json 파싱

📌 전체 구조 설명
{
"boxOfficeResult": { ... }
}
- boxOfficeResult → 박스오피스 결과 전체 묶음
📊 기본 정보
항목의미
| boxofficeType | 일별 / 주간 / 월간 중 어떤 데이터인지 |
| showRange | 조회한 날짜 범위 |
여기서는:
- "일별 박스오피스"
- "20260302~20260302" → 2026년 3월 2일 하루 데이터
🎬 dailyBoxOfficeList 안의 영화 정보
이 배열 안에 순위별 영화 정보가 들어있음.
지금 보여준 건 1위 영화 데이터야.
🎥 영화 기본 정보
필드의미
| rank | 현재 순위 |
| rankInten | 전날 대비 순위 변동 |
| rankOldAndNew | NEW(신작) / OLD(기존작) |
| movieNm | 영화 제목 |
| openDt | 개봉일 |
👉 지금 데이터는
"왕과 사는 남자"가 1위이고, 순위 변동 없음(0), 기존작(OLD)
💰 매출 관련
필드의미
| salesAmt | 하루 매출액 |
| salesShare | 전체 매출 중 점유율(%) |
| salesInten | 전날 대비 매출 증감액 |
| salesChange | 전날 대비 증감률 |
| salesAcc | 누적 매출 |
📌 해석하면:
- 하루 매출: 70억 3천만원
- 점유율: 83.4%
- 누적 매출: 약 887억 원
- 전날보다 12.2% 감소
👥 관객수 관련
필드의미
| audiCnt | 하루 관객 수 |
| audiInten | 전날 대비 관객 증감 |
| audiChange | 증감률 |
| audiAcc | 누적 관객 수 |
📌 해석:
- 하루 관객: 728,972명
- 누적 관객: 9,213,389명
- 전날보다 8만 8천명 감소
🏢 상영 정보
필드의미
| scrnCnt | 상영 스크린 수 |
| showCnt | 상영 횟수 |
👉 2,150개 스크린에서
👉 하루 9,322번 상영됨
이 JSON 데이터를 Swift(iOS)랑 Java(서버/안드로이드)에서 어떻게 활용하는지 핵심만 깔끔하게 설명해줄게.
✅ 1️⃣ Swift에서 활용 방법 (iOS)
Swift에서는 보통:
📡 API 호출 → JSON 받기 → Codable로 디코딩 → 화면에 출력
이 흐름이야.
🔹 1단계: JSON에 맞는 모델 만들기
struct BoxOfficeResponse: Codable {
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
}
👉 JSON 구조랑 똑같이 만들어야 함
🔹 2단계: API 호출
let url = URL(string: "API_URL")!
URLSession.shared.dataTask(with: url) { data, response, error in
if let data = data {
do {
let result = try JSONDecoder().decode(BoxOfficeResponse.self, from: data)
let firstMovie = result.boxOfficeResult.dailyBoxOfficeList.first
print(firstMovie?.movieNm ?? "")
} catch {
print("디코딩 실패")
}
}
}.resume()
🔹 실제 활용 예
- UITableView에 순위 리스트 뿌리기
- 1위 영화 크게 배너로 보여주기
- 매출 그래프 그리기
- 누적 관객수 1000만 돌파 시 알림
👉 즉, iOS 앱 화면에 박스오피스 앱 만들 때 사용
✅ 2️⃣ Java에서 활용 방법
Java는 두 가지 상황이 있음:
1️⃣ Spring 서버에서 API 받아서 가공
2️⃣ 안드로이드 앱에서 사용
📌 (1) Spring 서버에서 사용
보통 RestTemplate 또는 WebClient 사용
🔹 DTO 클래스 만들기
public class BoxOfficeResponse {
private BoxOfficeResult boxOfficeResult;
}
public class BoxOfficeResult {
private String boxofficeType;
private String showRange;
private List<DailyBoxOffice> dailyBoxOfficeList;
}
public class DailyBoxOffice {
private String rank;
private String movieNm;
private String salesAmt;
}
🔹 API 호출
RestTemplate restTemplate = new RestTemplate();
BoxOfficeResponse response =
restTemplate.getForObject(API_URL, BoxOfficeResponse.class);
System.out.println(
response.getBoxOfficeResult()
.getDailyBoxOfficeList()
.get(0)
.getMovieNm()
);
🔥 서버에서 이렇게 활용 가능
- DB에 저장
- 특정 날짜 비교 분석
- 박스오피스 통계 API 재가공해서 프론트에 제공
- JSP 페이지에 뿌리기
📌 (2) 안드로이드(Java)에서 사용
보통:
- Retrofit
- Gson
사용함
🔹 Retrofit 예시
@GET("boxoffice")
Call<BoxOfficeResponse> getBoxOffice();
🚀 Swift vs Java 차이
구분SwiftJava
| JSON 변환 | Codable 자동 | 보통 Jackson/Gson 필요 |
| 주 사용 위치 | iOS 앱 | 서버, 안드로이드 |
| 코드 간결성 | 더 짧음 | 상대적으로 길음 |
🎯 정리
이 JSON은
- 📱 Swift → 영화 앱 만들 때
- 🌐 Java(Spring) → 서버에서 데이터 가공
- 🤖 Android(Java) → 모바일 앱
이렇게 활용됨.
이걸로 프로젝트 만든다면 어떻게 웹에서 쓰는지 현실적인 구조로 설명
🎬 박스오피스 웹 프로젝트 만든다고 가정하자
예시 프로젝트:
📊 "실시간 한국 박스오피스 웹사이트"
✅ 전체 구조 (웹 프로젝트 기본 흐름)
[영진위 API]
↓
[내 서버 (Spring or JSP)]
↓
[DB 저장 (선택)]
↓
[Controller]
↓
[JSP / HTML / React 화면]
1️⃣ 방법 A — JSP/Servlet 기반 (네가 지금 배우는 방식)
📌 흐름
- 서버에서 API 호출
- JSON 파싱
- JSP에 전달
- 화면에 출력
🔹 1단계: Servlet에서 API 호출
URL url = new URL("API주소");
BufferedReader br = new BufferedReader(
new InputStreamReader(url.openStream())
);
String line;
StringBuilder sb = new StringBuilder();
while((line = br.readLine()) != null) {
sb.append(line);
}
String jsonData = sb.toString();
🔹 2단계: JSON 파싱 (org.json 사용 예)
JSONObject obj = new JSONObject(jsonData);
JSONObject result = obj.getJSONObject("boxOfficeResult");
JSONArray list = result.getJSONArray("dailyBoxOfficeList");
JSONObject firstMovie = list.getJSONObject(0);
String movieName = firstMovie.getString("movieNm");
🔹 3단계: JSP로 전달
request.setAttribute("movieName", movieName);
request.getRequestDispatcher("boxoffice.jsp").forward(request, response);
🔹 4단계: JSP에서 출력
<h1>오늘의 1위 영화: ${movieName}</h1>
👉 이렇게 하면 웹페이지에
오늘의 1위 영화: 왕과 사는 남자
가 뜸.
2️⃣ 방법 B — Spring Boot 프로젝트
요즘은 이게 더 실무 스타일임.
📌 구조
Controller → Service → API 호출 → JSON → DTO → 화면
🔹 Controller
@GetMapping("/boxoffice")
public String boxoffice(Model model) {
List<DailyBoxOffice> list = service.getBoxOffice();
model.addAttribute("movies", list);
return "boxoffice";
}
🔹 Thymeleaf 화면
<tr th:each="movie : ${movies}">
<td th:text="${movie.rank}"></td>
<td th:text="${movie.movieNm}"></td>
<td th:text="${movie.audiCnt}"></td>
</tr>
3️⃣ 방법 C — 프론트에서 직접 호출 (JS 사용)
서버 없이 JavaScript로 바로 호출 가능
fetch("API주소")
.then(res => res.json())
.then(data => {
console.log(data.boxOfficeResult.dailyBoxOfficeList);
});
👉 단점: API 키 노출됨
👉 그래서 보통 서버 거침
🚀 프로젝트 아이디어 예시
📊 1. 박스오피스 통계 사이트
- 날짜별 검색
- 매출 그래프
- 1000만 돌파 표시
- 전날 대비 상승/하락 색깔 표시
🎥 2. 영화 추천 웹
- 1~5위 영화 자동 추천
- 누적 관객수 기준 인기순
- 장르 API 추가 연동
🏆 3. 관리자 페이지 포함
- DB 저장
- 특정 날짜 비교
- 월간 통계 자동 계산
🎯 너 수준 기준 추천
네가 JSP/Servlet 배우는 중이니까
👉 1단계는 Servlet + JSP로 만들어보는 게 좋음
👉 그 다음에 Spring으로 확장
🔥 진짜 실전 구조 (중요)
실무에서는:
- 매일 새벽 API 자동 호출
- DB에 저장
- 사용자는 DB 조회
- API는 직접 안 건드림
이게 정석임.
💡 한 줄 요약
이 JSON은
“외부 데이터”를 받아서
“내 웹사이트에서 가공해서 보여주는 재료”
임.
'iOS' 카테고리의 다른 글
| iOS_3grade - 3주차 (1) | 2026.03.17 |
|---|---|
| iOS_3grade - 2주차 (0) | 2026.03.10 |
| iOS_프로젝트 (1) | 2025.12.08 |
| iOS_week13 (1) | 2025.11.24 |
| iOS_week12 (0) | 2025.11.17 |