이번에 다룰 내용은 툴(Tool)이다. 프로그래밍 환경에서 툴이 차지하는 비중은 상당하다. 얼마나 빠르고 쉽게 개발할 수 있는지가 툴에 달려 있기 때문이다. 그래서 툴에 대해 자세히 알고, 마음대로 다룰 수 있도록 능력을 갖추는 것은 매우 중요하다. 현대 프로그래밍은 상당히 많은 부분을 툴에 의존하는 경향이 있지만, 이는 툴과 프로그래밍 개발이 이제 떼려야 뗄 수 없는 관계에 들어섰다는 증거이기도 하다.
프로그래밍 과정에서 툴이 갖는 위치와 필요성, 그리고 실무에서 꼭 필요한 통합개발 환경에 대해 살펴보고, 스위프트로 앱을 개발하기 위해 사용해야 할 툴인 Xcode에 대해 알아보고자 한다.
프로그래밍 경험이 충분하거나 과거에 Xcode를 다루어 본 경험이 있다면 읽지 않아도 좋다. 하지만 Xcode가 낱설거나 새로운 Xcode의 특성을 알아보고 싶다면 이번 장을 통해 Xcode의 사용법을 숙지해 둘 필요가 있다. 좋은 집을 만들기 위해 아무리 완벽한 설계도와 훌륭한 재료가 있다 하더라도 망치와 끌, 정 같은 기본 연장을 숙련되게 사용하지 못한다면 결코 좋은 집을 빠르게 만들 수 없는 것과 같은 이치이다.
최근 12번째 버전까지 발표된 Xcode는 역사도 길고, 매우 방대한 기능을 갖춘 툴이다. 세세한 내부 구성을 제대로 소개하려면 책 한 권으로도 부족할 정도이다. Xcode의 기본적인 내용과 더불어 앱을 만들 때 꼭 필요한 항목을 중심으로 설명하겠다.
1. 통합개발 환경
Xcode에 대해 이야기 하기 전에, 먼저 ‘통합개발 환경’ 개념에 대해 알아본다. 외우거나 논리적으로 이해해야 하는 내용은 아니므로 편하게 읽어보면 된다.
1.1 통합개발 환경 이전의 프로그래밍
최근에 널리 사용되는 프로그래밍 언어 대부분은 개발 생산성을 높이기 위해 여러 가지 기능이 집약된 전용 개발 툴을 제공하거나, 또는 유명한 개발 툴에 플러그인 방식으로 사용할 수 있도록 컴포넌트를 제공한다. 이같은 도구들은 개발을 무척 편리하게 해 줄 뿐만 아니라, 하나의 툴 안에서 개발에 필요한 모든 것을 해결할 수 있도록 All-In-One 형식으로 구성되어 있어, 개발을 위해 여러 개의 툴을 사용할 필요가 없는 것이 장점이다.
하지만 과거에는 그렇지 않았다. 프로그래머들은 하나의 소프트웨어를 완성하기 위해 용도별로 여러 가지 툴을 바꿔가며 사용하는 과정을 수백 수천 번 반복해야 했다. 대표적으로 C/C++ 언어를 이용하여 소프트웨어를 개발하는 과정을 예로 들어 보자. 먼저 프로그래머가 편집기(메모장이나 vi, vim, emacs 등)에서 소스 코딩을 마치면, 커맨드 창을 열고 GCC 컴파일러에게 이 소스를 컴파일하라는 명령을 입력한다. 컴파일러가 소스 코드를 컴파일하는 과정에서 오류가 발생하면(물론, 이 경우 대부분은 문법 오류거나 오타인 경우가 많다) 그 오류 내용은 화면에 표시된다. 이를 확인한 프로그래머가 잘못된 부분과 원인을 찾아 고친 후 다시 컴파일한다. 이 과정이 수없이 반복된 끝에 드디어 오류 없이 컴파일이 완료되면, 이제 그 결과로 만들어진 파일을 실행해 보는 단계에 접어든다.
지금까지의 과정에서 발생했던 오류를 컴파일 오류(Compile Error)로 분류하는 반면, 파일을 직접 실행하면서 발생하는 오류는 런타임 오류(Runtime Error)라고 한다. 실행 시점에서 발생하는 오류라는 의미다(컴파일 오류보다 런타임 오류가 훨씬 잡아내기 힘들다).
런타임 오류가 발생하면 이제부터는 순수하게 경험의 영역이다. 프로그래머가 사용할 수 있는 온갖 수단을 동원해 원인을 찾아내야 한다. 이런 작업을 기계 사이에 끼어 들어가 있는 버그, 즉 벌레는 잡아낸다는 뜻으로 디버깅(Debugging)이라고 부른다. 코드 중간중간에 브레이크 코드나 로그 출력 구문을 집어넣어서 실행 과정 중 어느 단계에서 오류가 발생하는지 알아내는 방법을 많이 사용하지만, 경우에 따라서는 메모리 덤프(Memory Dump)를 떠서 메모리에 입력된 데이터를 분석하기도 한다. 이를 편리하게 해주는 툴인 디버거를 사용하는 경우도 많다. 실무 현장에서는 앞서 설명한 것보다 더 다양한 방법들이 런타임 오류를 찾아내는 데에 동원된다. 소프트웨어를 개발하는 데에 걸리는 시간의 절반 이상이 오류를 수정하는 과정에 사용된다는 것이 일반적인 지론이다.
이제 오류의 원인을 찾아내었다면 이를 고치기 위해 소스 코드를 다시 수정한다. 수정이 완료되면 커맨드 창을 열어 컴파일하고, 다시 그 결과로 나온 파일을 실행해본다. 먼저 기존의 런타임 오류가 제대로 해결되었는지 확인하고, 새로운 런타임 오류가 발생하지 않는지 체크한다. 실행한 애플리케이션이 원하는 결과를 내어놓을 때까지 이 과정을 무수히 반복하면 드디어 하나의 소프트웨어가 만들어진다.
개발 과정을 진행하는 동안 개발자들은 소스 코딩과 컴파일, 실행 및 디버깅을 위해 여러 가지 관련 툴들을 번갈아가며 사용해야 했다. 그러다 보니 번거롭기도 하고, 이 과정에서 오류가 발생하는 경우도 생겨서 개발 생산성이 좀처럼 나아지지 않는 문제가 대두하였다. 굳이 무어(Moore, Gordon)의 법칙을 예로 들지 않더라도 하드웨어는 폭발적으로 생산성이 극대화되고 있는 상황에서 소프트웨어의 발전 속도는 이에 따라가지 못하게 된 거다. 이른바 소프트웨어의 위기라고 하는 상황이다. 이를 극복하기 위한 노력의 하나로 소프트웨어의 개발 생산성 향상에 대한 방법이 모색되기 시작했다.
1.2 통합개발 환경의 등장
개발 생산성을 향상시키기 위한 방법론적 시작은 단순히 소스 코드를 작성하던 편집기에 컴파일러를 연동할 수 있는 기능을 제공하는 것에 불과했다. 편집기에서 소스 코드를 작성한 후 단축키나 정해진 버튼을 클릭하면 연결된 컴파일러를 실행하여 그 결과를 바로바로 콘솔창에 보여주는 수준이었다. 그 전에 편집기와 컴파일러를 서로 연동하는 과정이 필요했다. 그 정도에 만족하고 사용하는 사람들이 있는가 하면, 만족하지 못한 사람들도 많아서 소스 코딩과 컴파일, 실행, 디버깅, 그리고 배포 환경 등의 여러 가지 툴을 하나로 갖춘 통합적인 개발도구의 필요성이 증대되어 갔다.
이 과정에서 윈도우나 맥 OS, 리눅스의 X-Window, iOS나 안드로이드 등 그래픽 사용자 인터페이스를 기반으로 하는 다양한 운영체제들이 등장하면서, 소프트웨어 개발 시 UI 작업을 좀 더 쉽게 할 수 있는 도구들까지 만들어졌다. 시간이 지나면서 이런 그래픽 기반 도구들 역시 하나의 통합적인 개발 도구에 흡수되어 갔다. 다양한 툴들이 통합된 결과, 소스 코딩부터 디버깅뿐만 아니라 사용자 화면을 직접 그리거나 데이터 구조를 설계하고, 코딩의 편의를 돕는 자동 완성 기능까지 포함된 툴들이 등장하게 되었다. 이른바, 통합개발 환경(Integrated Development Environment, IDE)의 탄생이다.
통합개발 환경은 프로그래밍 개발과 관련된 모든 작업을 하나의 프로그램 안에서 처리할 수 있도록 개발 환경을 통합적으로 제공해주는 툴로서, 이 툴 이외의 부가적인 툴 설치가 거의 필요하지 않을 뿐만 아니라 내부에 포함된 여러 가지 도구가 서로 연동되기 때문에 개발 생산성을 극대화할 수 있다는 장점이 있다. 현대 프로그래밍에 와서 이들 통합개발 환경이 소프트웨어 개발에 미치는 영향은 무척 지대해서 이제는 IDE 없이 단순히 SDK만으로 상용 소프트웨어를 만든다는 것이 거의 불가능한 일이 되어 버렸다.
대중적이면서 주류인 언어들은 대부분 완성도 높은 IDE들을 하나 이상 가지고 있는데, 대표적인 것들이 자바 플랫폼 계열의 이클립스(Eclipse), MS 계열의 비주얼스튜디오(Visual Studio), Mac 계열의 Xcode 등이다. 물론 이들 이외에도 훨씬 더 많은 IDE가 공개되어 있으며, 일부는 무료로 제공되지만 일부는 유료로 판매되기도 한다. 잘 알려진 IDE에는 다음과 같은 것들이 있다.
통합개발 환경 | 개발사 | 운영체제 | 언어 |
---|---|---|---|
이클립스 (Eclipse) |
IBM, 이클립스 재단 | Window, Linux, Solaris, Mac OS X, AIX | JAVA, C, C++, PHP, JSP, Python |
비주얼 스튜디오 (Visual Studio) |
마이크로 소프트 | Window | Visual Basic, Visual C++, Visual C, Visual C#, F# |
델파이 (Delphi) |
코드기어 | Window | Object Pascal |
엑스코드 (Xcode) |
애플 | Mac OS X | C, C++, Objective-C, Objective-C++, Java, Cocoa, Carbon, GNU Pascal, C#, Perl, D |
넷빈즈 (Net Beans) |
썬 마이크로시스템즈, 넷빈즈 재단 |
MS-DOS | JAVA |
제이 디벨로퍼 (J Developer) |
오라클 | Linux, Solaris, Windows, HP-UX, OS-X | JAVA, SML, PL/SQL, BPEL, PHP, HTML |
제이 빌더 (J Builder) |
코드 기어 | Window | JAVA |
터보 C (Turbo-C) |
코드 기어 | MS-DOS | C, C++ |
위 표에 나열된 툴들이 개발 실무 현장에서 많이 사용되는 대표적인 IDE들이다. 그리고 이 중에서 iOS 개발자들이 사용하고, 우리가 실습 과정에서 사용할 툴은 바로 Xcode이다.
Leave a comment