생전 처음 해보는 iOS8 앱 24시간 안에 개발하기 > 개발정보

본문 바로가기

검색취소

생전 처음 해보는 iOS8 앱 24시간 안에 개발하기

검색 다음 목록

본문

2014년 11월 29일 토요일

생전 처음 해보는 iOS8 앱 24시간 안에 개발하기 - 8시간

이 포스트는 iOS의 어플리케이션 프레임워크와 랭기지를 전혀 모르는 상태에서 24시간안에 IoT앱을 만드는 과정 중 8시간을 다루고 있습니다. 소프트웨어 개발은 코딩이 아니라는 생각의 작은 증명과 혹독한 환경에서 무엇인가 느끼는것이 목적입니다. 개발 전과정의 자료는 공개된 자료만을 사용해서 저의 접근 방법을 검증 또는 따라할 수 있게 했습니다.

0시간 - 첼린지 시작

20141127_184309.jpg

첼린지에 필요한 모든 재료가 도착했습니다. 노트북을 먼져 받았고 일주일 뒤 아이폰을 받았습니다. 둘 다 운영체제를 업데이트 했습니다.

20141128_141316.jpg

첼린지 시작 직전의 모습입니다. 테블릿에 타이머를 8시간으로 맞췄습니다. 연속으로 24시간을 진행하는것은 여건이 안되고 연구노트를 정리하여 포스트를 할수 없기 때문에 시간이되는데로 8시간씩 3일을 진행합니다. 책상위에 작업에 필요한 모든것이 한눈에 들어오게 배치했습니다. 중앙에는 Xcode6를 왼쪽에는 애플 개발 래퍼런스, 노트북에는 iBook에서 받은 Swift 언어 교재와 Object C 언어 교재를 배치했습니다. 아이폰은 클립을 이용해서 기기 테스트가 편하게 배치했습니다.

0.2시간 - Object C와 Swift, 프로그램밍 언어의 선택

iOS앱은 기존의 Object C나 iOS8과 같이 발표된 Swift 언어를 이용해서 개발합니다. 각각의 언어로 빈 프로젝트를 만들고 만들어진 소스코드를 분석했습니다. Object C는 제가 아는 C 언어와 차이가 컸습니다. Swift도 기존에 알고 있던 언어와 차이가있습니다. 결국 Object C를 선택하든 Swift 선택하든 모르는것이 마찬가지입니다. 하지만 Object C는 함수 호출 방식의 가독성이 떨어졌고 Swift 랭기지의 이름이 마음에 들어서 Swift를 선택했습니다. 하지만 Swift는 역사가 짧고 인터넷의 래퍼런스 대부분이 Object C이기 때문에 Swift를 선택할 경우 Object C로 짜여진 코드를 읽을 수 있어야하는 추가 비용이 발생합니다. 하지만 큰 문제는 없다고 예상했습니다. 왜냐하면 우리가 사용하는 한국어와 같은 자연언어와 프로그램밍 언어를 다르기 때문입니다. 자연어는 문화를 반영하여 풍부한 표현의 성격이 있지만 프로그램밍 언어는 인위적으로 만든 언어기 때문에 효율성을 고려하여 기본 원리가 전체 언어에 녹아 있기 때문에 이 원리만 알면 쉽게 익힐 수 있습니다.

%EC%9D%B4%EB%AF%B8%EC%A7%80%2B1.png

프로그래머가 코딩을 하면 테스트를 하기 위해 컴파일을 합니다. 컴파일 절차 중 가장 처음 하는것이 Lexical 분석입니다. 언어의 정의대로 문자, 숫자, 기호등이 적절히 왔는지 확인하는 절차입니다. 이 구조를 바탕으로 문법을 추론할 수가 있습니다. 저한테 익숙한 자바 언어와 차이를 추론한 결과는 다음과 같습니다.

  1. 구문의 끝에 ';' 필요없음
  2. if 구문에 '(', ')' 필요없음
  3. 변수 선언에 '!', '?'가 사용됨
  4. for 문에 '(', ')'를 안쓸 수 있음
  5. 타이프 캐스팅에는 is, as가 쓰임
  6. 변수의 값은 nil이 될 수 있음
  7. 다중 상속이 가능하며 상속 대상은 ':' 뒤에 쓰고 ','로 구분함
  8. init은 예약어
  9. main과 같은 명시적 진입점이 필요 없음
  10. 배열에서 [key,value]의 형태로 쓸수 있음
