iOS프로그래밍실무 (3학년 1학기)

250508 iOS프로그래밍실무 10주차

Z2AE 2025. 5. 8. 16:45

kobis

{"boxOfficeResult":{"boxofficeType":"일별 박스오피스","showRange":"20250507~20250507","dailyBoxOfficeList":[{"rnum":"1","rank":"1","rankInten":"0","rankOldAndNew":"OLD","movieCd":"20232394","movieNm":"야당","openDt":"2025-04-16","salesAmt":"324036920","salesShare":"26.7","salesInten":"-835406620","salesChange":"-72.1","salesAcc":"25557831850","audiCnt":"34587","audiInten":"-86753","audiChange":"-71.5","audiAcc":"2707714","scrnCnt":"971","showCnt":"3243"},{"rnum":"2","rank":"2","rankInten":"1","rankOldAndNew":"OLD","movieCd":"20244883","movieNm":"썬더볼츠*","openDt":"2025-04-30","salesAmt":"175267940","salesShare":"14.4","salesInten":"-506731850","salesChange":"-74.3","salesAcc":"6701739370","audiCnt":"17154","audiInten":"-49459","audiChange":"-74.2","audiAcc":"663981","scrnCnt":"839","showCnt":"2562"},{"rnum":"3","rank":"3","rankInten":"1","rankOldAndNew":"OLD","movieCd":"20218800","movieNm":"거룩한 밤: 데몬 헌터스","openDt":"2025-04-30","salesAmt":"122054800","salesShare":"10.1","salesInten":"-428055820","salesChange":"-77.8","salesAcc":"6042947340","audiCnt":"13207","audiInten":"-43926","audiChange":"-76.9","audiAcc":"655358","scrnCnt":"736","showCnt":"1881"},{"rnum":"4","rank":"4","rankInten":"1","rankOldAndNew":"OLD","movieCd":"20240398","movieNm":"파과","openDt":"2025-04-30","salesAmt":"111866060","salesShare":"9.2","salesInten":"-278748260","salesChange":"-71.4","salesAcc":"2614606240","audiCnt":"12216","audiInten":"-26957","audiChange":"-68.8","audiAcc":"277111","scrnCnt":"649","showCnt":"1243"},{"rnum":"5","rank":"5","rankInten":"0","rankOldAndNew":"NEW","movieCd":"20194912","movieNm":"바이러스","openDt":"2025-05-07","salesAmt":"99303100","salesShare":"8.2","salesInten":"99303100","salesChange":"100","salesAcc":"151233100","audiCnt":"11453","audiInten":"11453","audiChange":"100","audiAcc":"17223","scrnCnt":"555","showCnt":"1647"},{"rnum":"6","rank":"6","rankInten":"0","rankOldAndNew":"NEW","movieCd":"20253595","movieNm":"괴수 8호: 미션 리컨","openDt":"2025-05-07","salesAmt":"61846400","salesShare":"5.1","salesInten":"61846400","salesChange":"100","salesAcc":"82587200","audiCnt":"6734","audiInten":"6734","audiChange":"100","audiAcc":"8710","scrnCnt":"465","showCnt":"1056"},{"rnum":"7","rank":"7","rankInten":"-5","rankOldAndNew":"OLD","movieCd":"20253280","movieNm":"A MINECRAFT MOVIE 마인크래프트 무비","openDt":"2025-04-26","salesAmt":"56035390","salesShare":"4.6","salesInten":"-1041707340","salesChange":"-94.9","salesAcc":"10340822300","audiCnt":"6154","audiInten":"-111716","audiChange":"-94.8","audiAcc":"1098382","scrnCnt":"522","showCnt":"818"},{"rnum":"8","rank":"8","rankInten":"0","rankOldAndNew":"NEW","movieCd":"20244971","movieNm":"기동전사 건담 역습의 샤아","openDt":"2025-05-07","salesAmt":"39826900","salesShare":"3.3","salesInten":"39826900","salesChange":"100","salesAcc":"39826900","audiCnt":"4493","audiInten":"4493","audiChange":"100","audiAcc":"4493","scrnCnt":"94","showCnt":"231"},{"rnum":"9","rank":"9","rankInten":"1","rankOldAndNew":"OLD","movieCd":"20246318","movieNm":"해피엔드","openDt":"2025-04-30","salesAmt":"33111300","salesShare":"2.7","salesInten":"-13045200","salesChange":"-28.3","salesAcc":"388789060","audiCnt":"3513","audiInten":"-1137","audiChange":"-24.5","audiAcc":"40068","scrnCnt":"137","showCnt":"182"},{"rnum":"10","rank":"10","rankInten":"0","rankOldAndNew":"NEW","movieCd":"20254240","movieNm":"에이티즈 월드 투어 [투워즈 더 라이트 : 윌 투 파워] 인 시네마
","openDt":"2025-05-07","salesAmt":"77375000","salesShare":"6.4","salesInten":"77375000","salesChange":"100","salesAcc":"77375000","audiCnt":"3095","audiInten":"3095","audiChange":"100","audiAcc":"3095","scrnCnt":"64","showCnt":"109"}]}}

해당 코드를 code beautify 사이트에서 보기 쉽게 변형할 수 있다.

 

Constraints 설정방법

override func viewDidLoad() {
        super.viewDidLoad()
        table.dataSource = self
        table.delegate = self
        // Do any additional setup after loading the view.
    }

이 코드가 무슨뜻일까?

이 코드는 iOS 앱에서 화면이 처음 로드될 때 실행되는 함수

override func viewDidLoad() { super.viewDidLoad()​
  • viewDidLoad()는 뷰(화면)가 메모리에 올라왔을 때 호출되는 함수입니다.
  • override는 부모 클래스의 기능을 "덮어쓴다"는 뜻입니다.
  • super.viewDidLoad()는 부모 클래스의 기본 동작도 함께 실행하라는 의미입니다.
table.dataSource = self
table.delegate = self
  • 이 두 줄은 table이라는 테이블 뷰가 데이터를 어디서 가져올지(dataSource)와, 사용자 행동(예: 선택했을 때)을 누가 처리할지(delegate)를 이 클래스(self)가 맡겠다는 뜻입니다.
 

요약:
"화면이 처음 열릴 때 테이블 뷰에 데이터를 보여주고, 사용자 행동을 처리할 수 있게 설정하는 부분"입니다.

 

TableView Cell의 이름을 바꾸는 방법

label에 constraint 지정

함수의 자료형이 들어가는 것을 알 수 있다.

여기서 enter을 누르면 -> 자동으로 후행 클로저 방식으로 바뀜

오늘 학습한 모든 소스

//
//  ViewController.swift
//  MovieLSY
//
//  Created by 소프트웨어컴퓨터 on 2025/05/08.
//

import UIKit
let name = ["야당1", "야당2", "야당3", "야당4", "야당5"]
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    @IBOutlet weak var table: UITableView!
    let movieURL = "https://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=6de52ab1ed6f1db239a29aadddf581d8&targetDt=20250507"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        table.dataSource = self
        table.delegate = self
        getData()
    }
    
    func getData() {
        guard let url = URL(string: movieURL) else{ return }
        let session = URLSession(configuration: .default)
        let task = session.dataTask(with: url) { data, response, error in
            if error != nil {
                print(error!)
                return
            }
            guard let JSONdata = data else { return }
            let dataString = String(data: JSONdata, encoding: .utf8)
            print(dataString!)
        }
        task.resume()
    }
    	
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 5
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath) as! MyTableViewCell
        cell.movieName.text = name[indexPath.row]
        //print(indexPath.description, separator: " ", terminator: " ")
        return cell
        
    }
    func numberOfSections(in tableView: UITableView) -> Int {
        return 3
    }
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        //print(indexPath.description)
    }

}

 

