파이썬 설치에 대해서 알아볼게요

 

구글에서 python 을 검색합니다. 

 

welcome to python.org 를 클릭하시면 홈페이지로 이동합니다. 

 

(설치 말고 환경변수 설정 방법만 궁금하신 분은 아래 링크를 참고해주세요.)

파이썬 환경설정 방법 링크

 

 

 

Dowloads를 클릭 하시거나 Dowloads에 마우스를 가져가서 바로 Python 3.7.3을 선택하셔도 됩니다.

 

버전은 변경될 수 있지만 설치하는 것은 동일합니다.

 

 

 

 

 

Download Python 을 클릭하시면 아마 32비트로 자동으로 설치됩니다. 

 

쉽게 설치하시고 싶으시면 아래 다운 버튼만 클릭하시면 됩니다. 

 

 

다운된 경로에 가시면 파이썬 설치 파일을 확인하실 수 있습니다.

 

 

64비트 다운 방법이 궁금하시는 분들은 아래 더보기 버튼을 클릭하세요

...더보기

여기서부터는 64비트 다운 방법입니다. 무시하셔도 됩니다. 

 

windows를 클릭하세요

 

 

 

중간에 Windows X86-64 executable installer를 선택하시면 다운됩니다.

 

 

 

다운된 파일 확인이 가능합니다. 

 

 

여기까지는 64비트 다운 방법이였습니다.

 

 

 

다운된 파일을 더블 클릭하시면 아래 화면이 나타납니다.

 

 

1) 가장 쉽게 설치하시고 싶으신 분

화면 제일 밑에 Add Python 3.7 to PATH만 선택하시고

Install Now를 클릭하시면 설치가 진행됩니다.

 

2) 권장하는 방법( 향후 파이썬 실행할 때 환경변수 문제나 실행이 잘 되게 하고 싶으신 경우)

화면 제일 밑에 Add Python 3.7 to PATH 선택하시고

Customize installation 을 클릭합니다.  

 

 

 

** 팝업으로 이 앱이 디바이스를 변경하려고 합니다 
허용하시겠습니까?  화면이 뜰 경우에는 예 클릭 하시면 됩니다.

 

 

 

 

이 화면은 NEXT 하시면 됩니다.

 

 

 

Add python to environment varibales를 클릭된 것을 확인하세요

( add PATH 선택하셨으면 클릭되어 있을 것입니다.)

 

Customize install location (실행경로) 에서 기존에 입력된 것을 지우고

아래 경로로 하시면 좋을 것 같습니다.

(중간에 한글만 들어가지 않는 경로로 아무것이나 하셔도 상관은 없습니다)

 

이유는 컴퓨터 사용자 계정을 한글로 하셨을 경우에 에러가 나고

파이썬이 정상적으로 설치가 안될 수 있습니다.

 

 

 

 

 

설치가 완료 되셨으면 윈도우버튼과 R를 누르시거나 아래 화면 처럼 돋보기 화면에서 cmd 를 입력하세요

 

명령 프롬포트를 실행합니다.

 

 

 

 

 

명령 프롬포트 화면에서 아래와 같이 아무 경로에서나 python 을 입력하셨을 때

 

>>> 가 나타나면 정상적으로 설치가 완료된 것입니다.

 

종료하실 경우에는 quit() 를 입력하시면 됩니다.

 

 

고맙습니다.

 

 

파이썬을 쉽게 개발하고 싶으시면 VSCODE 설치법과 파이썬 관련 환경설정 방법도 알아보세요

https://studyhard24.tistory.com/231

엑셀 한영 전환이 불편하실 경우 아래와 같이 변경해 주시면 됩니다.

 

 

 

왼쪽 위에 파일을 클릭해주세요. 

 

 

왼쪽 밑에 옵션 클릭해 주세요.

 

 

언어 교정을 클릭한 후에 자동 고침 옵션을 클릭해주세요.

 

 

 

 