Lexical 구조를 바탕으로 기존에 알고 있던 자바 랭기지를 머리속에서 재구성했습니다. 핼로월드와 튜토리알로 접근할 시간이 없기 때문에 추론한 Swift 문법으로 마음대로 코딩했습니다.

0.5 시간 - Application Life-Cycle

어플리케이션 라이프사이클은 프레임워크에 의해 어플리케이션이 로딩되고 실행되고 대기 상태로 가고 종료되는 사이클을 말합니다. 이 사이클이 중요한 이유는 어떤 부분이 가장 먼저 실행이 되는지 알수 있고 자원 반환은 어디서 해야하는지 알수 있기 때문입니다. 프레임워크 초반에 반드시 이 설명이 들어 있습니다. 

high_level_flow_2x.png

App Programming Guide for iOS 중 삽화


답답하게도 설명에서는 어떤시점에 앱이 종료되는지 명확한 명시가 없습니다. 언제든 리소스 반환을 위해 종료될 수 있으니 항상 상태를 저장해야한다는 가이드만 있습니다.

core_objects_2x.png

iOS 프레임워크는 Model - View - Control로 구성됩니다. 이 세가지를 만들면됩니다. 여기까지 가상의 나만의 Swift문법과 프레임워크를 파악하게 됩니다.

0.8시간 - Xcode 6 - 더블클릭하면 안되

%EC%9D%B4%EB%AF%B8%EC%A7%80%2B2.png


Xcode는 MSDN이나 이클립스와 같은 모던 통합개발환경과 비슷하여 쉽게 접근할 수 있습니다. 하지만 명령아이콘이 낯설어서 메뉴만을 이용했습니다. Xcode를 쓰면서 당황한 부분은 더블클릭입니다. 소스코드를 더블클릭하면 보던 화면이 사라지고 새창이 뜨는데 왜 이런지 몰라서 어리둥절했습니다. 보던 화면을 불러오는 방법을 몰라서 다시 껐다 키기도 했습니다. 더블클릭을 하면 새창에서 열리고 원클릭을 하면 보던 창에서 열립니다.

1시간 - 실제 기기에 실행하려면 11만원을 내시오


많은분들이 저의 도전에 격려와 조언을 해주셨는데 애플 개발자 등록을 미리 하라는것이었습니다. 개발자 등록은 Apple ID 등록과 프로그램 등록이 있습니다. 전 ID등록으로 이해해서 계정만 등록한 상태였습니다. 아이폰을 케이블로 연결하면 Xcode에 기기가 보입니다. 대상을 기기로 선택하고 실행을 하면 시뮬레이터 대신에 기기에서 테스트가 가능합니다. 이번 도전은 블루투스를 사용하기 때문에 시뮬레이터에서 테스트를 할수가 없습니다. 기기 연결/선택 후 실행을 누르면 개발자 계졍을 연결하고 등록하라는 메시지가 나옵니다. 개인정보를 입력하고 한화로 11만원을 내면 1년간 2번의 기술지원과 애플 스토어에 배포할 권리를 갖게됩니다.

%EC%9D%B4%EB%AF%B8%EC%A7%80%2B3.png

Xcode6 이전에는 배포에 사용할 인증서 만드는 절차가 번거로운것 같은데 6에서는 개발자 프로그램 등록을 하면 쉽게 됩니다. 넥스트만 몇번 클릭하면됩니다. 기기를 대상으로 실행시 USB 허브로 연결하면 잘 안됩니다. 본체에 꼽는것을 권합니다.

