Swifter {Swift Developer}

메뉴

3. Playground 사용과 REPL

[vc_row][vc_column][vc_column_text]Xcode는 Swift언어로 작성된 소스코드를 동작을 바로 확인할 수 있는 도구로 Playground와 REPL 두가지를 제공하고 있습니다.

Playground에서 Swift소스코드를 작성하면 바로 결과가 표시됩니다. 이는 백그라운드에서 자동으로 계속적으로 컴파일이 실행되고 있기 때문입니다. LLVM 컴파일러가 빠르기 때문에 실현 가능한 것으로 Playground를 통해 Swift언어가 컴파일 언어이지만 인터프리터 언어처럼 소스코드를 확인할 수 있습니다.

다른 REPL는 대화형 런타임 환경으로 명령줄에서 REPL을 시작하고 소스코드를 입력하면 바로 확인할 수 있습니다. 대화형으로 한줄씩 입력하면서 실행결과를 확인할 수 있는 것이 특징입니다.

그럼 이제 이 두가지 기능들을 각각 특징과 사용방법을 알아봅시다.[/vc_column_text][vc_separator][vc_column_text]

3-1. Playground

Xcode에서 [File]-[New]-[Playground]를 선택하고 플레이그라운드명을 입력하면 코드를 입력해서 테스트해볼 수 있는 환경이 만들어집니다.[/vc_column_text][vc_single_image image=”499″ img_size=”full”][vc_column_text]단, Platforms에서 iOS와 OS X중 하나를 선택해야 하는데, 각 플랫폼별로 사용하는 프레임웍이 약간 차이가 있기 때문입니다.

Playground는 Swift로 작성한 소스코드의 결과를 바로 확인할 수 있고, 숫자나 문자열의 결과만 표시되는 단순한 형태가 아니라 게임화면 자체를 실행 할 수 있는 정도의 성능을 보여줍니다. 참고로 이전까지는 Playground에서 인스턴스가 해제될 때 호출되어야 할 메소드 deinit가 호출되지 않는 제한이 있었지만 Xcode 7부터 는 순환참조가 발생하는지 아닌지 확인하는 것도 가능해졌습니다.

객체 라이프사이클을 확인하는 것도 가능하기 때문에 아래 예제를 Playground에서 실행하면 deinit가 출력되는 것을 확인할 수 있습니다.[/vc_column_text][vc_column_text]

[code lang=”swift”]
class ExamClass {
deinit {
print("deinit")
}
}

var exam: ExamClass? = ExamClass()
exam = nil // deinit가 호출되어 deinit가 출력됨
[/code]

[/vc_column_text][vc_column_text]Playground 화면은 소스코드 작성하는 편집기 영역과 결과가 표시되는 영역, 그래픽 표시나 콘솔로그 표시되는 리소스영역으로 나누어집니다. 처음 실행하면 소스코드 편집기 영역과 결과 표시 영역만 나오지만 메뉴에서 [View]-[Assistant Editor]-[Show Assistant Editor]를 선택하면 타임라인 영역을 사용할 수 있습니다. 단축키는 [Option]+[Command]+[return]키입니다.[/vc_column_text][vc_single_image image=”500″ img_size=”full”][vc_column_text]그럼 좀더 타임라인을 활용하는 방법을 설명하기 위해 0~10까지의 숫자값을 반복시켜 제곱 계산하는 예제로 이해를 높여보겠습니다.[/vc_column_text][vc_column_text]

[code lang=”“swift””]
for i in 0…10 {
i * i
}
[/code]

[/vc_column_text][vc_single_image image=”501″ img_size=”full”][vc_column_text]결과 표시 영역에는 “(11 times)”가 표시되지만, 이는 11회 처리된 것을 의미하며 “(11 times)” 오른쪽에 표시되는 둥근 아이콘에 커서를 가져가면 + 아이콘이 나옵니다. 이 아이콘을 클릭하면 소스코드 편집기 영역에 선 그래프가 표시되는 것을 확인 할 수 있습니다. 이는 이해하기 쉬운 표시 방법으로 자동으로 선택된 것이기 때문에 명시적으로 View를 타임라인에 표시하려면 XCPlayround를 사용해야 합니다. 우선 XCPlayground를 추가하고 UIView를 만들 후에 해당 인스턴스를 XCPShowView로 보내줍니다. 이해를 돕기 위해 View를 만들고 원을 그리는 예제를 보여드립니다.[/vc_column_text][vc_column_text]

[code lang=”“swift””]
import XCPlayground

let circleRect = CGRectMake(0,0,300,300)
class CircleView: UIView {
override func drawRect(rect: CGRect) {
let context:CGContextRef = UIGraphicsGetCurrentContext()!
UIColor.whiteColor().setFill()
CGContextFillRect(context, rect)
UIColor.blackColor().setFill()
CGContextFillEllipseInRect(context, circleRect)
}
}
let view = CircleView(frame: circleRect)
XCPShowView("뷰어", view: view)
[/code]

[/vc_column_text][vc_single_image image=”502″ img_size=”full”][vc_column_text]Playground는 동기화처리된 타이머나 GCD를 사용한 처리를 할 수 없습니다. 그러나, XCPSetExecutionShouldContinueIndefinitely를 true로 설정하면 비동기 처리를 사용할 수 있습니다. 비동기 처리를 할 경우 30초 시간제한이 있어 시간을 넘게 되면 중지됩니다. 따라서 시간이 걸리는 것을 실행할 경우에는 테스트하기 어렵습니다.[/vc_column_text][vc_column_text]