한영 자동 고침을 체크해제 하시면 자동으로 한영 자동 고침을 사용하지 않게 됩니다.

 

 

엑셀 숫자 문자 공백 구분하는 방법

=ISTEXT(A1)              : A1 셀에 있는 값이 문자 인지 확인 (문자일 경우 TRUE 반환)

=ISNUMBER(A1)         : A1 셀에 있는 값이 숫자 인지 확인 (숫자일 경우 TRUE 반환)

=ISBLACK(A1)            : A1 셀에 있는 값이 공백 인지 확인 (공백일 경우 TRUE 반환)

 

 

IF 함수를 사용해서 문자, 숫자, 공백인지 확인 하는 방법

 =IF(ISTEXT(C9),"문자",                  : C9 셀에 있는 값이 어떤 값인지 확인 할 수 있습니다.
  IF(ISNUMBER(C9),"숫자",
  IF(ISBLANK(C9),"공백")))

oracle 일 경우 update , merge 둘 다 가능

 

UPDATE 문

 

-- TB_TEST1가 100건 , TB_TEST2 30건일 경우 30건만 UPDATE 수행 됩니다.

-- 하지만 WHERE 을 생략할 경우 100건  모두 UPDATE ( 당연한 얘기같지만 혹시나 해서요..)

UPDATE  TB_TEST1 A

     SET (COL3, COL4 ) = ( SELECT COL3, COL4

                                  FROM TB_TEST2 

                                 WHERE COL1 = A.COL1 AND COL2 = A.COL2 )

WHERE EXISTS

(SELECT 1

 FROM TB_TEST2

WHERE COL1 = A.COL1 AND COL2 = A.COL2);

 

MERGE 문

 

-- MERGE는 INSERT를 같이 할 수 있는 장점도 있습니다.

-- ON 조건에 만족하지 않으면 INSERT 할 때는 아래 주석을 푸시면 됩니다.

MERGE INTO TB_TEST1 A

USING TB_TEST2 B

ON ( A.COL1 = B.COL1 AND A.COL2 = B.COL2 )

WHERE MATCHED THEN

UPDATE SET A.COL3= B.COL3, A.COL4=B.COL4

-- WHERE NOT MATCHED THEN 

-- INSERT (A.COL1, A.COL2, A.COL3, A.COL4)

-- VALUES (B.COL1, B.COL2, B.COL3, B.COL4)                   

 

-- ** oracle 10g까지만 update 할 때 /*+ bypass_ujvc */ 가능

 

 

 

 

 

'oracle' 카테고리의 다른 글

DBMS_XPLAN 튜닝 주로 사용하는 스크립트  (0) 2020.04.01
DBMS_XPLAN ORACLE PLAN 오라클 실제 플랜  (0) 2019.12.17
job 프로시저 수행  (0) 2017.09.27
테이블생성 프로시저  (0) 2017.09.27

파이썬 발표 자료 


python.pptx

 

'파이썬 python' 카테고리의 다른 글

Jjdj  (0) 2020.07.07

1. react native 에서 실제로 접속할 웹뷰주소 확인하여 크롬 인터넷 창에 직접 접속



예)


http://test.testsite.com/?at=e]ePz6fxG0&rt=2535235.a0f52dbe00





2. react native   web view 에서  userAgent="ss-ios-sdk" 설정되어 있을 경우




아래와 같이 변경


ss-ios-sdk  추가








react native 에 facebook login 기능을 추가하기 위해서 FBSDK 만 적용했다하면 아래와 같은 에러 발생


팝업은 무시하시고 빨간 에러창만 참고하시면 됩니다.





fbsdksharekit/fbsdksharekit.h' file not found


or 


fbsdkcorekit/fbsdkcorekit.h' file not found




그래서 지금까지 한 것중에 제일 좋은 해결책은


기존에 있는 Frameworks 디렉토리를 Frameworks2로 변경하거나 삭제하고 