1.5시간 - MVC 중 어떤것을 먼져 만드는것이 효과적일까?

이 첼린지 전에 물어봤다면 망설임없이 Model 이라고 말했을겁니다. 하지만 이번 첼린지 처럼 혹독한 상황이라면 Control 부터 만드는것이 효과적입니다. 왜냐하면 그동안의 프로젝트 경험을 비추얼 볼때 실제 프로젝트에서 사용하는 모델 보다 과도하게 모델을 만드는 경향이 있기 때문입니다. Control부터 만들면 전체 어플리케이션이 보입니다. 때문에 과하게 개발하는것을 막을 수 있습니다. 반드시 소프트웨어 엔지니어는 어플리케이션 아키텍처를 기반하여 자신이 개발하는 어플리케이션의 전체 흐름을 설명할 수 있어야합니다. 그 흐름의 중심은 Control입니다. 그동안 Model과 View에 치어서 괄시 받던 존재입니다.

2시간 - 첫번째 요구사항을 처리하다


1926676_1568000700097185_988324666692361043_n.jpg10412028_1568000713430517_6114754749031212082_n.jpg

2시간이 조금 지난후에 첫번째 요구사항인 기기의 상태를 보여주는 요구사항을 처리했습니다. 결과 화면에서 보듯이 아이폰은 상태창이 앱 위에 오버레이 되기 때문에 화면 설계의 수정이 필요했습니다. 이런 추가 사항은 바로 처리하는것 보다 일단 일감으로 등록하는것이 좋습니다. 개발 진행의 흐름을 유지할 수 있고 더 좋은 방법을 찾을 수 있기 때문입니다. 화면이 잘리는 문제와 이전 화면으로 갈수 없는것도 문제입니다.

3시간 - 클래스의 설계

하나의 클래스는 하나의 대상만 처리한다. 메소드는 하나의 목적만 수행한다. 이 두가지는 클래스 설계에 매우 중요한 기본원칙입니다. Xcode로 프로젝트를 생성하면 기본적으로 AppDelegate와 ViewController가 만들어집니다. 이곳에 모든 코드를 넣을수 있습니다. 하지만 이럴 경우 가독성이 떨어지고 문제를 찾기 어렵기 때문에 비콘 모델을 관리하고 제어할 수 있는 클래스를 추가했습니다.

class BeaconProvider : NSObjectCBCentralManagerDelegateCBPeripheralDelegate{
    var centralManager : CBCentralManager!;
    // 블루투스 장치 준비
    func startup(){
        centralManager = CBCentralManager(delegate:self, queue:nil);
    }
    // 블루투스 스캔 정지.
    func stopScan(){
        println("stop discovering devices");
        centralManager.stopScan();
    }
    // 블루투스 스캔 시작.
    func startScan() {
        println("discovering devices");
        centralManager.scanForPeripheralsWithServices(nil, options: nil);
        

    }
}

Swift는 강력한 타입체크와 변수형태 체크를 합니다. 위코드 중 CBCentralManager!는 해당 변수는 값이 없는 상태를 허용한다는뜻입니다. 이러한 명시적인 변수형태 때문에 강력한 예외처리를 제공하는 자바 언어보다 fatal error가 작게 발생합니다. 이러한 요소 때문에 결과물의 신뢰성이 올라갑니다.

4시간 - 굉음을 내는 쿨링팬과 쓰러지는 Xcode

10480226_1568027306761191_9197801702420221135_n.jpg
두번째 요구사항은 기기의 상세 정보를 보여주는것입니다

사용한 개발 기기는 맥북에어 2014입니다. 쿨링팬이 굉음을 내고 Xcode가 3번 정도 비정상 종료됐습니다. 개발환경 뿐만아니라 iOS 자체의 경험이 작기 때문에 평균 40개의 자료를 화면에 올려놓고 15개의 자료를 참고해야했습니다. 모니터를 2개 더 쓰기 위해서 USB 그래픽 카드도 하나 연결한 상태에서 노트북에 부하가 걸리기 시작했습니다. 부하를 줄이기 위해 웹서버는 윈도우 데스크탑으로 연결하고 원격제어 대신에 인풋이 2개인 모니터의 입력 전환으로 제어했습니다. 웹 리소스는 윈도우 PC에서 개발했습니다.

