iOS 어플 개발에 대한 몇가지 생각

ios_xcode

애플 개발자 프로그램에 등록한 기념으로 iOS 어플 개발에 대해 몇가지 생각을 나누고자 한다.

1. Objective-C

Objective-c로 개발됐던 NeXT를 기반으로 탄생한 OS X 및 iOS는 objective c 기반의 툴과 프레임워크 (또는 라이브러리)를 갖고 있다. 그렇다보니 이들 운영체제에서 동작하는 어플을 개발할 때 기본적으로 objective-c 라는 언어를 사용한다. 물론 크로스 플랫폼 툴 예를 들면, Xamarin을 이용해 C#을 쓰거나 Apache Cordova를 이용해 HTML5로도 iOS 어플을 개발할 수는 있다. 그렇지만 최근 몇년간 objective c의 사용률이 계속 증가하는 걸 보면 아직까지는 objective c로 어플 개발하는 것이 대세인 것 같다.

objective c는 언어 이름에서도 알수 있듯이  객체지향적 요소가 혼합된 c 언어라고 볼 수 있지 않을까 싶다. 필자가 objective c를 개인적으로 익혀보니 c언어와 c++,  java, python 같은 객체지향 언어를 사용할 줄 아는 개발자라면 objective c를 익히는데 그리 큰 시간이 들지 않을 것이다. 클래스 표기 방법이나, 객체 생성 삭제, 메소드 호출 방법 등 문법적 차이만 있을뿐 기본적으로 다른 객체지향 언어와 용도는 같다.

물론 objective c 만의 독특한 기능들도 있는데 유효하지 않은 객체에 접근할 때 0을 리턴해주는 nil 객체라던지 (c,c++에선 segfault로 프로그램이 종료-_-;) 기존 클래스를 변경하거나 상속하지 않고도 해당 클래스에 메소드를 추가해서 쓸 수 있는 카테고리(Category) 기능이 필자에겐 인상적이었다. 카테고리는 개발 초기보다 릴리즈 이후 기능 추가를 해야 할 경우에 유용하지 않을까 생각된다.

objective c 를 위한 자료는 구글링을 해보면 정말 많이 찾을 수 있지만, 필자가 본 것중 괜찮은 자료 몇개를 공유한다.

http://www.otierney.net/objective-c.html.ko

http://cocoadevcentral.com/d/learn_objectivec

2. xcode 그리고 cocoa touch storyboard

많은 개발자들이 칭찬하는 애플의 xcode ide. 내가 써보기 전에는 공감할 수 없었다. 필자는 소프트웨어를 개발하면서 SDK나 IDE 같이 UI 가진 툴을 거의 쓰지 않았다. 필자는 리눅스 기반에서 코딩을 해온지라 커맨드라인 툴들인 vi, ctag, gnu 툴체인, gdb 정도만 있으면 개발, 디버깅엔 문제가 없었다. 무엇보다 마우스를 옮기며 클릭하는 것에 비해 움직임이 적었기 때문에 내가 생각하는 바를 좀 더 빨리 수행할 수 있었기에 커맨드라인 환경을 더 선호했었다. 필자가 이런 배경을 가지고 있었던터라 xcode 이용해 코딩하는거에 약간의 거부감이 있었으나 며칠을 사용해보고 나서 생각이 달라졌다. xcode. 정말 잘 만든 ide 이다!

내가 제대로된 어플을 개발해본적은 없지만, xcode 상에서 직관적으로 UI를 만들고 로직을 붙일 수 있었다. storyboard 를 이용하면 버튼, 라벨, 네비게이션 바 등 iOS7 위젯들을 쉽게 추가할 수 있다. storyboard는 단순히 스케치북이라 생각하면 될 것 같다. 생각하는 어떤 UI가 있다면 storyboard 상에서 드래그 앤 드랍으로 덕지덕지(?) 붙인 후 시뮬레이터로 구동시켜서 어떤 느낌을 주는지 확인해볼 수 있다. 물론 사용자와 인터랙션을 해야 하는 시나리오, 가령 버튼을 클릭하면 배경화면이 바뀌는 등의 일을 하려면 storyboard와 소스코드를 연동해야만 가능하다.

xcode에서 project 하나를 만드면 xcode 가 자동으로 기본 소스 파일을 생성하면서 템플릿 코드들을 추가해준다. 템플릿 코드에는 어플의 라이프 사이클 관련 이벤트 핸들러들이 들어 있으며 템플릿 타입(게임 등)에 따라 추가적인 템플릿 파일을 생성해준다. 특정 이벤트 발생시 수행해야 할 작업이 있다면 iOS 어플 개발자는 이들 핸들러를 구현해주어야 한다. 템플릿이 생성해주는 것은 정말 기본적인 몇가지 밖에 되지 않기 때문에 개발자가 자신의 어플을 만들면서 각종 위젯과 이에 따른 이벤트 처리들을 직접 추가 및 구현해주어야 한다.

