반응형

네이버 동영상 크롤링

네이버를 시작으로 유튜브와 구글의 동영상 크롤링에 대한 내용을 다룰 예정입니다.

들어가기 전에

크롤링을 통해서 얻은 동영상을 재업로드하는 경우 저작권 위반에 해당될 수 있습니다.

개인 공부용으로 작성된 글입니다. 참고하시는 분들도 공부용으로만 봐주시면 감사하겠습니다.

 

준비하기

작업환경 : Jupyter notebook

사용 라이브러리 : selenium, urllib

네이버 동영상은 " https://tv.naver.com " 의 동영상을 기준으로 하였습니다.

 

1. 동영상 저장 확인

먼저 url로 동영상이 저장되는지 확인해보도록 하겠습니다.

 

간단하게 이전에 다뤘던 구글 이미지 크롤링과 동일한 방법으로 영상 링크를 갖고 와서 저장하는 방법으로 시작해보겠습니다.

동영상 링크

크롬의 [검사] 기능을 이용해서 동영상의 소스를 찾아봤습니다.

 

보이는 것처럼 src 이하의 주소가 동영상의 소스가 됩니다.

 

동영상 주소로 들어갔을 경우

해당 동영상 링크를 주소창에 입력하면 위와 같은 화면을 볼 수 있습니다.

 

해당 영상이 저장이 가능한지 urllib를 이용해서 확인해보겠습니다.

 

동영상 저장

간단하게 저장되네요.(용량은 약 45MB)

 

2. XPath로 동영상 url 갖고 오기

매번 위와 같은 수작업으로 동영상의 url을 확인하는 방법은 크롤링이라고 할 수 없겠죠.

XPath를 이용해서 동영상의 url을 갖고 와 보겠습니다.

 

XPath 복사하기

복사해봤더니

     //*[@id="rmcPlayer_15550522065636948.video"]

라는 값이 저장되는 것을 볼 수 있었습니다.

 

위와 같은 형식의 id값은 동영상마다 id값이 다를 수 있기 때문에, id값이 아닌 class나 div 틀을 갖고 오는 방법이 필요합니다.

 

id 제거

위와 같이 검사 부분을 보게 되면, id = "rmcPlayer_~~~"라고 되어있는 부분이 있습니다.

동영상의 url을 시작으로 상위의 요소에 붙은 위와 같은 id 값들을 전부 제거하고 다시 XPath 값을 갖고 와 보겠습니다.

 

중간에 id = "player"라고 되어있는 부분부터 동영상의 url까지의 id값을 제거해주시면 됩니다.(총 3개)

 

다시 XPath값을 갖고 와서 보니 아래와 같은 값을 얻을 수 있었습니다.

 

//*[@id="player"]/div/div/div[11]/div[13]/video

 

div가 반복되는 게 마음에 안 들지만, 일단 넘어가겠습니다.

 

위의 XPath를 이용해서 url을 얻어와 보겠습니다.

 

url 얻어오기

위와 같은 방법으로 동영상의 url을 얻어올 수 있었습니다.

 

3. 코드 종합

일단 여기까지 코드를 정리해보겠습니다.

 

코드정리

위와 같이 몇 줄 안 되는 코드로 원하는 주소의 동영상을 저장할 수 있었습니다.

 

그럼 이제 몇 가지 문제점을 집고 다음으로 넘아가겠습니다.

 

4. 문제점 확인

네이버의 동영상을 보기위해 웹페이지에 접속하면 자동으로 영상이 재생됩니다.

 

다만, 다들 아시겠지만, 영상의 시작전에 볼 수 있는게 있습니다.

 

바로 광고 입니다. 물론 모든 영상에 광고가 붙지는 않습니다. 아래와 같은 3가지 경우가 있습니다.

 

1) 광고없음 : 광고가 없는경우 위와같이 time.sleep(2) 정도면 웹페이지가 영상의 링크를 갖고오기까지 충분한 시간이 됩니다. 이상적이죠...

2) 5/15초 광고 후 스킵

3) 15초 광고 후 재생

2와 3의 경우 위의 코드를 그냥 실행하게되면 원하는 동영상이 아니라 광고가 파일로 저장되게됩니다.

때문에 이 문제들을 해결하는 방법을 다음 글에서 보도록 하겠습니다... (지금부터 연구...)

 

따라서 다음영상은 2번(5/15초 광고 후 스킵)의 문제를 해결하는 방법을 다루겠습니다.

다음으로 3번(15초 광고 후 재생)

마지막으로 멀티프로세싱을 이용하여 원하는 영상들을 한번에 수집하는 방법을 다루겠습니다.

 