6시간 - 블루투스 Gatt 제어

6시간 결과물

블르투스는 표준화된 기술이기 때문에 기존의 블루투스 지식을 바탕으로 필요 API만 찾는식으로 빠르게 개발됐습니다. 이식성 때문에 표준기술의 사용은 중요합니다.

%EC%9D%B4%EB%AF%B8%EC%A7%80%2B4.png

애플의 문서는 블루투스를 몰라도 개발이 쉽도록 좋은 문서를 제공합니다. 세부 코드는 Object C된 자료라 다시 Swift로 바꿔야해서 약간 어려웠습니다.

8시간 - 느낀점 정리

8시간 결과물


언어의 lexical format만으로 언어의 대부분의 파악이 가능하다.
요즘 언어책들은 Lexical를 다루지 않습니다. 수많은 예제로 언어 학습을 유도합니다. 프로그램밍 랭기지는 자연어와 다릅니다. 프로그램밍 언어 학습 방법을 바꿔보세요.

타이핑을 줄여준다고 개발속도가 빨라지는것은 아니다, 쉬운 표현식은 쾌속 개발의 큰 요인이 아니다.
프로젝트 진행시 소프트웨어 엔지니어들이 새로운 언어의 사용을 원할때가 있습니다. 새로운 언어의 장점으로 많이 내새우는 것이 쉬운 표현식, 다르게 말하면 적게 타이핑하고 만들수 있다는점이죠. 하지만 여러분도 알고 저도 알듯이 프로젝트가 타이핑이 많아서 늦어지는것이 아닙니다. 코드는 빠르게 만드는것 보다 만든 코드를 쉽게 이해하고 신뢰있는 코드를 만드는것이 중요합니다.

프로그램밍언어론 + 아무 언어 경험은 새로운 언어를 가장 빠르게 배우는 방법이다.
캐캐묵은 이야기를 하나 꺼내면 스프트웨어 개발에서 전공이 도움이 되냐는 이야기를 꺼냅니다. 당연히 도움이 매우 크게 됩니다. 전산 관련 전공에는 커리큘럼에 프로그램밍 언어론이 포함됐습니다. 언어를 이용해서 만드는법이 아닌 언어의 원리와 평가 방법을 배우는 과정입니다. 이를 통해 언어 설계와 컴파일러 설계 머신 설계를 할 수 있습니다. 뿐만아니라 저처럼 연역법으로 프로그램밍 언어를 익히고 사용할 수 있습니다.

노트북에서 빠른 개발은 무리다, 노트북은 모바일 기기다.
아무리 빠른 노트북도 모바일 기기입니다. 하드웨어 설계 포인트가 다른 기기입니다. 소프트웨어 엔지니어에게 노트북을 주고 일하라는것은 건강을 생각해서 쉬엄 쉬엄 일하라는뜻입니다.

시물레이터 보다 실기기로 개발하는것이 빠르다.
과거에는 기기가 매우 고가이고 접근이 어려워서 시뮬레이터를 많이 사용했으나 지금은 실기기로 개발하는것이 효과적입니다.

집중에는 약간의 소음이 필요하다.
Noisli.png

http://www.noisli.com/
첼린지를 시작할때 비와 천둥소리를 백색소음으로 사용했습니다. 완전고요는 인간의 섭리에 안맞습니다. 백색소음을 사용해보세요.






정보의 소비 속도가 빠르다면 다수의 큰 디스플레이로 생산력을 올릴수 있다.
과거에는 소프트웨어 엔지니어 채용시 회사의 장점으로 모니터 2대 주는것을 자랑한적이 있습니다. 사실 모니터 여러개 주면 엔지니어가 좋은게 아니고 회사가 좋은겁니다.