새로운 Frameworks 디렉토리를 만드는 것이다





Build Settings에서 Framework Search Paths 도 ~ 표시가 아니고 


아래와 같이 직접 입력하시는 것이 좋습니다.


그리고 실제로 아래 경로에 FBSDK 는 다운 받아서 복사 하셔야 합니다.





그냥 참고사항....


Xcode에 복사할 때는 저는 아래와 같은 옵션으로 복사하였습니다.






git ignore 하는 방법을 알아보겠습니다.


git 에 Repository   를 새로 생성 하였습니다. 


GitTest로 생성하였습니다. 현재는 README.md 파일만 존재합니다.





로컬 내 PC에는 Frameworks 디렉토리와 a.txt 파일만 있습니다.






git init 명령어를 수행해서 git을 설정합니다


( 기존에 생성되어 있으면 생략하시면 됩니다)




README.md 파일을 로컬에 저장하기 위해서 git pull을 실행 합니다. 





README.md 파일을 불러왔습니다. 


로컬에 있는 Frameworks 디렉토리와 a.txt  파일을 


git에 올리기 위해서 아래명령어를 실행합니다.















정상적으로 git에 올라간 것을 확인하였습니다.





git에 올렸지만  Frameworks 디렉토리 밑에 있는 파일들은 크기만  


크고 필요하지 않기 때문에  git 에서 삭제하고 싶습니다.




.gitignore파일을 생성해서 아래처럼 Frameworks 디렉토리에 해당파일들을 추가합니다


파일만 지정할 수도 있고 *를 통해서 모두 지정해도 상관 없습니다.






gitignore 파일을 저장한 후에는 


실제로 git에 올라가 있는 파일을 아래 명령어로 삭제합니다.


git rm -r --cached 삭제원하는 파일






git에서는 삭제하였고 로컬에는 그대로 있는 것을 확인하였습니다.






git status를 수행하면 git에서 지워진 파일들을 표시해줍니다.





수정한 .gitignore 파일과 지워진 파일들을 git 에 적용해줍니다.






위와 같이 명령어를 수행하면 git에서 Frameworks 디렉토리가 삭제한 것을 확인할 수 있습니다.






로컬에는 역시 그대로 있습니다. git에서 삭제하는 것은 완료하였습니다.








b.txt를 추가하면서 ignore 한 파일들은 잘 적용되는지 확인해보겠습니다.







아래와 같이 git에는 추가한 파일만 적용되고 ignore 한 파일들은


  올라가지 않는 것을 확인하였습니다.








git에서 삭제하고 .gitignore하는 방법은 알아봤지만  


git 에서 복구하는 방법도 알아보겠습니다.








.gitignore 파일에서 대상파일들 앞에 # 를 붙여서 주석처리 합니다.








.gitignore 파일에서 주석처리를 하고 저장하면

  바로 git에서 해당 파일들이 변했다는 것을 알려줍니다. 







git에서 정상적으로 해당 파일들이 복구되는 것을 확인하였습니다. 








이상입니다. 고맙습니다.







react-native-video 



react-native init Video


cd Video


cat package.json