따라서 총 4편을 구성될 예정입니다.

 

반응형
반응형

[Swift OSX] 1. 개발 준비

 

작성일 기준 최신 Xcode와 Swift버전을 사용하였습니다.

1. 개발 준비

MAC OS 개발도 IOS개발과 마찬가지로 맥(맥북)에서만 개발이 가능합니다.(윈도우, 리눅스 환경에서는 불가능~!)

 

맥에서 개발을 시작하면 먼저 Xcode라는 녀석이 필요합니다. App Store에 들어가셔서 설치해주세요.

 

설치가 끝나셨다면 아래와 같은 과정으로 이동해주세요.

 

 

[Create a new Xcode project] 클릭

 

[macOS -> Cocoa App -> Next] 클릭

 

[Product Name, Language=Swift, Use Storyboards 채크 -> Next] 클릭

 

 

위와 같이 프로젝트를 생성해주면 기본적인 세팅은 끝입니다.

 

다음은 화면 구성입니다.

 

Xcode 화면 구성

위와 같이 Xcode는 3가지 부분으로 나눠지게 됩니다.

(Inspector 영역은 Utilites 영역이라고 불리는 경우도 있습니다.)

 

Library는 화면 구성에 필요한 다양한 아이템들을 불러올 수 있습니다.

 

시작버튼 클릭시 실행화면

프로젝트 생성 후 바로 실행 버튼을 클릭하면 위와 같이 아무것도 없는 빈 화면이 실행되는 것을 볼 수 있습니다.

 

여기까지 완료되면, 개발 준비는 일단 끝이라고 볼 수 있습니다.

 

다음으로는 간단한 UI 구성에 대해서 알아보겠습니다.

 

 

Xcode 정말 편하게 만들려고 노력했지만, 불편한 프로그램이 아닐 수 없습니다...

제작자의 의도를 벗어난 다양한 버그들이 힘들게 하는 프로그램이죠... ㅠㅠ

반응형
반응형

[Swift OSX] 0. Swift로 시작하는 OSX 프로그래밍

Swift x OSX


1. 소개

2014년 Swift가 첫 공개되고 5년이라는 시간이 흘렀다. 기존 Objective-C보다 1.5배, Python보다 220배의 빠른 처리속도를 갖고있다고 소개된 이 언어는 애플이 Objective-C를 점점 등한시하고, Swift를 밀면서 많은 IOS개발자들이 Swift로 점차 이동하게하는 모습을 보이게되었다.

하지만, 국내의 경우 OSX에 대해서는 조금 상황이 애매하다.

MAC OS를 사용하는 유저의 수가 이전에 비해서 많이 늘었다고는 하지만, 윈도우에 비하여 압도적으로 적은 상황이다보니 대부분의 개발자들이 굳이 MAC OS를 위해서 개발을 별도로하는 경우가 적은 것 같다.

필요에 따라서 간단한 매크로 프로그램등을 만드는 경우는 있지만, 이러한 프로그램들을 위해서 Swift를 배울 필요는 없다. (Objective-C 조차 필요없는 경우도 많다.)


이러한 이유 때문인지 Swift + IOS에 관련된 강의들은 쉽게 찾아볼 수 있는 반면에, Swift + OSX에 관련된 내용은 해외사이트에 의존할 수 밖에 없는 상황이다.


이제부터 시작될 내용들 역시 99% 해외 사이트에서 얻어온 내용을 번역 & 정리한 내용이 될 것이며, 이들 내용들을 이용하여 간단한 OSX 앱개발을 수행할 예정이다.





꾸벅

반응형
반응형

[네트워크 이론] 회선교환 방식과 패킷교환 방식

1. Circuit Switched Network (회선교환방식)

 - 데이터 전달을 위해 하나의 전용 회선을 임시로 할당받아 데이터를 교환하는 방식
 - 전용 회선을 할당받기 위한 Set-Up 절차를 수행이 필요하다.
 - 전용 회선을 사용하기 때문에 다른 패킷 트래픽에 의한 지연이 없다.
 - 주로 과거 전화망에서 사용했다.
 - FDM과 TDM방식 등이 존재한다.
 - 모든 회선이 사용중이면 새로운 연결(Set-up)을 만들 수 없다. (전용으로 임대할 수 있는 회선이 부족한 경우)