모던 랭기지는 다수의 디바이스에서 구동되는것을 목표로하기 때문에 가상머신을 사용하고 특성이 비슷하다
바로 원시코드로 컴파일되어 실행되는 구조가 아니라 가상 머신에 의해 해석되는 구조로 실행됩니다. 가상머신이 끼면 언어의 특성이 비슷해집니다. 따라서 우리가 모든 플랫폼을 경험하는것이 어렵기 때문에 모든 플랫폼을 아키텍처적으로 추상화하여 연역법으로 접근하는것이 필요합니다.


참고

생전 처음 해보는 iOS8 앱 24시간 안에 개발하기 - 프롤로그

저자에 대해서

face.png




10년 동안 소프트웨어 엔지니어/아키텍트로 일해온 허원진입니다.
소프트웨어는 가상머신 개발과 같은 코어 부터 앱 개발까지 넓은 스팩트럼을 유지하여 명품 소프트웨어를 만들기 위해 노력하고 있습니다.
인류의 삶을 변화시킬 IoT기업에 대한 투자와 소프트웨어 영역의 파트너 참여를 원하고 있습니다. baramnemse@gmail.com으로 연락 주십시오.

감사합니다. 

 

 

출처 : http://angeliot.blogspot.kr/2014/11/ios8-24-8.html

추천 0

등록된 댓글이 없습니다.

검색취소

개발정보

검색
  • 생전 처음 해보는 iOS8 앱 24시간 안에 개발하기
  • 생전 처음 해보는 iOS8 앱 24시간 안에 개발하기

    2014년 11월 29일 토요일생전 처음 해보는 iOS8 앱 24시간 안에 개발하기 - 8시간이 포스트는 iOS의 어플리케이션 프레임워크와 랭기지를 전혀 모르는 상태에서 24시간안에 IoT앱을 만드는 과정 중 8시간…

  • no image
  • K-WAH 4.0

    다운로드 접속자가 폭주하여 다운로드가 중간에 끊길 수 있습니다.파일의 정상 용량은 60.2MB이며 정상적으로 다운되지 않았을 경우 다시 다운로드 하시기 바랍니다.K-WAH4.0을 설치하시기 전에 아래 기본요구사양의 …

  • 2014년 최고의 HTML5 애니메이션 제작 프로그램
  • 2014년 최고의 HTML5 애니메이션 제작 프로그램

    첨부파일

     2014년 최고의 HTML5 애니메이션 제작 프로그램   HTML5 등장 이전에는 웹에서 구현되는 애니메이션의 대부분은 플래시로 제작되었습니다. 플래시는 개발자가 아닌 디자이너도 애니메이션을 제작할수 있도록 강력하…

  • Ubuntu와 Mint  중에  데스크탑엔 Mint 추천
  • Ubuntu와 Mint 중에 데스크탑엔 Mint 추천

    첨부파일

    프로그래머는 아니지만,Linux를 사용해 보려고 노력하는 사람입니다. Linux 는 쓸수록 편리하면서,안정적이고,빠르네요 사양이 낮은 컴퓨터를 빠른 컴퓨터로 업그레이드 시켜주는 군요 올해 4월이니까.몇달 됬네요 처음…

  • 2013년 4월 리눅스 배포판 순위
  • 2013년 4월 리눅스 배포판 순위

    2013년 4월 리눅스 배포판 순위 리눅스 배포판의 실사용 순위는 아니지만 DistoWatch에서 제공하는 Page Hit Ranking입니다. Mint는 최근 12개월 동안뿐만 아니라 그 이전부터  1위를 고수하고…

  • no image
  • 블로그 소스 무엇이 좋을까?

    블로그 소스 무엇이 좋을까?   Tattertools을 쓰기전에 pMachine를 섰었다. 한 2달 정도. Tattertools도 많은 제약이 있지만.. 제일 문제가 되는건. 글쓸때 html을 그대로 보여주기 힘…

?>