{

  "name": "Video",

  "version": "0.0.1",

  "private": true,

  "scripts": {

    "start": "node node_modules/react-native/local-cli/cli.js start",

    "test": "jest"

  },

  "dependencies": {

    "react": "16.6.3",

    "react-native": "0.57.8"

  },

  "devDependencies": {

    "babel-jest": "23.6.0",

    "jest": "23.6.0",

    "metro-react-native-babel-preset": "0.51.1",

    "react-test-renderer": "16.6.3"

  },

  "jest": {

    "preset": "react-native"

  }



npm install react-native-video --save




cat package.json

{

  "name": "Video",

  "version": "0.0.1",

  "private": true,

  "scripts": {

    "start": "node node_modules/react-native/local-cli/cli.js start",

    "test": "jest"

  },

  "dependencies": {

    "react": "16.6.3",

    "react-native": "0.57.8",

    "react-native-video": "^4.2.0"

  },

  "devDependencies": {

    "babel-jest": "23.6.0",

    "jest": "23.6.0",

    "metro-react-native-babel-preset": "0.51.1",

    "react-test-renderer": "16.6.3"

  },

  "jest": {

    "preset": "react-native"

  }

}



react-native link


rnpm-install info Linking react-native-video ios dependency

rnpm-install info Platform 'ios' module react-native-video has been successfully linked

rnpm-install info Linking react-native-video android dependency

rnpm-install info Platform 'android' module react-native-video has been successfully linked



react-native run-ios




app.js 내용



import React, { Component } from "react"
import { StyleSheet, Text, View } from "react-native"

class App extends Component {
render() {
return (
<View style={styles.container}>
<Text>Text</Text>
</View>
)
}
}

const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: "center",
alignItems: "center",
backgroundColor: "#F5FCFF"
}
})

export default App

import Video 하고 비디오 출력 , warbler.mp4 파일 로컬 경로에 추가



/**
* Sample React Native App
* https://github.com/facebook/react-native
*
* @format
* @flow
*/

import React, { Component } from "react"
import { StyleSheet, Text, View } from "react-native"
import Video from "react-native-video"

class App extends Component {
render() {
return (
<View style={styles.container}>
<Video
source={require("./warbler.mp4")} // URL이나 local 파일을 지정할 수 있다.
rate={1.0} // 0은 일시정지, 1은 정상 속도
volume={1.0} // 0은 음소거, 1은 정상 음량
muted={false} // 오디오를 완전히 음소거
paused={false} // 비디오를 완전히 일시 정지
// resizeMode="cover" // 화면 비율을 유지한 채로 화면 가득 채움
repeat={true} // 무한 반복
style={styles.fullScreen}
/>
</View>
)
}
}

const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: "center",
alignItems: "center",
backgroundColor: "#F5FCFF"
},
fullScreen: {
position: "absolute",
top: 0,
left: 0,
bottom: 0,
right: 0
}
})

export default App


아래 에러 발생할 경우 

TypeError: Cannot read property 'Constants' of undefined


해당 xcode => Build Phases => Link Binary With Libraries 

libRCTVideo.a 삭제 후 video 추가 해서 해결 

ㄷㅏ시  테스트 하려니 잘 수행되네..



아래는 내가 에러 내용 찾을 때 검색했던 사이트와 해결내용


https://github.com/react-native-community/react-native-video/issues/438



I found the solution that fixed me the problem.

Go to.. xCode -> Build Phases -> Link Binary With Libraries.

In the list find the file "libRCTVideo.a", if you will see it like icon of clean white paper than just delete it from the list and add it again by click on the plus (+) icon and just type "video" and add it.

Now in the commnd line run the commnad: "react-native run-ios", and "WALLA" no error.

swift tabbar controller tableview 영화목록 영화관 스위프트 테이블뷰 탭바 컨트롤러



//

//  MovieCell.swift

//  MyMovieChart

//

//  Created by stayfoolish on 29/10/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


class MovieCell: UITableViewCell {

    

    @IBOutlet var title: UILabel!

    @IBOutlet var desc: UILabel!

    @IBOutlet var opendate: UILabel!

    @IBOutlet var rating: UILabel!

    @IBOutlet var thumbnail: UIImageView!

    

}


//

//  MovieVO.swift

//  MyMovieChart

//

//  Created by stayfoolish on 28/10/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import Foundation

import UIKit


class MovieVO {

    var thumbnail: String? // 영화 섬네일 이미지 주소

    var title: String? // 영화 제목

    var description: String? // 영화 설명

    var detail: String? // 상세정보

    var opendate: String? // 개봉일

    var rating: Double? // 평점

    

    // 영호 썸네일 이미지를 담을 UIImage 객체를 추가한다.