2. Packet Switched Network (패킷교환방식)

 - Stre and Forward 방식으로, 패킷들이 큐에 저장되어있다가 한번에 전송되는 방식을 사용한다.
 - 패킷은 라우터(L3 이상장비)의 경로탐색 알고리즘에 의해서 경로가 결정된다.
 - 전송지연, 큐잉지연 등의 지연이 발생 할 수 있다.
 - 라우터(L3 이상장비)의 큐가 넘칠 경우 패킷이 버려지는 형상(패킷 오버플로우)이 발생할 수 있다.

 - 회선의 사용자가 많아질수록 속도 저하가 발생할 수 있다.


반응형
반응형

[Swift 입문] 접근제어자


1. 접근제어

접근제어는 앱개발 뿐만 아니라, 프로그래밍에 있어서 기본이 되는 부분입니다.
특히, 내가만든 프로그램을 남들에게 공유하겠다는 목표를 갖고있다면, 필수적인 요소이죠.

접근제어는 프레임워크나 클래스등에서 꼭 필요한 부분만을 외부로 공개한다는 것이 핵심입니다.

다시말해 외부 접근자는 프레임워크나 클래스의 접근에 있어서 필요한 부분만을 보기 때문에 더욱 쉽고 올바르게 접근할 수 있고, 내부 설계자는 외부로 노출하기 꺼려되는 정보를 차단할 수 있다는 장점이 있습니다.

접근 수준

내부 접근여부

외부 접근여부

open

접근가능 (O)

접근가능 (O)

public 

접근가능 (O)

접근가능 (X)

internal (기본값 )

접근가능 (O)

접근불가 (X)

fileprivate 

같은 파일 내 접근가능 (X)

접근불가 (X)

private

접근불가 (X)

접근불가 (X)

( O, X 는 상속 및 Override의 가능 여부 )



2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 1. 시작하기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 2. Project 시작하기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 3. 에뮬레이터로 앱 실행하기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 4. 앱 아이콘 설정하기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 5. LaunchScreen 만들기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 6. Swift 문법 알아보기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 7. Swift 문법 알아보기 (배열, 딕셔너리 등)

2019/03/19 - [프로그래밍/Swift] - [Swift 입문] 8. Swift 함수 정의하기

2019/03/19 - [프로그래밍/Swift] - [Swift 입문] Tip) 줄바꿈 없는 print

2019/03/19 - [프로그래밍/Swift] - [Swift 입문] Tip) Call by reference ( 참조에 의한 전달 )

2019/03/19 - [프로그래밍/Swift] - [Swift 입문] 9. Class 만들기 (생성, 상속)

2019/03/19 - [프로그래밍/Swift] - [Swift 입문] 10. 열거형 Enum


반응형
반응형

[Swift 입문] 열거형(Enumeration) 사용하기


사실 남들이 짜둔 C코드에서 열거형을 많이 보았지만, 제대로 사용해본적이 없습니다...

아직 미숙한점이 많다는 것을 느끼는 부분이네요... ㅠㅠ


1. 열거형 만들기

열거형은 새로운 자료형을 선언해준다고 생각하시면 좋을꺼같습니다.



간단하쥬?


2. RawValue

아래와같이 열거형에 값을 넣어주는 것도 가능합니다.

그리고 이 값은 rawValue를 통해서 확인이 가능합니다.

Int형 뿐만 아니라 원하는 자료형으로 쓸 수 있으니, 잘만 쓴다면 편하겠죠?



2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 1. 시작하기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 2. Project 시작하기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 3. 에뮬레이터로 앱 실행하기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 4. 앱 아이콘 설정하기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 5. LaunchScreen 만들기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 6. Swift 문법 알아보기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 7. Swift 문법 알아보기 (배열, 딕셔너리 등)

2019/03/19 - [프로그래밍/Swift] - [Swift 입문] 8. Swift 함수 정의하기

2019/03/19 - [프로그래밍/Swift] - [Swift 입문] Tip) 줄바꿈 없는 print

2019/03/19 - [프로그래밍/Swift] - [Swift 입문] Tip) Call by reference ( 참조에 의한 전달 )

2019/03/19 - [프로그래밍/Swift] - [Swift 입문] 9. Class 만들기 (생성, 상속)


반응형
반응형

[Swift 입문] Class 만들고 사용해보기


Swift는 볼수록 조금 규칙이 엄격한 파이썬이라는 느낌이 있네요. 

1. Class 만들기

Class를 표현할 때, 많이 사용되는 표현이 제품의 '틀'이라는 말을 씁니다.

예를들어 자동차의 번호판을 만드는 공장이 있다면, 여기서 class는 철판에 번호를 찍고 색을 입히는 기계일 뿐이지 번호판이 아닙니다.