storyboard에 추가한 위젯 (버튼, 텍스트 입력 등)와 소스코드를 연결할때 핵심 부분을 간략히 정리하자면 다음과 같다. 우선 소스코드에 storyboard상에 붙여놓은 해당 위젯 타입으로 멤버 변수를 선언해주어야 한다. 이 때 storyboard 상의 위젯을 가리킨다는 의미로 변수형 앞에 IBOutlet 지시어를 꼭 넣어주어야 한다. 그리고 storyboard 내 Outlets 리스트에서 해당 IBOutlet 변수를 선택하여 연결하고 싶은 위젯에 Ctrl + 드래그앤드랍를 해주면 storyboard 상 위젯이 소스코드 상의 멤버 변수라는 것을 xcode(정확히는 Interface Builder)에게 알려주게 된다. 이후 부터는 소스코드 상에서 해당 위젯의 속성을 변경하거나 해당 위젯이 제공하는 특정 이벤트 핸들러들을 구현하여 처리해줄 수 있다.

반대로 특정 위젯 위에서의 사용자의 터치나 제스처가 발생했을 때 무언가 처리를 해주어야 한다면, 소스코드에서 IBAction 지시자를 넣어 메소드를 생성하고 이를 storyboard 내 Recieved Actions 리스트에서 해당 IBAction 메소드를 선택하여 연결하고 싶은 위젯에 Ctrl + 드래그앤드랍를 해주면 된다. 이 때 받을 이벤트나 제스처를 선택해야 할 수 있도록 팝업이 뜨고 그 중 하나를 선택하면 된다. 이를 통해 개발자는 사용자의 터치나 제스처 입력에 대해 처리할 수 있다.

그리고 뜬금없지만.. xcode 내 editor 는 자동 완성 기능이 아주 좋은 것 같다. vi에서는 ctag와 연동해 별도 설정을 해야만 했던 기능인데 xcode에서는 디폴트로 동작한다.

3. 개발 참고 문서

objective c와 xcode 를 이용해서 iOS 어플을 어떻게 만드는지 경험해보고 싶다면, 아래 애플의 개발자 문서를 추천한다. 필자는 인터넷에 떠도는 여러 튜토리얼을 읽어보았는데 애플 문서 만큼 iOS를 개발하는데 필요한 여러 내용들을 잘 정리한 건 없었던 것 같다.

https://developer.apple.com/library/ios/referencelibrary/GettingStarted/RoadMapiOS/index.html#//apple_ref/doc/uid/TP40011343

그 외 아래 튜토리얼도 지루하지 않고 꽤나 괜찮았다.

http://www.raywenderlich.com/tutorials

본격적으로 iOS 어플 개발을 하게 된다면 API 등 참고해야 할 내용들이 아주 많아질텐데 애플 개발자 사이트에 문서화가 너무나도 잘 되어 있어서 다행이다.

https://developer.apple.com/library/ios/navigation/

마지막으로 개발자 포럼 사이트이다. stackoverflow 에서도 왠만한 답은 얻을 수 있겠지만 여기 커뮤니티도 꽤나 크니 활용할만하다.

https://devforums.apple.com

4. 3rd party 개발자 그리고 철학

나는 타이젠 플랫폼 구체적으로 web framework 을 개발하던 사람으로서 외부에 공개되는 기능을 정의하고 개발할 때 3rd party 개발자 입장에서 생각하면서 만드려고 노력했었다. 3rd party 개발자라면 이런 기능이 필요할까. API의 원형은 어떤게 더 효율적일까. 문서는 충분히 만들어졌나. 개발자들이 이것을 이용해 내가 의도한대로 사용해줄까. 이 기능 때문에 개발자가 몰려들까. 이런 류의 질문을 스스로 던지곤 했었다. 타이젠 에코시스템이 아직 자리 잡지 않은 상황이고 개발자 풀이 적은 상황에서 정답을 얘기해줄 수 있는 사람이 사실 주변에 없었다. 나 역시 3rd party 개발자로서의 경험이 없기 때문에 스스로 던지는 질문에 늘 예측만 할 뿐이었다.

며칠간 iOS 개발을 위해 환경을 설정하고 기본 기술을 익히고 사용해보면서, 아 이걸로 제대로 된 어플 하나 만들 수 있겠다 하는 생각이 들었다. iOS의 심플한 UX를 추구하면서 사람들에게 도움이 되는 무언가를 나눌 수 있다는 사실에 의욕이 생긴다. 3rd party 개발자 입장이 되보니 플랫폼에서 중요한게 무엇인지 하나씩 알아가게 되는 것 같다. 에코시스템, 개발환경, 개발 문서 그리고 커뮤니티 모두 중요하지만, 개발자들의 참여를 자발적으로 이끌어낼 수 있는 철학이 무엇보다 중요하지 않을까 싶다.

자, 그럼 이제부터 시작해보자.

My name is Yunchan Cho. I love web and its technology. I hope that my life makes peoples to be inspired and encouraged. twitter: @yunchancho

Posted in Technical Note

Leave a comment