    var thumbnailImage: UIImage?

}


//

//  ListViewController.swift

//  MyMovieChart

//

//  Created by stayfoolish on 28/10/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


class ListViewController: UITableViewController {

    

    @IBOutlet var moreBtn: UIButton!

    

    /*

    // 튜플 아이템으로 구성된 데이터 세트

    var dataset = [

        ("다크 나이트","영웅물에 철학에 음악까지 더해져 예술이 되다.","2008-09-04",8.95,"darknight.jpg"),

        ("호우시절","때를 알고 내리는 좋은 비","2009-10-08",7.31,"rain.jpg"),

        ("말할 수 없는 비밀","여기서 너까지 다섯 걸음","2015-05-07",9.19,"secret.jpg")

    ]

    */

    

    // 현재까지 읽어온 데이터의 페이지 정보

    var page = 1

    

    // 테이블 뷰를 구성할 리스트 데이터

    lazy var list: [MovieVO] = {

        var datalist = [MovieVO]()

       /*

        for (title, desc, opendate, rating, thumbnail) in self.dataset {

            let mvo = MovieVO()

            mvo.title = title

            mvo.description = desc

            mvo.opendate = opendate

            mvo.rating = rating

            mvo.thumbnail = thumbnail

            

            datalist.append(mvo)

        }

       */

        return datalist

    }()



    @IBAction func more(_ sender: UIButton) {

    // 0) 현재 페이지 값에 1을 추가한다.

    self.page += 1

    

    // 영화차트 API를 호출한다.

    self.callMovieAPI()

        

        

    // 데이터를 다시 읽어오도록 테이블 뷰를 갱신한다.

    self.tableView.reloadData()

    }

    

    

    // 뷰가 처음 메모리에 로드될 때 호출되는 메소드

    override func viewDidLoad() {

        // 영화차트 API를 호출한다.

        self.callMovieAPI()


    }

    

    func callMovieAPI() {

        // 1) 호핀 API를 호출을 위한 URI를 생성

//        let url = "http://swiftapi.rubypaper.co.kr:2029/hoppin/movies?version=1&page=\(self.page)&count=10&genreId=&order=releasedateasc"

        let url = "http://swiftapi.rubypaper.co.kr:2029/hoppin/movies?version=1&page=\(self.page)&count=30&genreId=&order=releasedateasc"

        

        let apiURL: URL! = URL(string: url)

        

        // 2) REST API를 호출

        let apidata = try! Data(contentsOf: apiURL)

        

        // 3) 데이터 전송 결과를 로그로 출력 (반드시 필요한 코드는 아님)

        let log = NSString(data: apidata, encoding: String.Encoding.utf8.rawValue) ?? "데이터가 없습니다"

        NSLog("API Result=\( log )")

        

        // 4) JSON 객체를 파싱하여 NSDictionary 객체로 받음

        do {

            let apiDictionary = try JSONSerialization.jsonObject(with: apidata, options: []) as! NSDictionary

            

            // 5) 데이터 구조에 따라 차례대로 캐스팅하며 읽어온다.

            let hoppin = apiDictionary["hoppin"] as! NSDictionary

            let movies = hoppin["movies"] as! NSDictionary

            let movie = movies["movie"] as! NSArray

            

            // 6) Iterator 처리를 하면서 API 데이터 MovieVO 객체에 저장한다.

            for row in movie {

                // 순회 상수를 NSDictionary 타입으로 캐스팅

                let r = row as! NSDictionary

                

                // 테이블 뷰 리스트를 구성할 데이터 형식

                let mvo = MovieVO()

                

                // movie 배열의 각 데이터를 mvo 상수의 속성에 대입

                mvo.title = r["title"] as? String

                mvo.description = r["genreNames"] as? String

                mvo.thumbnail = r["thumbnailImage"] as? String

                mvo.detail = r["linkUrl"] as? String

                mvo.rating = ((r["ratingAverage"] as! NSString).doubleValue)

                

                // 웹상에 있는 이미지를 읽어와 UIImage 객체로 설정

                let url: URL! = URL(string: mvo.thumbnail!)

                let imageData = try! Data(contentsOf: url)

                mvo.thumbnailImage = UIImage(data:imageData)

                

                

                // list 배열에 추가

                self.list.append(mvo)

                

                // 7) 전체 데이터 카우트를 얻는다.

                let totalCount = (hoppin["totalCount"] as? NSString)!.integerValue

                

                // 8) totalCount가 읽어온 데이터 크기와 같거나 클 경우 더보기 버튼을 막는다.

                if (self.list.count >= totalCount){

                    self.moreBtn.isHidden = true

                }

            }

        }catch { NSLog("Parse Error!!")}

    }

    