[code lang=”“swift””]
import XCPlayground

XCPSetExecutionShouldContinueIndefinitely(true)

class Exam: NSObject {
func timerStart() {
NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "chk", userInfo: nil, repeats:true)
}

var cnt = 0
func chk() {
print("timer check!")
}
}

let exam = Exam()
exam.timerStart()
[/code]

[/vc_column_text][vc_single_image image=”503″ img_size=”full”][vc_column_text]Playground에서 로그를 출력하는 경우 print()를 사용할 수 있지만 Playground에서는 값을 캡쳐하기 위해 별도 함수인 XCPCaptureValue()를 사용합니다. 이 함수를 이용하면 이름에서 캡쳐한 값을 그룹화할 수 있어 개별 변수 출력이 쉽게 확인할 수 있습니다.

예로 타이머 기능을 사용하여 난수와 카운터를 표시하는 예제를 만들어 봅시다.

이 예제는 앞의 예제에서 chk() 메소드부분만 변경하고 있습니다.[/vc_column_text][vc_column_text]

[code lang=”“swift””]
import XCPlayground

XCPSetExecutionShouldContinueIndefinitely(true)

class Exam: NSObject {
func timerStart() {
NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "chk", userInfo: nil, repeats:true)
}

var cnt = 0
func chk() {
XCPCaptureValue("count", value:++cnt)
XCPCaptureValue("random", value:arc4random_uniform(100))
}
}

let exam = Exam()
exam.timerStart()
[/code]

[/vc_column_text][vc_single_image image=”504″ img_size=”full”][vc_column_text]그외 Playground 프로젝트 내에서 이미지 파일이나 HTML파일으 배치하기 위해 소스코드를 약간만 손보면 HTML과 이미지등도 볼 수 있습니다. 이는 Playground를 통해 실시간 결과물을 보여주며 다른 사람에게 교육하는 단순한 용도뿐만 아니라 그 이상도 가능하다는 것입니다.

참고로, 이 패키징 형식은 Interactive Learning Document Format이라는 것으로 되어 있고 앞에서 설명했듯이 Playground로 이 강좌에서 소개하는 예제 소스코드들을 실행하는 용도로도 알맞습니다.

 

3-2. REPL

REPL은 “Read-Eval-Print-Loop”라는 약어로 읽고 평가하고 표시를 반복한다라는 의미입니다. Playground처럼 입력된 소스코드를 순서대로 실행결과를 표시하지만 비주얼하게 보여주지는 않습니다. View와 같은 표시를 확인하는 것이 아니라 소스코드의 로직이 제대로 실행되는지 확인하는 목적에 알맞습니다.

REPL을 실행하는 방법은 터미널에서 실행하는 방법과 Xcode에서 프로젝트 실행중 중단점에서 중지하고 LLDB에서 이동하는 방법이 있습니다. 여기서 특이한 점은 터미널에서 실행해서 쉡스크립트로 실행하는 방법이 있습니다.[/vc_column_text][vc_column_text]터미널에서 시작하기

터미널 응용프로그램에서 명령을 입력해서 시작하지만 처음 시작시, Xcode 개발도구 디렉토리를 시스템에 알릴 필요가 있습니다. Sudo명령을 사용하여 관리자 암호를 입력한후 시작하시기 바랍니다.

$ sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer/

이제 swift 명령어로 실행하거나 “lldb –repl”로 시작할 수 있습니다.

REPL이 시작되면 “1>” 메시지가 나오는데 여기에 소스코드를 입력합니다. 명령줄에서 어떤 것을 입력해서 사용할 수 있는지에 대해서는 “:help”를 통해 확인합니다.[/vc_column_text][vc_single_image image=”505″ img_size=”full”][vc_column_text]그럼 예로 이 강좌에서 처음 실행했던 예제인 deinit를 출력하는 예제를 실행해 봅시다.[/vc_column_text][vc_single_image image=”506″ img_size=”full”][vc_column_text]REPL 종료 방법은 “:quit” 또는 단축키 [control] + [D]키를 눌러 종료할 수 있습니다.

 

Swift파일 실행하기

Swift명령에서 Swift 소스코드가 담긴 소스코드파일을 실행할 수 있습니다. print(“hello world”)가 담긴 h.swift파일을 만들고 터미널에서 “swift 파일명”을 입력하면 해뎡 결과가 표시됩니다.

또한, 쉘스크립트에서 Swift를 코딩할 수도 있습니다.

#!/usr/bin/swift

print(“hello world”)

Xcode에서 REPL사용하기

중단점에서 실행이 중지되는 동안 LLDB에서 작업시 LLDB명령줄에서 “repl”명령어를 입력하여 REPL상태로 전환합니다. 입력한 소스코드는 중단점이 종료되는 시점에서 사라지기 때문에 일시적으로 소스코드를 테스트할 때 유용합니다.

 

지금까지 Playground와 REPL을 설명했습니다. 이들 기능은 Swift소스코드를 테스트할 수 있을지를 구분합니다. 여러분들도 여러가지 소스코드를 작성해서 Swift언어에 익숙해지길 바랍니다.[/vc_column_text][vc_separator][vc_btn title=”목차로 이동하기” color=”orange” align=”center” link=”url:%2F3-playground-%EC%82%AC%EC%9A%A9%EA%B3%BC-repl%2F|title:%EB%AA%A9%EC%B0%A8|”][/vc_column][/vc_row]

Facebook Comments

카테고리:   Swift Books

댓글

죄송하지만 댓글은 닫혀 있습니다.