//
//  MyTableViewCell.swift
//  MovieLSY
//
//  Created by 소프트웨어컴퓨터 on 2025/05/08.
//

import UIKit

class MyTableViewCell: UITableViewCell {
    @IBOutlet weak var movieName: UILabel!
    
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

 

방법 1

퀵타입 (quicktype) : JSON 데이터의 데이터 모델 만들기

방법 2 : chat gpt

이 JSON 데이터를 쉽게 파싱할 수 있도록 Codable을 따르는 Swift 구조체(MovieData)를 만들어드릴게요.

 
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 
}

🔍 사용 예시 (JSON 파싱)

if let data = jsonDataFromAPI { 
// Data 타입의 JSON 응답 
    do { 
        let decoder = JSONDecoder() 
        let movieData = try decoder.decode(MovieData.self, from: data) 
        print(movieData.boxOfficeResult.dailyBoxOfficeList) 
    } catch { 
    	print("파싱 실패: \(error)") 
    } 
}

대부분의 값이 "문자열"로 되어 있어서 모두 String 타입으로 설정했습니다.
만약 일부 데이터를 Int나 Double로 다루고 싶으면 타입을 바꾸고 custom decoding이 필요합니다.

정수로 다루고 싶은 항목 있으면 말씀해 주세요. 숫자 변환 구조도 만들어 드릴게요.

 

출처 : 한성현 교수님 수업자료

 

MovieLSY.zip
0.04MB