    func getThumnailImage(_ index: Int) -> UIImage {

        // 인자값으로 받은 인덱스를 기반으로 해당하는 배열 데이터를 읽어옴

        let mvo = self.list[index]

        

        // 메모이제이션 : 저장된 이미지가 있으면 그것을 반환하고, 없을 경우 내려받아 저장한 후 반환

        if let savedImage = mvo.thumbnailImage {

            return savedImage

        }else {

            let url: URL! = URL(string: mvo.thumbnail!)

            let imageData = try! Data(contentsOf: url)

            mvo.thumbnailImage = UIImage(data:imageData) // UIImage를 MovieVO 객체에 우선 저장

            

            return mvo.thumbnailImage! // 저장된 이미지를 반환

        }

        

        

    }


    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

            return self.list.count

    }

    

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        // 주어진 행에 맞는 데이터 소스를 읽어온다.

        let row = self.list[indexPath.row]

        

        // 로그 출력

        NSLog("제목:\(row.title!), 호출된 행번호:\(indexPath.row)")

        

        // 테이블 셀 객체를 직접 생성하는 대신 큐로부터 가져옴

        // as! UITableViewCell => as! MovieCell 로 캐스팅 타입 변경

        let cell = tableView.dequeueReusableCell(withIdentifier: "ListCell") as! MovieCell

        

        // 데이터 소스에 저장된 값을 각 아울렛 변수에 할당

        cell.title?.text = row.title

        cell.desc?.text = row.description

        cell.opendate?.text = row.opendate

        cell.rating?.text = "\(row.rating!)"


        /*

        // 섬네일 경로를 인자값으로 하는 URL 객체를 생성

        let url: URL! = URL(string: row.thumbnail!)

        

        // 이미지를 읽어와 Data 객체에 저장

        let imageData = try! Data(contentsOf: url)

        

        // UIImage 객체를 생성하여 아울렛 변수의 image 속성에 대입

        cell.thumbnail.image = UIImage(data: imageData)

        */

        

        /*

        // 이미지 객체를 대입힌다.

        cell.thumbnail.image = row.thumbnailImage

        */

        

        // 비동기 방식으로 섬네일 이미지를 읽어옴

        DispatchQueue.main.async(execute: {

            NSLog("비동기 방식으로 실행되는 부분입니다")

            cell.thumbnail.image = self.getThumnailImage(indexPath.row)

        })

 

        NSLog("메소드 실행을 종료하고 셀을 리턴합니다.")

        // 셀 객체를 반환

        return cell

    }

    

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        NSLog("선택된 행은 \(indexPath.row) 번째 행입니다.")

    }

}


//

//  TheaterCell.swift

//  MyMovieChart

//

//  Created by stayfoolish on 27/11/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


class TheaterCell: UITableViewCell {


    

    @IBOutlet var name: UILabel! // 상영관명

    @IBOutlet var tel: UILabel! // 연락처

    @IBOutlet var addr: 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

    }


}


//

//  TheaterListController.swift

//  MyMovieChart

//

//  Created by stayfoolish on 27/11/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


class TheaterListController: UITableViewController {


