본문 바로가기

iOS

iOS_3grade - 1주차

이미지는 프로그래밍 언어 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개만 꼽으면?

  1. 옵셔널
  2. 구조체/프로토콜
  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

  1. Optional
  2. Struct vs Class
  3. ARC
  4. weak vs unowned
  5. 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()

📌 정리 – 실무에서 가장 많이 쓰는 순서

  1. guard let
  2. if let
  3. ??
  4. Optional chaining
  5. 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 기반 (네가 지금 배우는 방식)

📌 흐름

  1. 서버에서 API 호출
  2. JSON 파싱
  3. JSP에 전달
  4. 화면에 출력

🔹 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으로 확장


🔥 진짜 실전 구조 (중요)

실무에서는:

  1. 매일 새벽 API 자동 호출
  2. DB에 저장
  3. 사용자는 DB 조회
  4. 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