영화진흥위원회에서 저의 키값을 발급 받은뒤 어제날짜 기준의 일별 박스오피스 입니다.
Xcode로 새로운 프로젝트를 생성한뒤 table view를 추가
table view를 Add New Constraints를 이용하여 화면을 가득채웁니다.
table view를 storyboard와 소스 연결
필수 매서드를 작성하지 않아 오류가 생겼습니다.
table.delegate = self는 iOS 개발에서 UITableView나 UICollectionView 등과 같이 "대리자(delegate)" 패턴을 사용하는 컴포넌트에서 자주 등장하는 코드입니다.
아주 쉽게 풀어보면 아래와 같습니다.
delegate는 "심부름꾼을 정하는 것"
- delegate는 어떤 일이 생겼을 때 대신 처리해줄 사람(객체) 을 지정하는 역할입니다.
self는 지금 이 코드를 작성하고 있는 클래스 자신
- 예를 들어 지금 코드가 ViewController 안에 있다면 self는 그 ViewController를 의미합니다.
예시로 쉽게 설명해볼게요
table.delegate = self
이 말은 결국:
📌 "이 테이블에서 발생하는 일(예: 셀 선택, 스크롤 등)을 지금 이 클래스(self)가 대신 처리할게!"
실제로 어떤 일을 처리할 수 있게 되나요?
이렇게 delegate를 설정하면 아래와 같은 메서드를 이 클래스 안에서 정의해서 사용할 수 있습니다:
// 사용자가 셀을 탭했을 때 실행됨 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { print("사용자가 \(indexPath.row)번째 셀을 눌렀어요") }
이런 식으로, 테이블의 행동에 반응할 수 있도록 해주는 것이 바로 delegate의 역할입니다.
요약
- table.delegate = self는
"테이블의 여러 동작(클릭, 스크롤 등)을 내가 직접 처리할게!"라는 뜻입니다. - 이걸 통해 UITableViewDelegate 프로토콜의 메서드를 구현할 수 있게 됩니다.
table view cell 추가
table view cell의 이름을 myCell로 변경
myCell과 MyTableViewCell를 연결
Label 추가
Label를 movieName라는 명칭으로 MyTableViewCell 연결
//
// ViewController.swift
// Movieksh
//
// Created by comsoft on 2025/05/08.
//
import UIKit
// 영화 이름들을 담고 있는 문자열 배열입니다.
let name = ["야당", "썬더볼츠", "거룩한 밤 : 데몬즈 헌터", "파과", "바이러스"]
// ViewController 클래스 정의입니다.
// UITableViewDelegate, UITableViewDataSource 프로토콜을 채택하여 테이블 뷰의 동작을 제어합니다.
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
// 스토리보드에서 연결된 테이블 뷰 IBOutlet 변수입니다.
@IBOutlet weak var table: UITableView!
// 뷰가 처음 로드될 때 실행되는 메서드입니다.
override func viewDidLoad() {
super.viewDidLoad()
// 테이블 뷰에 데이터 공급자(self)를 설정합니다.
table.dataSource = self
// 테이블 뷰에 대리자(self)를 설정합니다.
// 즉, 셀 선택 등의 이벤트 처리를 이 클래스(ViewController)에서 하겠다는 의미입니다.
table.delegate = self
}
// 테이블 뷰에 몇 개의 행(row)을 보여줄지 설정하는 메서드입니다.
// section 하나당 5개의 행을 보여줍니다.
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 5
}
// 각 셀에 어떤 데이터를 보여줄지 설정하는 메서드입니다.
// indexPath.row는 현재 행 번호를 나타냅니다.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// 재사용 가능한 셀을 가져옵니다. "myCell"은 스토리보드에서 지정한 셀 식별자입니다.
let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath) as! MyTableViewCell
// 셀에 영화 이름을 표시합니다.
cell.movieName.text = name[indexPath.row]
// 셀을 반환하여 테이블 뷰에 보여줍니다.
return cell
}
// 사용자가 셀을 선택했을 때 호출되는 메서드입니다.
// 선택한 셀의 위치(indexPath)를 콘솔에 출력합니다.
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print(indexPath.description)
}
// 테이블 뷰에 몇 개의 section(구역)을 보여줄지 설정하는 메서드입니다.
// 여기서는 총 6개의 섹션이 생성됩니다.
func numberOfSections(in tableView: UITableView) -> Int {
return 6
}
}
영화진흥위원회의 자신의 키값을 넣은 URL 연결
영화진흥위원회의 자료를 파싱을 쉽게 하기 위한 MovieData형 구조체를 Swift로
import Foundation
// 최상위 구조
struct MovieData: Codable {
let boxOfficeResult: BoxOfficeResult
}
// 박스오피스 결과 구조
struct BoxOfficeResult: Codable {
let boxofficeType: String
let showRange: String
let dailyBoxOfficeList: [DailyBoxOffice]
}
// 박스오피스에 포함된 영화 정보 구조
struct DailyBoxOffice: Codable {
let rnum: String
let rank: String
let rankInten: String
let rankOldAndNew: String
let movieCd: String
let movieNm: String
let openDt: String
let salesAmt: String
let salesShare: String
let salesInten: String
let salesChange: String
let salesAcc: String
let audiCnt: String
let audiInten: String
let audiChange: String
let audiAcc: String
let scrnCnt: String
let showCnt: String
}
사용예시
let jsonData = ... // 서버에서 받은 JSON 데이터(Data 타입)
do {
let decoded = try JSONDecoder().decode(MovieData.self, from: jsonData)
let movies = decoded.boxOfficeResult.dailyBoxOfficeList
for movie in movies {
print(movie.movieNm) // 영화 제목 출력
}
} catch {
print("디코딩 실패: \(error)")
}