    // API를 통해 불러온 데이터를 저장할 배열 변수

    var list = [NSDictionary]()

    

    // 읽어올 데이터의 시작위치

    var startPoint = 0

    

    override func viewDidLoad() {

        super.viewDidLoad()

        self.callTheaterAPI()

    }

    

    func callTheaterAPI(){

        // URL을 구성하기 위한 상수값을 선언한다.

        let requestURI = "http://swiftapi.rubypaper.co.kr:2029/theater/list" // API 요청 주소

        

        let sList = 100 // 불러올 데이터 갯수

        let type = "json" // 데이터 형식

        

        // 인자값을 모아 URL 객체로 정의한다.

        let urlObj = URL(string: "\(requestURI)?s_page=\(self.startPoint)&s_list=\(sList)&type=\(type)")

        

        do {

            // NSString 객체를 이용하여 API를 호출하고 그 결과값을 인코딩된 문자열로 받아온다.

            let stringdata = try NSString(contentsOf: urlObj!, encoding: 0x80_000_422)

            

            // 문자열로 받은 데이터를 UTF-8로 인코딩 처리한 Data로 변환한다.

            let encdata = stringdata.data(using: String.Encoding.utf8.rawValue)

            do {

                // Data 객체를 파싱하여 NSArray 객체로 변환한다.

                let apiArray = try JSONSerialization.jsonObject(with: encdata!, options: []) as? NSArray

                

                // 읽어온 데이터를 순회하면서 self.list 배열에 추가한다.

                for obj in apiArray! {

                    self.list.append(obj as! NSDictionary)

                }

            }catch {

                // 경고창 형식으로 오류 메세지를 표시해준다.

                let alert = UIAlertController(title: "실패", message: "데이터 분석이 실패하였습니다.", preferredStyle: .alert)

                alert.addAction(UIAlertAction(title: "확인", style: .cancel))

                self.present(alert, animated: false)

            }

            // 읽어와야 할 다음 페이지의 데이터 시작 위치를 구해 저장해둔다.

            self.startPoint += sList

        }catch {

            // 경고창 형식으로 오류 메세지를 표시해준다.

            let alert = UIAlertController(title: "실패", message: "데이터를 불러오는데 실패하였습니다.", preferredStyle: .alert)

            

            alert.addAction(UIAlertAction(title: "확인", style: .cancel ))

            self.present(alert, animated: false)

        }

    }


    // MARK: - Table view data source




    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        // #warning Incomplete implementation, return the number of rows

        return self.list.count

    }


    

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        // self.list 배열에서 행에 맞는 데이터를 꺼냄

        let obj = self.list[indexPath.row]

        

        // 재사용 큐로부터 tCell 식별자를 맞는 셀 객체를 전달받음

        let cell = tableView.dequeueReusableCell(withIdentifier: "tCell", for: indexPath) as! TheaterCell

        

        cell.name?.text = obj["상영관명"] as? String

        cell.tel?.text = obj["연락처"] as? String

        cell.addr?.text = obj["소재지도로명주소"] as? String

        

        return cell

    }

    


    /*

    // Override to support conditional editing of the table view.

    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {

        // Return false if you do not want the specified item to be editable.

        return true

    }

    */


    /*

    // Override to support editing the table view.

    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

        if editingStyle == .delete {

            // Delete the row from the data source

            tableView.deleteRows(at: [indexPath], with: .fade)

        } else if editingStyle == .insert {

            // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view

        }    

    }

    */


    /*

    // Override to support rearranging the table view.

    override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) {


    }

    */


    /*

    // Override to support conditional rearranging of the table view.

    override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {

        // Return false if you do not want the item to be re-orderable.

        return true

    }

    */


    /*

    // MARK: - Navigation


    // In a storyboard-based application, you will often want to do a little preparation before navigation

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        // Get the new view controller using segue.destination.

        // Pass the selected object to the new view controller.

    }

    */


}








+ Recent posts