번호판을 만들기전에, 용도에 따라 번호판의 색은 어떤것으로 할지, 숫자는 어떤게 들어가고, 문자는 어떤게 들어갈지 미리 전해서 번호판을 만드는 기계(Class)에 알려줍니다. 그 과정이 아래에 init이라는 함수로 초기값을 설정해 주는 부분이라고 할 수 있습니다.

그리고 class가 만들어낸 결과물이 아래에서 my_car1, my_car2라는 부분으로, 이게 하나의 번호판이 되는거겠죠.

죄송합니다. 설명은 번호판, 실제 코드는 자동차라니... ㅠㅠ



위에서 이런저런말을 하는 이유는 Car라는 클래스는 Car.id와 같은 방법으로 불러와서 값을 확인하는 용도가 아니라는 것을 말씀드리고 싶었기 때문입니다.


번호판을 만드는 기계가 어떻게 생겼는지가 뭐가 중요할까요? 우리는 만들어질, 그리고 만들어진 번호판에만 집중하도록 합시다.



2. 클래스의 상속

처음 자바라는 언어에서 상속을 봤을 때, 멘붕했던 기억이 나네요...

상속은 기존에 존재했던 클래스를 가져와서 새로운 기능을 추가하거나 기존의 내용을 수정하여 사용하는 방식이라고 생각하면 좋을꺼 같습니다.


위 코드에대해서 간단하게 설명하자면 아래와 같습니다.


부모클래스 : Game

자식클래스 : Phone_game

override : 부모 클래스에서 정의된 내용을 수정

super : 부모 클래스에서 사용된 변수를 의미


지금 눈으로 볼때 쓸때없어보이고 어렵기만 할 수 있지만, 코드를 예쁘게 짜기 위해서는 필수이니 꼭 기억해두고 응용합시다.



 추가) 구조체와의 큰 차이

구조체와 다르게 class는 객체를 참조하는 형태입니다. 클래스에 의해 만들어진 어떤 변수는 해당 객체의 주소값을 갖고있습니다.

따라서 
let car1 = Car()

let car2 = car1

과 같은 경우 car2와 car1는 동일한 객체를 참조합니다.


즉, car1의 내용을 변경하면 car2도 변경된다는 의미입니다.

추가) 소멸자

소멸자는 "deinit"를 사용합니다.

class가 역할을 다하고 메모리에서 사라질 때 수행됩니다.



2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 1. 시작하기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 2. Project 시작하기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 3. 에뮬레이터로 앱 실행하기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 4. 앱 아이콘 설정하기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 5. LaunchScreen 만들기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 6. Swift 문법 알아보기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 7. Swift 문법 알아보기 (배열, 딕셔너리 등)

2019/03/19 - [프로그래밍/Swift] - [Swift 입문] 8. Swift 함수 정의하기

2019/03/19 - [프로그래밍/Swift] - [Swift 입문] Tip) 줄바꿈 없는 print

2019/03/19 - [프로그래밍/Swift] - [Swift 입문] Tip) Call by reference ( 참조에 의한 전달 )


반응형
반응형

[Swift 입문] 함수에서의 Call By Reference


Call by Reference란?

어떤 변수 X를 함수의 인자로 전달할 때, 실제로 X라는 변수가 함수의 인자가 되는 것인지 아니면 X=10이라고 할 때 10이라는 값이 복사되어 전달되는 것인지에 따라 결정된다.

Call by Reference -> 다른말로 참조에 의한 전달이라고 하는 이것은, 전자와 같이 실제 X라는 값이 존재하는 데이터의 메모리상의 주소값을 함수의 인자로 전달함을 의미한다.


즉, 함수에서 인자로 전달받은 값을 수정할 경우 실제 X라는 값이 변경된다는 의미이다.


(위에서 말했던 경우 중 후자에 해당하는 값의 복사는 Call By Value라고 부른다.)



무슨말인가? 아래의 경우를 보자.




위와같이 x라는 변수가 5라는 값을 갖고있을 때, 함수에서 해당 값을 변경하려고하면, 애러가 발생하는것을 볼 수 있다.


애러 원인은 num이라는 매개변수로 들어온 값은 let(==상수) 이므로 변경이 불가능하다는 이야기다.


그럼 어떻게 실제값을 변경할 수 있을까?


아래와 같이 inout 키워드와 '&'을 이용하면 해결이 가능하다.





우측에 변수 값을 보게되면, 5였던 값이 10으로 변경된 것을 볼 수 있다.


함수에 'inout' 키워드를 넣고, 인자를 전달할 때, x앞에 '&'을 붙여줌으로 해당 문제를 해결했다.


변수에 '&'를 붙여준다는 것은 x라는 값이 저장되어있는 메모리의 주소를 함수에 전달해 준다는 의미이다.


지금 이해하기 어렵다면, 일단 넘어가도 좋을듯하다.


2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 1. 시작하기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 2. Project 시작하기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 3. 에뮬레이터로 앱 실행하기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 4. 앱 아이콘 설정하기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 5. LaunchScreen 만들기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 6. Swift 문법 알아보기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 7. Swift 문법 알아보기 (배열, 딕셔너리 등)

2019/03/19 - [프로그래밍/Swift] - [Swift 입문] 8. Swift 함수 정의하기

2019/03/19 - [프로그래밍/Swift] - [Swift 입문] Tip) 줄바꿈 없는 print


반응형
반응형

[Swift 입문] print함수 사용시 자동 줄바꿈 사용안하기


C, C++ 등의 언어들과 다르게 파이썬, Swift와 같은 언어들은 출력함수인 print 함수를 사용할 경우 자동으로 줄바꿈을 수행합니다.

줄바꿈을 해서는 안될 경우 어떻게 해야할까?



머신러닝을 공부하면서 매일 사용하는 단축키 [ Shift + Tab ]은 사용하고자하는 함수의 설명을 보여주는 명령입니다.

swift에서는 [ Option + 궁금한 함수 클릭 ]을 통해서 위와같은 기능을 확인할 수 있습니다.

print함수를 Option버튼을 누르고 클릭하면 아래와 같은 화면을 볼 수 있습니다.



내용을 보면, print라는 함수는 출력을 원하는 값 [items 라는 것 외에도 separator와 terminator라는 인자를 입력받는 것을 볼 수 있습니다.


그리고 이때 두 인자의 기본값은 default라는 것으로 채워져 있습니다.


아래로 좀더 내려보니 terminator에 대한 예문도 있네요.




친절하게 적혀있는 예문들으보니 [ Separator ] 라는 녀석은 여러개의 출력값 사이에 들어가는 값이라는 것을 알 수 있고, [ terminator ] 라는 녀석은 출력 후 마침을 어떻게 할 것인지에 대한 정의임을 알 수 있었습니다.


terminator의 기본값이 "\n"이었나 보네요.



결과적으로 print("출력값", terminator: "")라고하면 자동 줄바꿈을 막을 수 있겠습니다.


2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 1. 시작하기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 2. Project 시작하기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 3. 에뮬레이터로 앱 실행하기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 4. 앱 아이콘 설정하기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 5. LaunchScreen 만들기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 6. Swift 문법 알아보기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 7. Swift 문법 알아보기 (배열, 딕셔너리 등)

2019/03/19 - [프로그래밍/Swift] - [Swift 입문] 8. Swift 함수 정의하기


반응형
반응형

[Swift 입문] Swift에서 함수를 정의하기


1. 함수 기본 정의

Swift에서는 func [함수명](전달인자 정의) -> 리턴값 { 함수내용 } 형태로 함수를 정의합니다.



위에 보시는 것처럼 함수를 정의하고 사용합니다.


특이하게도 정의한 함수를 불러와 사용하는데 있어서도 어떤 인자에 값을 넘겨 줄 것인지 명시해야한다는게 특징일 수 있겠네요.


흠... 불편한데? 라고 생각할 수 있습니다.


그래서 생략을 하는 방법이 있습니다.



이렇게 앞에 '_'(언더바)를 넣어주면 됩니다.


2. 함수 인자의 default 설정


Swift에서도 다른 언어와 마찬가지로 인자의 Default 값을 설정할 수 있습니다.




3. 여러개의 값을 인자로 넘기는 경우

함수의 인자로 넘어오는 값의 크기를 알 수 없는 경우가 있을 수 있습니다.

그럼 아래와 같이 넘어오는 인자의 타입 뒤에 [ ... ]을 붙여줘서 해결이 가능합니다.


위 그림에서 name은 한번은 3개의 값을, 다른 한번은 1개의 값을 얻습니다.


hi 함수는 name이라는 인자를 처리할 때 개수에 상관없이 하나의 배열의 값처럼 사용하는 것을 볼 수 있습니다.



일단 이정도로 함수 선언에 대한 부분은 마치겠습니다.


다음에는 Swift에서 사용하는 기본적인 함수들에 대해서 작성해보도록 하겠습니다.



2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 1. 시작하기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 2. Project 시작하기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 3. 에뮬레이터로 앱 실행하기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 4. 앱 아이콘 설정하기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 5. LaunchScreen 만들기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 6. Swift 문법 알아보기

2019/03/18 - [프로그래밍/Swift] - [Swift 입문] 7. Swift 문법 알아보기 (배열, 딕셔너리 등)


반응형

+ Recent posts