시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

109
  • date post

    22-Jul-2016
  • Category

    Documents

  • view

    252
  • download

    6

description

데이브 마크, 잭 너팅, 제프 라마시 지음 | 유윤선 옮김 | 임베디드 & 모바일 시리즈 _ 023 | ISBN: 9788992939676 | 38,000원 | 2012년 05월 3일 발행 | 864쪽

Transcript of 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

Page 1: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발
Page 2: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발
Page 3: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

시작하세요!아이폰 5

프로그래밍

Page 4: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

iv

•목 차•

01장 __ 정글에 온 것을 환영한다 1이 책에 대한 소개 ...............................................................................................1

책에 필요한 도구 ................................................................................................2

개발자 옵션 ..................................................................................................4

책을 이해하는 데 필요한 배경 지식 ...........................................................6

iOS 코딩의 차이점 .............................................................................................7

단 하나뿐인 활성 애플리케이션 .................................................................8

단 하나뿐인 창 .............................................................................................8

제한된 접근 ..................................................................................................8

제한된 응답 시간 .........................................................................................8

제한된 화면 크기 .........................................................................................9

제한된 시스템 자원 .....................................................................................9

가비지 컬렉션은 없지만... ........................................................................10

코코아 터치의 고유 기능 ..........................................................................11

다른 접근 방식 ...........................................................................................11

이 책에서 다루는 내용 .................................................................................... 12

개정판에서 달라진 점 ..................................................................................... 14

시작할 준비가 되었나? ................................................................................... 14

Page 5: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

v

02장 __ 티키 신 달래기 17엑스코드에서의 프로젝트 설정 ..................................................................... 17

엑스코드 워크스페이스 창........................................................................23

프로젝트 자세히 살펴보기........................................................................33

엑스코드 인터페이스 빌더의 소개 ................................................................ 36

Nib 파일에 포함된 내용 ............................................................................38

라이브러리 .................................................................................................39

뷰에 라벨 추가하기 ...................................................................................41

속성의 변경 ................................................................................................44

아이폰 앱처럼 다듬기 - 화룡점정 .................................................................. 46

정리하며... ........................................................................................................ 53

03장 __ 기본 상호작용 처리 55모델-뷰-컨트롤러 패러다임 ........................................................................... 56

프로젝트의 생성 .............................................................................................. 57

뷰 컨트롤러 살펴보기 ..................................................................................... 58

아웃렛과 액션의 이해 ...............................................................................60

뷰 컨트롤러 정리하기 ...............................................................................64

UI 디자인 ...................................................................................................64

테스트 .........................................................................................................78

애플리케이션 델리게이트 살펴보기 ............................................................. 79

내용 정리 .......................................................................................................... 83

Page 6: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

vi

04장 __ 더 재미있는 사용자 인터페이스 85컨트롤로 가득 찬 화면 .................................................................................... 86

능동적, 정적, 수동적 컨트롤 .......................................................................... 88

애플리케이션의 생성 ...................................................................................... 90

이미지 뷰와 텍스트 필드의 구현 ................................................................... 90

이미지 뷰의 추가 .......................................................................................91

이미지 뷰의 크기 조절 ..............................................................................93

뷰 어트리뷰트의 설정 ...............................................................................95

텍스트 필드의 추가 ...................................................................................99

아웃렛의 생성과 연결 .............................................................................106

키보드 닫기 .................................................................................................... 108

Done을 탭할 때 키보드 닫기 ..................................................................109

배경을 터치할 때 키보드 닫기 ................................................................111

슬라이더와 라벨 추가 .............................................................................114

액션 및 아웃렛의 생성과 연결 ................................................................117

액션 메서드의 구현 .................................................................................117

스위치, 버튼, 분할 컨트롤의 구현 ............................................................... 118

스위치 액션의 구현 .................................................................................121

분할 컨트롤의 액션 구현 .............................................................................. 123

액션 시트와 경고창의 구현 .......................................................................... 124

액션 시트 델리게이트 메서드 따르기 ....................................................125

액션 시트 보여주기 .................................................................................125

버튼 꾸미기 .................................................................................................... 129

viewDidLoad 메서드의 활용..................................................................130

컨트롤의 상태 ..........................................................................................131

확장 가능 이미지 .....................................................................................132

결승선 통과하기 ............................................................................................ 133

Page 7: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

vii

05장 __ 자동 회전과 자동 크기 조절 135자동 회전 기법 ............................................................................................... 136

포인트, 픽셀, 레티나 디스플레이 ...........................................................137

자동 회전 접근 방식 ................................................................................137

Autosize 어트리뷰트를 활용한 회전 처리 .................................................. 138

지원 방향의 설정 .....................................................................................138

지원 방향의 지정 .....................................................................................140

Autosize 어트리뷰트를 활용한 인터페이스 디자인 .............................141

사이즈 인스펙터의 Autosize 어트리뷰트 활용 .....................................143

버튼의 Autosize 어트리뷰트 설정 .........................................................145

기기 회전 시 뷰 구조의 변경 ........................................................................ 147

아웃렛의 생성과 연결 .............................................................................148

회전 시 버튼 움직이기 ............................................................................149

뷰 대체하기 .................................................................................................... 149

두 개의 뷰 디자인 ....................................................................................152

뷰 대체 기능 구현하기 ............................................................................154

아웃렛 컬렉션의 수정 .............................................................................156

이곳에서 빠져나가기 .................................................................................... 157

06장 __ 멀티 뷰 애플리케이션 159자주 사용하는 멀티 뷰 애플리케이션 형태 ................................................ 159

멀티 뷰 애플리케이션의 아키텍처 .............................................................. 164

루트 컨트롤러 ..........................................................................................166

콘텐츠 뷰의 해부 .....................................................................................167

View Switcher 애플리케이션의 개발 .......................................................... 168

뷰 컨트롤러 및 Nib 파일의 생성 ............................................................169

애플리케이션 델리게이트의 수정 ..........................................................172

BIDSwitchViewController.h의 수정 .....................................................174

뷰 컨트롤러의 추가 .................................................................................175

Page 8: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

viii

툴바를 활용한 뷰 개발 ............................................................................176

루트 뷰 컨트롤러의 작성 ........................................................................179

콘텐츠 뷰의 구현 .....................................................................................184

화면 전환 애니메이션 .............................................................................187

스위치를 내릴 시간 ....................................................................................... 191

07장 __ 탭 바와 피커 193Pickers 애플리케이션 ................................................................................... 194

델리게이트와 데이터 소스 ........................................................................... 198

탭 바 프레임워크의 설정 .............................................................................. 199

파일 생성 ..................................................................................................199

루트 뷰 컨트롤러의 추가 ........................................................................201

TabBarController.xib의 생성 .................................................................202

초기 테스트 실행 .....................................................................................211

데이트 피커의 구현 ....................................................................................... 212

단일 컴포넌트 피커의 구현 .......................................................................... 216

아웃렛과 액션의 선언 .............................................................................217

뷰의 개발 ..................................................................................................217

데이터 소스와 델리게이트로 활용할 컨트롤러의 구현 .......................219

멀티컴포넌트 피커의 구현 ........................................................................... 224

아웃렛과 액션의 선언 .............................................................................224

뷰의 개발 ..................................................................................................225

컨트롤러의 구현 ......................................................................................226

의존 컴포넌트의 구현 ................................................................................... 229

커스텀 피커를 활용한 간단한 게임 개발 .................................................... 237

컨트롤러 헤더 파일의 작성.....................................................................237

뷰의 개발 ..................................................................................................238

이미지 자원의 추가 .................................................................................240

컨트롤러의 구현 ......................................................................................240

Page 9: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

ix

마지막 디테일 ..........................................................................................246

Audio Toolbox 프레임워크의 연결 .......................................................250

마지막 스핀 .................................................................................................... 253

08장 __ 테이블 뷰의 소개 255테이블 뷰의 기본 ........................................................................................... 256

테이블 뷰와 테이블 뷰 셀 .......................................................................256

그룹 테이블과 일반 테이블.....................................................................258

간단한 테이블의 구현 ................................................................................... 260

뷰 디자인 ..................................................................................................260

컨트롤러의 작성 ......................................................................................261

이미지의 추가 ..........................................................................................266

테이블 뷰의 셀 스타일 활용....................................................................268

들여쓰기 수준의 설정 .............................................................................270

행 선택의 처리 .........................................................................................271

폰트 크기와 행 크기의 수정....................................................................273

테이블 뷰 셀의 커스터마이징 ...................................................................... 276

테이블 뷰 셀에 하위 뷰 추가 ...................................................................276

UITableViewCell 하위 클래스의 작성 ..................................................277

Nib을 통한 UITableViewCell 로드 ........................................................283

그룹 섹션과 인덱스 섹션 .............................................................................. 290

뷰의 개발 ..................................................................................................290

데이터 불러오기 ......................................................................................290

컨트롤러의 구현 ......................................................................................292

인덱스의 추가 ..........................................................................................296

검색 바의 구현 ............................................................................................... 297

설계에 대한 생각 정리 ............................................................................298

수정 가능 객체의 깊은 복사본 ................................................................299

컨트롤러 헤더 파일의 업데이트 .............................................................301

Page 10: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

x

뷰의 수정 ..................................................................................................303

컨트롤러 구현체의 수정 .........................................................................308

한 테이블 위에 올려놓고 정리하기 ............................................................. 323

09장 __ 내비게이션 컨트롤러와 테이블 뷰 325내비게이션 컨트롤러의 기본 ....................................................................... 326

스택이란? .................................................................................................326

컨트롤러의 스택 ......................................................................................327

6개 영역으로 구성된 계층적 애플리케이션 Nav ....................................... 328

하위 컨트롤러 살펴보기 .........................................................................328

Nav 애플리케이션의 골격 ......................................................................333

프로젝트에 이미지 추가 .........................................................................343

첫 번째 하위 컨트롤러: 더 보기 버튼 뷰 ................................................343

두 번째 하위 컨트롤러: 체크리스트 .......................................................353

세 번째 하위 컨트롤러: 테이블 행 내의 컨트롤 ....................................359

네 번째 하위 컨트롤러: 이동 가능한 행 .................................................367

다섯 번째 하위 컨트롤러: 삭제 가능한 행 .............................................374

여섯 번째 하위 컨트롤러: 편집 가능한 상세 영역 ................................381

그런데 남은 작업이 한 개 더 있다. . . .....................................................404

결승선 끊기 .................................................................................................... 407

10장 __ 스토리보드 409간단한 스토리보드의 생성 ........................................................................... 410

동적 프로토타입 셀 ....................................................................................... 414

스토리보드를 활용한 동적인 테이블 콘텐츠 ........................................414

프로토타입 셀의 편집 .............................................................................416

익숙한 테이블 뷰 데이터 소스 ................................................................417

로드될까? .................................................................................................421

정적 셀 ............................................................................................................ 421

Page 11: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

xi

정적 셀 작업 .............................................................................................422

안녕, 테이블 뷰 데이터 소스...................................................................424

Segue .............................................................................................................. 425

Segue 내비게이터의 생성 .......................................................................426

빈 공간 채우기 .........................................................................................427

첫 번째 화면 전환 ....................................................................................430

조금 더 유용한 할일 목록 .......................................................................430

할일 상세 화면 .........................................................................................432

더 많은 Segue의 생성 ..............................................................................433

리스트에서 할일 넘겨주기......................................................................433

할일 상세의 처리 .....................................................................................436

상세 값을 다시 전달하기 ........................................................................437

리스트가 상세 값 받게 하기....................................................................438

다음 장으로의 부드러운 전환 .................................................................439

11장 __ 아이패드에 대한 고려사항 441분할 뷰와 팝 오버 .......................................................................................... 441

분할 뷰 프로젝트의 생성 ........................................................................443

스토리보드를 활용한 구조 정의 .............................................................445

기능을 정의한 코드 .................................................................................447

대통령님이 오십니다 .................................................................................... 456

커스텀 팝 오버의 생성 .................................................................................. 463

아이패드 마무리 ............................................................................................ 471

12장 __ 애플리케이션 설정과 사용자 기본값 473설정 번들 이해하기 ....................................................................................... 473

AppSettings 애플리케이션........................................................................... 476

프로젝트의 생성 ......................................................................................479

설정 번들의 활용 .....................................................................................480

Page 12: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

xii

애플리케이션에서 설정 읽기 ..................................................................498

기본값의 등록 ..........................................................................................504

애플리케이션 내에서의 기본값 수정 .....................................................505

실제처럼 만들기 ......................................................................................508

스코티, 날 전송해줘 ...................................................................................... 513

13장 __ 데이터 영속성의 기본 515애플리케이션의 샌드박스 ............................................................................ 516

Documents 디렉터리 접근 .....................................................................517

tmp 디렉터리 접근 ..................................................................................518

파일 저장 전략 ............................................................................................... 519

단일 파일을 통한 영속화 ........................................................................519

여러 파일을 통한 영속화 ........................................................................519

프로퍼티 리스트의 활용 ............................................................................... 520

프로퍼티 리스트의 직렬화......................................................................520

데이터 영속성을 활용한 첫 번째 애플리케이션 ...................................522

모델 객체 아카이빙 ....................................................................................... 529

NSCoding 프로토콜 따르기 ...................................................................529

NSCopying의 구현 ..................................................................................531

데이터 객체의 아카이빙 및 아카이빙 해제 ...........................................531

아카이빙 애플리케이션 ..........................................................................533

iOS의 임베디드 SQLite3 활용 ..................................................................... 537

데이터베이스의 생성과 열기 ..................................................................538

바인드 변수의 활용 .................................................................................540

SQLite3 애플리케이션 ............................................................................541

코어 데이터의 활용 ....................................................................................... 549

엔티티와 관리 객체 .................................................................................551

코어 데이터 애플리케이션......................................................................556

영구적인 보상 ................................................................................................ 569

Page 13: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

xiii

14장 __ 아이클라우드 시작하기 571UIDocument를 활용한 문서 저장소 관리.................................................. 572

TinyPix 개발 ............................................................................................572

BIDTinyPixDocument의 생성 ..............................................................573

코드 마스터 ..............................................................................................577

초기 스토리보드 작업 .............................................................................585

BIDTinyPixView의 작성 ........................................................................588

상세 뷰 스토리보드 .................................................................................593

아이클라우드 지원 기능의 추가 .................................................................. 598

프로비저닝 프로파일의 생성 ..................................................................598

아이클라우드 자격의 활성화 ..................................................................600

조회 방법 ..................................................................................................600

어디에 저장할까? .....................................................................................603

아이클라우드에 환경설정 저장하기 ......................................................603

이 장에서 다루지 않은 내용 ......................................................................... 605

15장 __ 그랜드 센트럴 디스패치, 백그라운드 처리, 그리고 여러분 607

그랜드 센트럴 디스패치 ............................................................................... 607

SlowWorker의 소개 ...................................................................................... 608

스레딩의 기본 ................................................................................................ 612

작업 단위 ........................................................................................................ 613

GCD: 저수준 큐 ............................................................................................ 614

블록헤드 되기 ..........................................................................................615

SlowWorker의 개선.................................................................................616

백그라운드 처리 ............................................................................................ 623

애플리케이션 생명 주기 .........................................................................625

상태 변화 알림 .........................................................................................626

Page 14: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

xiv

실행 상태 살펴보기 .................................................................................629

실행 상태 변화의 활용 ............................................................................631

비활성 상태의 처리 .................................................................................633

백그라운드 상태의 처리 .........................................................................638

그랜드 센트럴 디스패치, 통신 끝! ............................................................... 651

16장 __ 쿼츠와 오픈지엘을 활용한 드로잉 653그래픽 세계의 두 가지 뷰 ............................................................................. 654

쿼츠 2D의 드로잉 접근 방식 ........................................................................ 655

쿼츠 2D의 그래픽 컨텍스트 ...................................................................655

좌표계 .......................................................................................................656

색상의 지정 ..............................................................................................658

컨텍스트 내에서의 이미지 드로잉 .........................................................660

도형 그리기: 다각형, 선, 곡선.................................................................661

쿼츠 2D 툴 예제 - 패턴, 그라이언트, 점선 패턴 ...................................661

QuartzFun 애플리케이션 ............................................................................ 663

QuartzFun 애플리케이션의 설정 ..........................................................663

쿼츠 2D 드로잉 코드의 추가 ..................................................................676

QuartzFun 애플리케이션의 최적화 ......................................................682

GLFun 애플리케이션 ................................................................................... 685

GLFun 애플리케이션의 설정 .................................................................686

BIDGLFunView의 생성 .........................................................................687

BIDViewController의 업데이트 ............................................................695

Nib 파일의 업데이트 ...............................................................................696

GLFun 애플리케이션의 마무리 .............................................................697

끝이 가까워지고 있다. .................................................................................. 697

Page 15: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

xv

17장 __ 탭, 터치, 제스처 699멀티터치 관련 용어 ....................................................................................... 700

리스폰더 체인 ................................................................................................ 701

이벤트에 반응하기 ..................................................................................701

리스폰더 체인을 활용한 이벤트 전달 ....................................................702

멀티터치 아키텍처 ........................................................................................ 703

네 가지 터치 알림 메서드 ............................................................................. 704

TouchExplorer 애플리케이션 ...................................................................... 705

Swipes 애플리케이션 .................................................................................... 710

자동 제스처 인식 .....................................................................................714

다중 스와이프의 구현 .............................................................................715

멀티 탭의 감지 ............................................................................................... 718

핀치의 감지 .................................................................................................... 724

커스텀 제스처의 정의 ................................................................................... 726

CheckPlease 애플리케이션 ....................................................................727

CheckPlease 터치 메서드 .......................................................................730

저기요? 확인 부탁해요! ................................................................................ 733

18장 __ 여기는 어디? 코어 로케이션을 활용한 길 찾기 735위치 관리자 .................................................................................................... 736

원하는 정확도의 설정 .............................................................................736

거리 필터의 설정 .....................................................................................737

위치 관리자의 사용 시작 ........................................................................737

위치 관리자의 현명한 활용법 .................................................................738

위치 관리자 델리게이트 ............................................................................... 738

위치 업데이트 받기 .................................................................................738

CLLocation을 활용한 위도와 경도 파악 ...............................................739

에러 통보 ..................................................................................................740

Page 16: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

xvi

코어 로케이션의 활용 ................................................................................... 742

위치 관리자 업데이트 .............................................................................746

이동 거리의 판단 .....................................................................................747

어디를 가든, 그 자리에 여러분이 있다 ....................................................... 747

19장 __ 야호! 자이로와 가속도계! 749가속도계 물리 이론 ....................................................................................... 749

회전을 잊지 말자 ........................................................................................... 751

코어 모션과 모션 관리자 .............................................................................. 751

이벤트 기반의 모션 .................................................................................752

적극적인 모션 접근 .................................................................................758

가속도계의 결과 ......................................................................................761

흔들림 감지 .................................................................................................... 762

흔들림 감지 내장 기능 ............................................................................763

흔들어서 깨뜨리기 ..................................................................................764

가속도계를 활용한 방향 제어 ...................................................................... 771

구슬 굴리기 ..............................................................................................771

BIDBallView의 작성 ...............................................................................774

구슬의 움직임 계산 .................................................................................777

계속 구르기 .................................................................................................... 781

20장 __ 카메라와 사진 라이브러리 783이미지 피커와 UIImagePickerController의 활용 ..................................... 783

이미지 피커 컨트롤러 델리게이트의 구현 ................................................. 786

카메라와 사진 라이브러리의 길거리 테스트 ............................................. 787

인터페이스 디자인 ..................................................................................790

카메라 뷰 컨트롤러의 구현.....................................................................790

식은 죽 먹기!.................................................................................................. 795

Page 17: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

xvii

21장 __ 애플리케이션 지역화 797지역화 아키텍처 ............................................................................................ 797

문자열 파일 .................................................................................................... 799

문자열 파일의 내용 .................................................................................800

지역화된 문자열 매크로 .........................................................................800

현실 세계의 iOS: 애플리케이션의 지역화 .................................................. 801

LocalizeMe 애플리케이션의 설정 .........................................................802

LocalizeMe의 테스트 ..............................................................................806

Nib 파일의 지역화 ...................................................................................807

이미지의 지역화 ......................................................................................811

문자열 파일의 생성과 지역화 .................................................................814

애플리케이션 표시 이름의 지역화 .........................................................816

안녕, 또 만나요 .............................................................................................. 818

22장 __ 이제 어디로? 821애플의 문서 .................................................................................................... 821

메일링 목록 .................................................................................................... 822

토론 포럼 ........................................................................................................ 823

웹 사이트 ........................................................................................................ 824

블로그 ............................................................................................................. 825

컨퍼런스 ......................................................................................................... 826

저자 트위터 팔로우 ....................................................................................... 827

작별 인사 ........................................................................................................ 828

찾아보기..............................................................................829

Page 18: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

xviii

스티브 잡스를 추억하며 이 책을 바친다.

우리는 그의 정신과 비전을 통해 앞으로도 계속해서 영감을 얻을 것이다.

Page 19: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

xix

•옮긴이 글•

이 책은 이미 한국 독자들이 잘 알고 있는 『시작하세요 아이폰 4 프로그래밍』의 개정판이다. 이

번 개정판에서는 새로워진 엑스코드 4.2와 iOS 5 SDK에 맞게 전체 프로젝트를 수정하고, iOS 5

SDK에서 새로 추가된 아이클라우드와 엑스코드의 새로운 작업 방식인 스토리보드를 소개하는

장을 두 개 추가했다. 더불어 ARC(객체 참조 카운팅)를 모든 프로젝트에 적용해 기존의 메모리

관리 방식을 새로워진 개발 환경에 맞게 수정하고, 최신 개발 기법을 적용해 모든 프로젝트를 수

정했다.

이 책의 예제는 모두 이전과 같은 애플리케이션을 개발하지만 접근 방식만큼은 크게 달라졌

다. 일례로 기존에 헤더에 아웃렛이나 액션 메서드를 선언하고 인터페이스 빌더로 이동해 아웃렛

이나 액션 메서드를 연결하는 방식에서 벗어나, 개정판에서는 코드로 드래그 기능을 활용해 액

션과 아웃렛을 생성하면서 바로 연결한다. 또 스토리보드를 활용해 복잡한 레이아웃을 개발하

는 법과, 아웃렛 컬렉션을 활용한 속성 관리법 등 이 책에는 iOS 5 SDK와 더불어 새로워진 엑스

코드 4.x 개발 환경의 최신 개발 정보가 모두 담겨 있다.

이 책에서 다루는 내용

이 책은 프로그래밍 도구 설치부터 iOS SDK의 고급 기능인 다중 스레딩 프로그래밍에 이르기까

지 iOS 프로그래밍과 관련한 모든 내용을 상세히 다룬다. 특별히 이번 개정판에서는 iOS 5 SDK

에서 새로 추가된 아이클라우드 백업 기능과 ARC를 활용한 속성 관리법, 스토리보드를 활용한

테이블 뷰 셀 디자인과 segue 활용법 등 최신 SDK와 최신 엑스코드에서 아이폰/아이패드/아이

팟 터치 애플리케이션을 개발하는 데 필요한 지식을 모두 다룬다.

이 책을 통해 독자들은 iOS 프로그래밍의 기본 원리를 쉽게 익힐 수 있음은 물론, 어렵게만 보

였던 테이블 뷰나, 내비게이션 컨트롤러의 동작 원리를 배울 수 있고, 최신 개발 환경에 맞게 효

과적으로 애플리케이션을 개발하는 법을 배울 수 있다. 이 책은 장과 장의 예제가 별도 작성돼

Page 20: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

xx

있으므로 특정 주제에 대한 학습이 필요한 독자라면 언제든 해당 장을 펼쳐서 내용을 살펴볼 수

있다. 특별히 이 책의 이전 버전을 갖고 있는 독자라면 달라진 엑스코드 개발 환경을 다루는 2장,

스토리보드를 다루는 10장과, 아이클라우드를 다루는 14장을 먼저 읽어보면 많은 도움이 될 것

이다. 또 ARC에 대해 소개하는 3장과 수정된 애플리케이션 템플릿을 통해 아이패드 애플리케이

션을 개발하는 11장 등도 눈여겨볼 만하다.

이 책의 장점은 저자들의 혜안이 담겨 있다는 것이다. 이 책을 통해 독자들은 iOS 프로그래

밍의 모범 개발 방식(best practice)을 자연스럽게 익힐 수 있다. 예를 들어 속성을 선언하는 방

식이나 #pragma를 활용한 코드 구조화, 기저 컨트롤러의 구현과 컨트롤러 상속을 통한 코드

재사용, 스토리보드를 활용한 내비게이션 구현 등은 저자들이 주는 이런 혜안 중 일부에 지나

지 않는다.

이 책의 대상 독자

이 책은 단순히 iOS 5 SDK에서 추가된 내용과 더불어 iOS 프로그래밍 전반을 다루고 있으므로

기존 개발자뿐 아니라 새로 iOS 프로그래밍에 입문하는 독자들이 읽기에도 좋은 책이다. 아울

러 이 책의 이전 버전을 갖고 있는 독자라 하더라도 메모리 관리 방식을 비롯해 책의 내용 설명이

대부분 수정된 만큼, 이 책의 내용을 처음부터 끝까지 읽어보길 권장한다.

감사의 글

우선 역자를 믿고 이 책의 번역을 의뢰해주신 위키북스 박찬규 사장님께 감사드린다. 또 교정을

담당해주신 김윤래 편집장 님께도 감사드린다. 이 분들이 없었다면 이렇게 좋은 책이 아직까지

빛을 보지 못했을 것이다. 또 항상 사랑하는 가족, 그리고 하나님께도 감사드린다.

- 유윤선

Page 21: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

xxi

•저자 소개•

데이브 마크 (Dave Mark)

데이브 마크는 오랫동안 맥 개발자이자 저자로 일하고 있으며 맥과 iOS

개발과 관련한 다양한 책을 저술했다. 저서로는 ‘Beginning iPhone 4

Development(Apress, 2011)’, ‘More iPhone 3 Development(Apress,

2010)’ 등이 있다. 데이브는 iOS와 안드로이드 개발 업체인 MartianCra�

의 대표다. 그는 아내와 세 아이와 함께 버지니아에서 살고 있다.

잭 너팅 (Jack Nutting)

잭 너팅은 코코아를 코코아라고 부르기 전부터 코코아를 사용했다. 잭은

코코아와 코코아의 전신을 활용해 게임, 그래픽 디자인, 온라인 디지털 배

포, 텔레콤, 금융, 출판, 여행 등 다양한 산업 분야의 애플리케이션을 개발

했다. 잭은 오브젝티브-C와 코코아 프레임워크의 열렬한 지지자다. 잭은

‘Beginning iPhone 4 Development(Apress, 2011)’, ‘Learn Cocoa on the

Mac(Apress, 2010)’과 ‘Beginning iPad Development for iPhone Developers(Apress, 2010)’의

주요 저자다. 잭은 이따금씩 http://www.nuthole.com에 블로그 글을 남긴다.

제프 라마시 (Jeff LaMarche)

제프 라마시는 20년 이상의 프로그래밍 경험을 지닌 맥과 iOS 개발자다. 제

프는 ‘Beginning iPhone 4 Development(Apress, 2011)’, ‘More iPhone 3

Development(Apress, 2010)’, ‘Learn Cocoa on the Mac(Apress, 2010)’ 등

다양한 iOS와 맥 관련 책을 저술했다. 제프도 iOS와 안드로이드 개발 업체

인 MartianCra�의 대표다. 또 제프는 많은 사람이 구독하는 자신의 블로

그인 http://iphonedevelopment.blogspot.com에 iOS 개발에 대한 내용을 쓰고 있다.

Page 22: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

xxii

•기술 감수자 소개•

마크 달림플 (Mark Dalrymple)

마크 달림플은 맥과 유닉스 프로그래밍에 오랜 경험을 지니고 있으며 크

로스 플랫폼 툴킷, 인터넷 배포 툴, 고성능 웹 서버, 최종 사용자를 대상

으로 한 데스크톱 애플리케이션 개발 분야 등에 종사하고 있다. 마크는

‘Learn Objective-C on the Mac(Apress, 2009)’과 ‘Advanced Mac OS X

Programming(Big Nerd Ranch, 2005)’의 주요 저자이기도 하다. 여가 시

간에 마크는 트롬본과 바순을 불기도 하고 풍선으로 동물을 만들기도 한다.

Page 23: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

xxiii

•감사의 글•

이 책은 항상 힘이 되고, 친절하며 현명하기까지 한 가족과 친구, 그 외 도움을 주신 분들이 없었

다면 세상에 나올 수 없었을 것이다. 먼저 테리, 웨로니카, 데닌에게 감사를 드린다. 우리 저자들

이 이 책의 집필로 수고하는 동안 이 분들은 나머지 가사 일을 모두 책임져 주었다. 이번 책으로

인해 저자들은 아주 오랜 시간 동안 집필에 몰두해야 했지만 우리 아내들은 한 번도 불평하지 않

았다. 우리는 정말 행복한 남자들이다.

또 이 책은 Apress 출판사의 훌륭한 직원들이 없었다면 쓸 수 없었을 것이다. 클래이 안드레스

는 우리 저자들을 제일 처음 Apress로 안내했고 이 책을 업어 키우다시피 했다. 도미니크 쉐이크

셰프트는 항상 미소를 띤 채 저자들의 불만 사항을 모두 해결해주었고 이 책을 더 좋게 만들 수

있는 해결책을 매번 제시해줬다. 이 책의 편집자인 켈리 모리츠는 저항할 수 없는 힘으로 저자들

의 느린 집필 활동을 독려해줬다. 개발 편집자인 톰 웰시는 집필 과정에서 훌륭한 피드백을 통해

많은 도움을 주었다. 두 편집자 덕분에 책은 올바른 방향을 따라 집필될 수 있었다. 카피 에디터

인 말린린 스미스 덕분에 즐거운 작업을 할 수 있었다. 제프리 페퍼, 프랭크 맥거킨, 브리짓 더피,

그 외 Apress 출판사의 제작팀은 모든 작업을 한데 어우러지게 해서 멋진 작품을 만들어주었다.

다일란 우터스 이 책의 마케팅을 담당해줬다. Apress의 모든 직원들에게 감사, 또 감사한다.

또 이 책의 기술 리뷰를 담당해준 마크 달림플에게도 특별히 감사를 드리고 싶다. 혜안이 가득

한 피드벡을 주는 것 외에 마크는 이 책의 모든 코드를 테스트해줬고 우리 저자들이 정도를 따라

책을 집필할 수 있게 도와줬다. 마크에게 다시 한 번 감사한다.

끝으로 아버지가 열심히 일하는 동안 기꺼이 참아준 아이들에게 감사 인사를 전한다. 매디, 위

니, 이안, 카이, 헨리에타, 도로티, 다니엘, 켈리, 라이언, 이 책은 너희들을 위한 책이란다.

Page 24: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

xxiv

•서 문•

이 책의 네 번째 개정판을 독자들이 읽고 있다는 사실에 감회가 새롭다. 이 책의 여정을 처음 시

작한 이후로 우리는 코코아 터치 개발이라는 놀랍고 환상적인 세계로 독자들을 더 잘 안내해줄

수 있는 가이드 서적을 만든다는 일념으로 우리가 상상했던 것보다 훨씬 더 많은 피와 땀과 눈물

을 이 책에 쏟았다. 물론 이 여정을 통해 우리는 많은 즐거움도 느꼈으며, 독자들도 이런 즐거움

을 함께 느낄 수 있기를 바란다.

이번 개정판에서는 달라진 엑스코드 4에 맞춰 내용을 전면적으로 개편했다. 애플은 엑스코드

3에서 엑스코드 4로 전환하면서 엑스코드를 크게 수정했고, (이 책을 쓰고 있는 현 시점 기준으

로) 최신 버전인 엑스코드 4.2로 오면서 또 다시 많은 부분을 수정했다. 우리도 이런 애플의 움직

임을 그대로 따라 엑스코드 4.2의 새로운 기술을 활용해 책의 모든 프로젝트를 처음부터 다시

작성했다.

더불어 개정판의 제목에서 볼 수 있듯이 모든 프로젝트가 iOS 5에서 제대로 실행될 수 있게 설

계를 바꿨다. iOS SDK는 이번 버전에서 크게 발전했다. 독자들이 예상하는 것처럼 프로젝트 템

플릿에서도 많은 부분이 변경됐으며 기존 작업 방식을 대체할 수 있는 새로운 방식이 여러 개 등

장했다. 물론 새로 마스터해야 할 기술도 그만큼 늘어났다. 이 책에서는 스토리보드와 아이클라

우드를 활용하는 새로운 장을 추가했으며, 테이블 뷰를 처리하는 새로운 전략을 소개하고, 메모

리 관리를 단순화하기 위해 모든 예제 프로젝트를 자동 참조 카운팅(ARC) 기능을 사용해 다시

만들었다.

Page 25: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

xxv

간단히 말해 가장 최신 개정판인 이 책은 지금껏 출간된 이 책의 과거 어떤 버전보다 방대하고,

더 많은 내용을 다룬다. 독자들이 iOS 개발을 처음 시작하든, 기존에 iOS 개발을 해본 경험이 있

든 상관없이 이 개정판에서 다루는 새로운 내용이 독자들에게 도움될 거라 생각한다. 이 책의 이

전 버전을 아직 다 읽지 못했거나 아직까지 개념이 정리되지 않는다면, 또는 우리 저자들을 도와

주고 싶은 마음이 든다면 네 번째 개정판인 이 책을 당연히 추천한다. 우리 저자들은 독자들의

지원에 항상 감사를 드린다. 저자들에게 독자들이 만든 앱을 알려주려면 http://iphonedevbook.

com에 들러서 글을 남기면 된다. 이 포럼에서 여러 독자들을 만날 수 있기를 희망한다. 그럼 즐

거운 코딩 시간이 되길!

- 데이브, 잭, 제프

Page 26: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

Beg

inni

ng iO

S 5

Dev

elop

men

t

Page 27: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

1

01정글에 온 것을 환영한다

이 책을 구매한 독자들은 아이폰, 아이팟 터치, 아이패드 애플리케이션을 만들고 싶어서 책을 샀

을 것이다. iOS는 이들 기기의 핵심 소프트웨어로서, 2007년 처음 등장한 후 지금까지 폭발적인

성장을 거듭하고 있는 멋진 플랫폼이다. 모바일 소프트웨어 플랫폼의 성장은 사람들이 어디에서

나 소프트웨어를 사용한다는 것을 뜻한다. iOS 5와 최신 iOS 소프트웨어 개발 킷(SDK)의 출시

로 인해 모바일 환경은 한층 더 좋아지고 있으며 날로 흥미를 더하고 있다.

이 책에 대한 소개

이 책은 iOS 애플리케이션의 개발 여정을 시작할 수 있게 도와주는 가이드 서적이다. 이 책의 목

적은 독자들이 처음 배울 때 혼자서 익히기 어려운 내용을 쉽게 이해할 수 있게 도와줌으로써

iOS 애플리케이션이 어떻게 동작하고 iOS 애플리케이션을 어떻게 개발해야 할지 알려주는 것

이다.

이 책의 내용을 진행하다 보면 iOS의 특정 기능을 강조하기 위해 설계된 작은 애플리케이션을

여러 개 만날 수 있으며 이를 통해 독자들은 이런 기능을 어떻게 활용할지 이해할 수 있다. 이 책

을 통해 얻은 기본 지식에 여러분의 창의성과 애플에서 제공하는 방대한 상세 문서 지식까지 가

미한다면 전문적인 아이폰 및 아이패드 애플리케이션 개발에 필요한 지식을 모두 쌓을 수 있을

것이다.

Page 28: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

2 l 시작하세요! 아이폰 5 프로그래밍

데이브, 잭, 제프는 이 책의 포럼을 만들어 놓았다. 이 포럼에는 독자들과 비슷한 생각을 가진

사람들을 많이 만날 수 있고 질문을 올리고 답을 얻을 수 있으므로 수시로 방문하자. 이 포럼

의 위치는 http://iphonedevbook.com이다.

책에 필요한 도구

iOS 애플리케이션 개발을 시작하려면 몇 가지 도구가 필요하다. 처음 개발을 시작하는 사람이라

면 라이온(OS X 10.7 또는 이후 버전)을 구동하는 인텔 기반의 매킨토시 컴퓨터가 필요하다. 최

근에 출시된 인텔 기반의 매킨토시 컴퓨터(랩톱이나 데스크톱)라면 문제 없이 사용할 수 있다.

또 iOS 개발자 등록도 해야 한다. 애플에서는 iOS SDK를 내려받기 전에 먼저 개발자 등록 과

정을 밟게 한다.

개발자로 등록하려면 http://developer.apple.com/ios/를 방문하면 된다. 그럼 그림 1–1과 비슷

한 페이지가 보인다.

Page 29: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

01 정글에 온 것을 환영한다 l 3

그림 1-1 | 애플의 iOS 개발자 센터 웹사이트

Page 30: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

4 l 시작하세요! 아이폰 5 프로그래밍

먼저 Log in 버튼을 클릭한다. 그럼 애플 ID를 묻는 창이 나타난다. 애플 ID가 없다면 Create

Apple ID 버튼을 클릭해 새 아이디를 만든 후 로그인한다. 로그인을 마치면 iOS 개발자 메인 페

이지로 이동하게 된다. 이 페이지에서는 SDK 다운로드 링크뿐 아니라 다양한 문서, 동영상, 예제

코드 등을 볼 수 있다. 이들 자료는 애플에서 iOS 애플리케이션 개발 방법을 알려주기 위해 제공

하는 자료들이다.

iOS 애플리케이션을 개발하기 위해 사용할 가장 중요한 툴은 엑스코드(Xcode)다. 엑스코드

는 애플의 통합 개발 환경이다. 엑스코드에는 소스 코드를 생성하고 디버깅하는 툴, 애플리케이

션을 컴파일하는 툴, 작성한 애플리케이션의 성능 튜닝을 위한 툴이 모두 들어 있다.

애플 ID로 로그인하고 나면 http://developer.apple.com/ios/에서 엑스코드를 내려받는 링크

를 볼 수 있다. 또 맥의 사과 메뉴에서 접근할 수 있는 매킨토스 앱 스토어에서 엑스코드를 내려

받을 수도 있다.

예제에 사용한 SDK 버전과 소스 코드

SDK와 엑스코드가 발전함에 따라 이를 내려받는 방법도 수시로 변한다. 때로는 SDK와 엑

스코드를 별도로 내려받기도 하고, 또 때로는 한 번에 둘을 함께 내려받기도 한다. 기본적

으로 (베타가 아닌) 가장 최신의 SDK와 엑스코드를 내려받는 게 제일 좋다.

이 책은 가장 최신 버전의 SDK와 호환되도록 작성했다. 어떤 곳에서는 일부러 iOS 5에서

새로 도입된 함수와 메서드를 사용했는데, 이 경우 이들 기능이 기존 SDK와 호환되지 않

을 수도 있다. 이런 부분은 이 책에서 그때그때 언급할 것이다.

책을 따라 할 때는 책의 웹사이트(http://iphonedevbook) 또는 책의 페이지(http://

apress.com)에서 가장 최신 버전의 소스 코드 압축 파일을 내려받는 게 좋다. 이 책의 소

스 코드는 새 SDK 버전이 출시됨에 따라 업데이트할 예정이므로 이 웹사이트는 주기적으

로 확인하자.

개발자 옵션

무료 SDK 다운로드 옵션에는 맥에서 아이폰이나 아이패드 애플리케이션을 빌드하고 실행할 수

있는 시뮬레이터가 들어 있다. 이 시뮬레이터만 활용하더라도 iOS 프로그래밍을 배우는 데 충분

하다. 하지만 시뮬레이터에서는 아이폰의 가속도계나 카메라 같은 하드웨어 의존적인 기능들을

지원하지 않는다. 또 무료 옵션만으로는 애플리케이션을 실제 아이폰이나 다른 기기에 설치할

Page 31: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

01 정글에 온 것을 환영한다 l 5

수 없을뿐더러 애플의 앱 스토어에서 애플리케이션을 배포할 수도 없다. 이런 기능들을 모두 사

용하려면 무료가 아닌 나머지 옵션 가운데 하나를 등록해야 한다.

� 표준 프로그램은 1년에 99달러가 든다. 표준 프로그램에서는 개발 도구와 자료, 기술 지

원, 애플 앱 스토어를 통한 애플리케이션 배포 등을 제공하고, 제일 중요한 iOS 기기상에

서의 테스트 및 디버깅 기능을 제공한다.

� 기업용 프로그램은 1년에 299달러가 든다. 이 프로그램은 인 하우스 iOS 애플리케이션을

개발하는 회사 또는 여러 개발자가 프로젝트에 참여해 애플 앱 스토어에서 애플리케이션

을 배포하려는 사용자들을 위한 프로그램이다.

이들 옵션에 대한 상세 설명과 두 프로그램의 차이점은 http://developer.apple.com/

programs/ios와 http://developer.apple.com/programs/ios/enterprise에 잘 나와 있다.

iOS는 항상 다른 기업들의 무선 인프라를 활용해 모바일 기기의 지속적인 인터넷 연결 기능

을 지원하므로, 애플에서는 맥 개발자에 대한 규제보다 iOS 개발자에 대한 규제를 훨씬 더 엄격

히 적용한다(실제로 맥 개발자는, 적어도 이 책을 쓰고 있는 현 시점 기준으로, 애플의 감독이나

승인 없이도 프로그램을 마음대로 개발하고 배포할 수 있다). 아이팟 터치와 와이파이 버전의 아

이패드는 다른 기업의 인프라를 사용하지 않지만 이들 기기에 사용되는 애플리케이션 또한 같은

규제를 받는다.

애플에서 이런 규제를 강제하는 것은 개발자들을 괴롭히기 위한 게 아니라 악의적인 프로그

램이나 품질이 떨어지는 프로그램이 무분별하게 배포됨으로써 공유 네트워크의 성능을 저해하

는 것을 최소화하기 위한 것이다. 이렇게 보면 iOS용 애플리케이션을 개발하고 배포하기 위해 넘

어야 할 난관이 많아 보이지만 애플에서는 개발 과정의 고통을 가능한 한 줄이기 위해 모든 노력

을 기울였다. 실제로 99달러라는 등록 비용도 예컨대 마이크로소프트의 IDE인 비주얼 스튜디어

의 구매 비용과 비교하면 매우 싼 편에 속한다.

당연한 말이지만 iOS 애플리케이션을 개발하려면 아이폰, 아이팟 터치, 또는 아이패드가 필요

하다. 물론 대부분의 코드는 iOS 시뮬레이터를 통해 테스트하지만 모든 프로그램을 시뮬레이터

로 테스트할 수 있는 건 아니다. 또 시뮬레이터로 테스트할 수 있는 코드라 하더라도 애플리케이

션을 일반에 공개할 생각이라면 먼저 실제 기기에서 엄격한 테스트를 거쳐야 한다.

Page 32: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

6 l 시작하세요! 아이폰 5 프로그래밍

알아두기

표준 또는 기업용 프로그램에 등록할 생각이라면 지금 당장 등록하자. 등록 승인에 다소 시간

이 걸리고, 등록이 승인된 후부터 비로소 실제 기기에서 애플리케이션을 실행할 수 있기 때문

이다. 하지만 이 책의 처음 몇 장에서 만들 프로젝트를 비롯해 책의 대다수 애플리케이션은

iOS 시뮬레이터에서도 잘 동작하므로 크게 걱정하지 않아도 된다.

책을 이해하는 데 필요한 배경 지식

이 책에서는 독자들이 어느 정도의 프로그래밍 지식은 갖추고 있다고 가정한다. 이 말은 독자들

이 객체 지향 프로그래밍(객체, 순환문, 변수 등의 의미는 이해할 것이라 믿는다)의 기본 지식을

이해할 것이라고 가정한다는 뜻이다. 또 독자들은 오브젝티브-C 언어에도 익숙하리라 가정한다.

이 책에서 계속 사용할 SDK의 일부인 코코아 터치는 이전 버전에는 없던 가장 새 기능을 몇 가

지 포함하는 가장 최신 버전의 오브젝티브-C 2.0 언어를 사용한다. 하지만 오브젝티브-C 언어에

최근에 추가된 기능들을 잘 모르더라도 걱정하지 않아도 된다. 이 책에서는 이런 새 기능을 사용

할 때마다 이에 대해서 강조하고 왜 이런 기능을 사용하는지 설명해줄 것이다.

또 독자들은 사용자 관점에서 iOS 자체도 잘 이해해야 한다. 애플리케이션을 개발하는 다른

플랫폼을 대할 때와 마찬가지로 아이폰, 아이패드, 아이팟 터치의 미묘한 차이와 사용성을 잘 이

해하기 바란다. 시간을 내서 iOS 인터페이스와 친해지고 애플의 아이폰 및/또는 아이패드 애플

리케이션의 모양과 느낌을 몸에 익히자

Page 33: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

01 정글에 온 것을 환영한다 l 7

오브젝티브-C의 입문자라면?

오브젝티브-C로 프로그래밍을 해본 경험이 없다면 처음 시작하는 데 도움을 줄 수 있는 자

료가 몇 가지 있다.

� Learn Objective-C on the Mac은 맥 프로그래밍 전문가인 마크 달림플과 스콧 내스

터(Apress, 2009)가 저술한 오브젝티브-C에 언어에 대한 훌륭한 저서다.

http://www.apress.com/book/view/9781430218159

� 애플의 언어 소개 사이트인 Learning Objective-C: A Primer를 참고한다.

http://developer.apple.com/library/ios/#referencelibrary/

GettingStarted/Learning_Objective-C_A_Primer

� The Objective-C Programming Language는 오브젝티브-C에 대한 상세하고 방대

한 설명이 들어 있는 훌륭한 레퍼런스 가이드 서적이다.

http://developer.apple.com/library/ios/#documentation/Cocoa/ Conceptual/ObjectiveC

이 중 세 번째 책은 iBooks를 통해 아이폰, 아이팟 터치, 아이패드에서 무료로 내려받을 수

도 있다. 이 책은 책의 내용을 따라 하면서 참조하기에 더 없이 좋은 책이다. 애플에서는 이

런 형태로 여러 권의 개발 서적을 출시했는데 앞으로도 이런 책들이 더 나오기 바란다. 애

플에서 출시한 개발 서적을 찾아보려면 iBooks에서 ‘apple developer publications’로

검색하면 된다.

iOS 코딩의 차이점

코코아나 NeXTSTEP을 사용해 프로그램을 개발해 본 경험이 있다면 iOS SDK의 내용 대부분

이 익숙할 것이다. 코코아 터치에서 대부분의 클래스는 맥 OS X 개발에 사용하는 버전과 동일하

다. 또 코코아 터치에서 바뀐 클래스들조차 이전 버전에 사용된 클래스들의 기본 원칙을 그대로

준수하며 유사한 디자인 패턴을 사용한다. 하지만 코코아와 코코아 터치 사이에는 몇 가지 차이

점이 있다.

독자들의 배경 지식과 상관없이 iOS 개발과 데스크톱 애플리케이션 개발 사이의 다음 차이점

몇 가지는 꼭 기억해야 한다. 이런 차이점은 이어지는 절에서 설명한다.

Page 34: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

8 l 시작하세요! 아이폰 5 프로그래밍

단 하나뿐인 활성 애플리케이션

iOS에서는 모든 시점에 단 하나의 애플리케이션만 활성화돼 화면에 나타난다. iOS4부터는 사용

자가 홈 버튼을 누른 후에도 애플리케이션이 백그라운드에서 계속 실행될 수 있지만, 이 또한 특

정 사용 용도와 상황으로 국한되며, 이를 처리하기 위해 별도 코드를 작성해야 한다.

애플리케이션이 활성화돼 있지 않거나 백그라운드에서 실행 중이면 애플리케이션은 CPU로부

터 아무런 관심도 받지 못하므로, 이 경우 열려 있는 네트워크 연결 등이 끊기게 된다. iOS 4에서

는 백그라운드 처리가 가능해지면서 장족의 발전을 이루긴 했지만, 백그라운드에서 애플리케이

션이 올바르게 실행되게 하려면 개발자의 노력이 추가로 필요하다.

단 하나뿐인 창

데스크톱과 랩톱 운영체제에서는 여러 프로그램을 동시에 띄울 수 있고 여러 창을 제어할 수 있

다. 하지만 iOS에서는 애플리케이션에 주어지는 창이 단 하나뿐이다. 애플리케이션과 사용자와

의 상호작용은 모두 이 창 내에서 이뤄져야 하며, 이 창의 크기는 화면 크기로 제한된다.

제한된 접근

컴퓨터 프로그램은 프로그램을 실행한 사용자가 작업을 수행할 때 거의 모든 자원을 제한 없이

접근할 수 있다. 하지만 iOS에서는 애플리케이션이 접근할 수 있는 영역을 크게 제한한다.

iOS 프로그램에서는 애플리케이션과 관련해 생성된 iOS의 파일 시스템 영역을 통해서만 파일

을 읽고 쓸 수 있다. 이 영역은 애플리케이션의 샌드박스라고 부른다. 샌드박스는 애플리케이션

이 문서, 환경설정, 기타 저장할 데이터를 보관하는 공간이다.

애플리케이션의 접근은 다른 형태로도 제약을 받는다. 예를 들어 iOS에서는 낮은 번호의 네트

워크 포트에 접근하거나 데스크톱 컴퓨터에서 보통 루트나 관리자 접근 권한이 필요한 기타 접

근을 할 수 없다.

제한된 응답 시간

iOS 애플리케이션의 사용 패턴으로 인해 iOS는 빠르게 반응해야 하는데, 이는 애플리케이션도

마찬가지다. 사용자가 프로그램을 실행하면 애플리케이션을 시작하고, 환경설정과 데이터를 로

드한 후 가능한 한 빨리 메인 뷰를 화면에 보여줘야 한다. 아무리 늦어도 2-3초 이내에 말이다.

Page 35: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

01 정글에 온 것을 환영한다 l 9

프로그램이 실행 중인 동안에도 프로그램은 언제든 실행이 중단될 수 있다. 사용자가 홈 버튼

을 누르면 iOS는 홈으로 이동하므로 애플리케이션은 빠르게 모든 내용을 저장하고 실행을 마쳐

야 한다. 이때 정보를 저장하고 제어권을 넘겨주는 데까지 5초 이상 걸리면 시스템에서는 저장을

마쳤는지 여부와 상관없이 애플리케이션의 프로세스를 그냥 죽인다.

iOS 4부터는 애플리케이션이 시스템으로 제어를 넘겨줄 때 추가 시간을 요구할 수 있는 새로

운 API가 추가되면서 이 상황이 다소 개선됐다.

제한된 화면 크기

아이폰의 화면은 실제로 근사하다. 아이폰이 처음 나왔을 때 아이폰은 당시 휴대용 기기로서는

최고 해상도의 화면을 보여줬다.

하지만 아이폰 디스플레이는 그다지 크지 않으며, 결과적으로 현대 컴퓨터 화면과 비교해 사

용할 수 있는 화면 공간이 많이 부족하다. 가장 최근에 나온 레티나 디스플레이 기기(아이폰 4

및 4세대 아이팟 터치)의 화면 해상도는 640×960이며 기존 기기의 해상도는 320×480 픽셀이

다. 그런데 640×960 해상도의 레티나 디스플레이도 기존 크기의 아이폰에 촘촘히 화소를 배치

한 것이므로 해상도가 높다고 해서 더 많은 컨트롤을 배치할 수 있는 것은 아니다. 다만 기존보다

더 높은 해상도로 화면이 보일 뿐이다.

아이패드는 1024×768 디스플레이를 제공함으로써 이런 화면 제약을 조금 개선했지만 오늘날

기준으로 이 해상도가 큰 편은 아니다. 이를 다른 화면 크기와 비교해 보면, 이 책을 쓰고 있는 현

시점 기준으로 애플에서 가장 값이 싼 제품인 iMac은 1920×1080 픽셀을 지원하며, 가장 값이 싼

노트북 제품인 맥북조차도 1280×800 픽셀을 지원한다. 또 현재 기준으로 애플의 가장 큰 모니터

인 27인치 LED 시네마 디스플레이는 무려 2560×1440 픽셀이라는 놀라운 해상도를 제공한다.

제한된 시스템 자원

과거 시절에 프로그래밍을 했던 개발자라면 256MB의 램과 8GB의 저장 공간을 가진 기기가 리

소스 제약이 있다는 말이 우습게 들릴 것이다. 물론 iOS 애플리케이션 개발은 48KB의 메모리를

가진 기기에서 실행할 복잡한 스프레드시트 애플리케이션을 개발하는 것에 비할 바는 아니다.

하지만 iOS 애플리케이션의 화려한 그래픽 성격과 애플리케이션에서 처리하는 다양한 작업으로

인해 메모리는 매우 쉽게 소모된다.

Page 36: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

10 l 시작하세요! 아이폰 5 프로그래밍

현재 시판되는 iOS 기기들은 256MB 또는 512MB의 물리 RAM을 갖고 있다. 물론 이런 메모

리는 시간이 흐르면서 점차 늘어날 것으로 보인다. 이런 메모리 중 일부는 화면 버퍼 및 기타 시

스템 프로세스에 사용된다. 보통 애플리케이션에서 사용할 수 있는 최대 메모리는 전체 메모리

의 절반을 넘지 못하며, 실제 사용할 수 있는 메모리의 양은 이보다 훨씬 적을 수도 있다. 특히 요

즘 백그라운드에서 실행되는 앱을 고려하면 사용할 수 있는 메모리 양은 더욱 적다.

이런 점을 모두 고려하더라도 iOS 기기 같은 작은 컴퓨터에서 꽤 많은 메모리를 사용한다는 생

각이 여전히 들 수 있지만 iOS의 메모리와 관련해서는 한 가지를 더 고려해야 한다. 맥 OS X 같

은 현대 컴퓨터 운영체제는 사용하지 않는 대용량의 메모리를 스왑 파일이라는 디스크에 쓴다.

스왑 파일은 컴퓨터에서 실제 사용할 수 있는 메모리보다 더 많은 메모리를 프로그램이 요청하

더라도 프로그램을 계속 실행할 수 있게 해준다. 하지만 iOS에서는 애플리케이션 데이터 같은 휘

발성 메모리를 스왑 파일에 쓰지 않는다. 이로 인해 애플리케이션에서 사용할 수 있는 메모리의

양이 iOS 기기에서 사용하지 않는 물리적인 메모리 크기로 제한될 수밖에 없다.

코코아 터치에는 메모리가 내려가고 있음을 애플리케이션에게 알려주는 내장 메커니즘이 있

다. 메모리가 부족하면 애플리케이션에서 불필요한 메모리를 제거해야 한다. 그렇지 못할 경우

애플리케이션이 강제 종료된다.

가비지 컬렉션은 없지만...

앞서 코코아 터치가 오브젝티브-C를 사용한다고 설명한 바 있지만, iOS에서는 코코아 터치의 주

요 신기능 중 하나를 지원하지 않는다. 바로 가비지 컬렉션 기능이 없는 것이다. iOS 프로그래밍

을 할 때 직접 메모리 관리를 해야 하는 부담은 이 플랫폼을 처음 접하는 많은 프로그래머들에

게 다소 장애가 됐다. 특히 가비지 컬렉션을 지원하는 프로그래밍 언어를 사용하던 프로그래머

들은 이런 수동적인 메모리 관리를 어려워했다.

하지만 iOS5에서 지원하는 새로운 오브젝티브-C 언어에서는 기본적으로 이런 장애물이 사라

졌다. iOS 5에서는 자동 객체 카운팅(ARC)이라는 기능을 도입해 오브젝티브-C 객체의 메모리

관리를 직접해야 하는 부담을 없애줬다. ARC에 대해서는 3장에서 자세히 설명한다.

Page 37: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

01 정글에 온 것을 환영한다 l 11

코코아 터치의 고유 기능

앞에서 코코아 터치가 코코아의 기존 기능 중 일부를 지원하지 않는다고 언급했으므로 현재 코

코아에 들어 있지 않거나 모든 맥에서 사용할 수 없는 iOS SDK만의 기능도 언급하는 게 공평할

것 같다.

� iOS SDK는 코어 로케이션을 통해 애플리케이션에서 iOS 기기의 현재 지리 좌표를 알 수

있는 기능을 제공한다.

� 대부분의 iOS 기기는 내장 카메라와 사진 라이브러리를 갖고 있으며 SDK를 통해 애플리

케이션이 이에 접근할 수 있는 기능을 제공한다.

� iOS 기기는 기기를 쥐고 있는 방향과 기기의 움직임을 감지할 수 있는 가속도계 (최신 아

이폰 및 아이팟 터치에서는 자이로스코프까지)를 갖고 있다.

다른 접근 방식

iOS 기기에 없는 두 가지를 꼽으면 물리적인 키보드와 마우스가 있다. 이 말은 일반 컴퓨터 응용

프로그램을 만들 때와는 근본적으로 다른 방식으로 사용자와 상호작용해야 함을 뜻한다. 다행

히 이런 상호작용 대부분은 개발자를 위해 iOS에서 대신 처리해준다. 예를 들어 텍스트 필드가

들어 있는 애플리케이션에서 사용자가 텍스트 필드를 클릭하면 추가 코드 없이도 iOS에서 자동

으로 키보드를 보여준다.

알아두기

현재 iOS 기기들은 블루투스를 통해 외부 키보드를 연결할 수 있는 기능을 제공한다. 이를 활

용하면 화면 공간을 절약하고 훌륭한 키보드 사용 경험을 전달할 수 있지만, 실제로 이렇게 사

용하는 사례는 드물다. 블루투스를 통한 마우스 연결 기능은 아직 옵션으로 제공되지도 않고

있다.

Page 38: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

12 l 시작하세요! 아이폰 5 프로그래밍

이 책에서 다루는 내용

다음은 이 책의 나머지 장에서 다룰 내용을 간략히 정리한 것이다.

� 2장에서는 엑스코드의 단짝인 인터페이스 빌더를 활용해 간단한 인터페이스를 만들고

화면에 텍스트를 배치한다.

� 3장에서는 사용자가 누르는 버튼에 따라 런타임 시에 텍스트의 내용을 동적으로 업데이

트하는 애플리케이션을 개발해 사용자와 상호작용하는 프로그램의 개발을 시작한다.

� 4장에서는 iOS의 표준 UI 컨트롤을 몇 가지 더 살펴보면서 3장의 예제에 살을 덧붙인다.

또 경고창과 액션 시트를 활용해 사용자가 결정을 내리게 하고, 사용자에게 어떤 일이 일

어났음을 알려주는 법을 살펴본다.

� 5장에서는 iOS 애플리케이션을 가로와 세로 모드에서 사용할 수 있게 해주는 메커니즘

인 자동 회전과 자동 크기 조절 속성을 살펴본다.

� 6장에서는 보다 난이도 있는 UI를 살펴보고 여러 뷰를 지원하는 애플리케이션의 작성법

을 배운다. 이 장에서는 런타임 시에 사용자에게 보여줄 뷰를 변경하는 법을 배움으로써

애플리케이션의 활용 범위를 한층 더 넓힌다.

� 탭바와 피커는 표준 iOS UI에 속한다. 7장에서는 이런 UI 요소를 구현하는 법을 살펴본다.

� 8장에서는 사용자에게 데이터 목록을 전달하는 데 주로 사용하는 테이블 뷰를 살펴보

고 계층적 내비게이션 기반 애플리케이션의 기본 지식을 배운다. 또 애플리케이션 데이터

를 사용자가 검색할 수 있게 하는 기능을 살펴본다.

� iOS 애플리케이션 인터페이스에서 가장 자주 볼 수 있는 인터페이스 중 하나는 내부 뷰

로 이동해 더 많은 데이터와 상세 정보를 확인할 수 있는 계층적 리스트 인터페이스다. 9

장에서는 이런 표준 인터페이스를 구현하는 법을 살펴본다.

� iOS 5에서는 스토리보드라는 새로운 앱 디자인 방식이 추가됐다. 10장에서는 스토리보

드가 제공하는 멋진 새 기능을 다룬다.

� 다른 iOS 기기와는 기기 크기에서 차이가 있는 아이패드는 GUI를 보여줄 때 다른 접근

방식을 사용해야 하며, SDK에서는 이를 도와주는 일부 컴포넌트를 제공한다. 11장에서

는 아이패드와 관련한 SDK를 활용하는 법을 살펴본다.

Page 39: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

01 정글에 온 것을 환영한다 l 13

� 12장에서는 애플리케이션 환경설정을 구현하는 법을 살펴본다. 애플리케이션 환경 설정

을 활용하면 사용자들이 애플리케이션 단위로 원하는 환경설정을 지정할 수 있다.

� 13장에서는 iOS에서의 데이터 관리법을 알아본다. 이 장에서는 애플리케이션 데이터를

보관할 객체를 생성하는 법을 설명하고 이런 데이터를 iOS의 파일 시스템에 영속화하는

법을 살펴본다. 또 코어 데이터를 활용하는 기본 방법을 통해 데이터를 쉽게 저장하고 조

회하는 법을 설명한다.

� iOS 5의 또 다른 새 기능은 아이클라우드다. 아이클라우드는 문서에서 데이터를 온라인

에 저장해 다른 애플리케이션과 동기화할 수 있게 해준다. 14장에서는 아이클라우드를

시작하는 법을 살펴본다.

� iOS4부터는 개발자들이 그랜드 센트럴 디스패치를 통해 다중 스레드를 활용한 애플리케

이션을 개발하고 특정 환경에서 애플리케이션이 백그라운드에서 실행되게 할 수 있다. 15

장에서는 이를 구현하는 법을 살펴본다.

� 그림 그리기를 싫어하는 사람은 없다. 16장에서는 커스텀 드로잉을 살펴본다. 이 장에서

는 쿼츠 2D와 오픈지엘 ES를 활용한 기본 드로잉을 설명한다.

� 모든 iOS 기기에 공통으로 들어 있는 멀티 터치 화면은 사용자로부터 다양한 제스처를

입력받을 수 있다. 17장에서는 핀치, 스와이프 같은 기본 제스처를 인식하는 법을 배운다.

또 새로운 제스처를 정의하는 방법을 살펴보고 언제 새로운 제스처를 사용하는 게 적절

한지도 설명한다.

� iOS는 코어 로케이션을 활용해 위도와 경도를 판단할 수 있다. 18장에서는 코어 로케이

션을 활용해 현재 iOS 기기가 있는 위치를 판단하는 법을 살펴보고 이 정보를 활용해 세

계 정복에 나선다.

� 19장에서는 iOS의 가속도계 및 자이로스코프와 연동하는 법을 살펴보고, 이를 통해 현

재 기기가 움직이는 방향과 속도를 판단한다. 또 이런 정보를 활용해 애플리케이션에서

구현할 수 있는 재미있는 예제를 살펴본다.

� 거의 모든 iOS 기기에는 카메라와 사진 라이브러리가 있으며 올바른 방식으로 요청하기

만 하면 애플리케이션에서는 이 둘을 모두 활용할 수 있다. 20장에서는 이런 요청 방법을

살펴본다.

Page 40: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

14 l 시작하세요! 아이폰 5 프로그래밍

� iOS 기기는 현재 90개국 이상에서 사용한다. 21장에서는 애플리케이션의 전 영역을 다른

언어로 쉽게 번역할 수 있도록 애플리케이션을 개발하는 법을 배운다. 이를 잘 활용하면

애플리케이션의 사용층을 훨씬 넓힐 수 있다.

� 이 책을 끝마치고 나면 아이폰 및 아이패드 애플리케이션 개발에 필요한 구성 요소를 모

두 마스터할 수 있다. 그럼 책을 다 읽고 난 후에는 어떤 자료를 봐야 할까? 22장에서는

iOS SDK를 마스터하기 위한 여정의 다음 목적지를 어디로 정하는 게 좋을지 살펴본다.

개정판에서 달라진 점

이 책의 초판이 출시된 후 iOS 개발 커뮤니티는 눈에 띄게 성장했다. 그 사이 SDK는 지속적으로

발전했으며 애플에서는 계속해서 SDK의 업데이트 버전을 내놓고 있다.

물론 그동안 저자들도 바빴다. iOS SDK 5가 출시된다는 소식을 듣자마자 우리는 바로 새 책

의 집필 작업에 착수했으며, 책에 들어 있는 예제 프로젝트를 하나씩 수정해 각각의 프로젝트가

최신 버전의 엑스코드와 SDK에서 컴파일됨은 물론, 코코아 터치에서 제공하는 가장 최신 기능

과 최고의 기능들을 모두 활용할 수 있게 했다. 이 책에서는 전반적으로 수많은 작은 수정 사항

들이 반영됐으며, 두 개의 새로운 장을 비롯해 수많은 변경 사항이 추가됐다. 새로 추가된 장 중

하나는 스토리보드에 대해 다루고, 또 다른 장에서는 아이클라우드에 대해 다룬다. 물론 책에 사

용된 캡처 화면도 모두 새로 첨부했다.

시작할 준비가 되었나?

iOS는 놀라운 컴퓨팅 플랫폼이며 개발의 즐거움을 만끽할 수 있는 흥미롭고 새로운 분야다. iOS

프로그래밍은 다른 플랫폼에서 개발하는 것과는 전혀 다른 새로운 경험이 될 것이다. 익숙하게

느껴지는 내용도 많겠지만 조금 낯선 부분도 보일 것이다. 하지만 책의 코드를 따라 하다 보면 이

런 개념들이 하나씩 정리되면서 점차 개념이 잡힐 것이다.

Page 41: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

01 정글에 온 것을 환영한다 l 15

이 책의 예제를 모두 따라 한다고 해서 iOS 고급 개발자 인증서를 부여받을 수 있는 체크 리스

트가 모두 완료되는 게 아니라는 점을 기억하자. 책을 볼 때는 다음 장으로 넘어가기 전에 각 장

에서 한 작업 내용과 왜 이런 작업을 했는지 이해한 후 넘어가는 게 좋다. 또 코드를 수정하는 것

을 겁내지 말아야 한다. 코코아 터치 같은 환경에서 복잡한 코딩 내용을 정리할 때는 코드를 이

리저리 수정하고 결과를 확인하는 것만큼 도움이 되는 것도 없다.

서론은 이쯤으로 하고, iOS SDK가 설치돼 있다면 바로 다음 페이지로 넘어가자. 아직 iOS

SDK를 설치하지 않았다면 지금 바로 설치하자. 준비가 됐다면 이제 여정을 시작해 보자!

Page 42: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

Beg

inni

ng iO

S 5

Dev

elop

men

t

Page 43: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

17

02티키 신 달래기

독자들도 이미 잘 알고 있겠지만 프로그래밍 책에서 첫 번째 프로젝트를 'Hello, World' 프로젝

트로 만드는 건 일종의 전통이 됐다. 이 책에서는 이런 전통을 한번 깨보는 것을 고민했지만, 이

런 관례를 깨면 티키 신이 크게 노해서 우리에게 재앙을 내릴까 두려운 마음이 들었다. 그래서 이

책에서도 'Hello, World' 프로젝트부터 설명을 시작한다.

이 장에서는 엑스코드를 사용해 'Hello, World!'라는 간단한 텍스트를 iOS 기기 시뮬레이터에

보여주는 iOS 애플리케이션을 만든다. 이 장에서는 엑스코드에서 iOS 애플리케이션 프로젝트를

생성할 때 필요한 내용을 살펴보고, 엑스코드의 인터페이스 빌더를 활용해 애플리케이션의 UI

를 디자인하는 세부 사항을 직접 체험한다. 그런 다음 실제 iOS 애플리케이션 같은 느낌을 받을

수 있게 애플리케이션에 아이콘을 적용한다.

이 장에서 할 일이 많으므로 바로 작업을 시작하자.

엑스코드에서의 프로젝트 설정

지금쯤이면 독자들의 컴퓨터에도 엑스코드와 iOS SDK가 모두 설치돼 있을 것이다. 책의 내용

을 따라 하려면 이 책의 웹사이트(http://www.iphonedevbook.com/forum/forum.php)에서 제

공하는 책의 예제 프로젝트 압축 파일도 내려받아야 한다. 이 책의 포럼에서는 최신 예제 코드를

내려받을 수도 있고, 질문에 대한 답을 들을 수도 있으며, 독자들과 비슷한 생각을 가진 다른 사

람들을 만날 수도 있다. 물론 책의 예제 코드는 Apress의 웹사이트에서도 받을 수 있다.

Page 44: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

18 l 시작하세요! 아이폰 5 프로그래밍

알아두기

물론 책의 예제 프로젝트 압축 파일에는 책에 소개된 프로젝트의 전체 코드가 모두 들어 있지

만, 이 책의 내용을 십분 활용하려면 내려받은 예제 코드를 그냥 실행하기보다는 책의 프로젝

트를 직접 생성하고 코드를 직접 입력해 볼 것을 권장한다. 이렇게 하면 프로젝트를 진행하면

서 다양한 개발툴을 익히는 데도 도움이 된다.

실제로 애플리케이션을 개발하는 작업은 독자들 말고는 누구도 대신해 줄 수 없다. 소프트웨

어 개발은 그냥 관전 스포츠 경기가 아니다.

이 장에서 첫 번째로 개발하는 프로젝트는 프로젝트 압축 파일의 02 - Hello World 폴더에 들

어 있다.

작업을 시작하기 전에 먼저 엑스코드를 실행해야 한다. 엑스코드는 이 책에서 대부분의 작업

을 할 때 사용할 툴이다. 하지만 이 툴은 대다수 맥 응용 프로그램과 달리 /Applications 폴더에

설치되지 않는다. 앞 장에서 설명한 대로 개발자 툴을 이미 설치했다면 /Developer/Applications

에서 엑스코드를 찾을 수 있다. 엑스코드는 앞으로 수없이 사용할 테니 바로 실행할 수 있게 독

으로 드래그해 두는 게 좋다.

엑스코드를 실행한 게 이번이 처음이더라도 걱정하지 않아도 된다. 이 장에서는 잠시 후 새 프

로젝트를 생성하는 과정을 차례로 안내해줄 것이다. 애플은 이전 버전과는 크게 달라진 새 엑스

코드 버전을 최근에 출시했다. 기존에 엑스코드를 사용해 봤지만 아직 엑스코드 4로 작업한 적

이 없다면 꽤 많은 내용이 바뀌었음을 눈치챌 수 있을 것이다.

엑스코드를 처음 실행하면 그림 2-1과 같은 환영 창이 나타난다. 이 창에서는 새 프로젝트를

생성할 수도 있고 버전 관리 시스템에 연결해 기존 프로젝트를 체크아웃할 수도 있으며, 최근에

열어 본 프로젝트 목록에서 프로젝트를 선택해 열 수도 있다. 환영 창에서는 iOS와 맥 OS X 기

술 문서, 튜토리얼 동영상, 뉴스, 예제 코드, 기타 유용한 자료들에 대한 링크도 제공한다. 이들

기능은 엑스코드의 메뉴에서도 접근할 수 있지만, 환영 창은 개발자들이 엑스코드를 처음 실

행할 때 보통 가장 많이 하는 작업들을 모두 보여줌으로써 초기 개발을 순조롭게 시작할 수 있

게 해준다. 환영 창에서 제공하는 정보의 내용을 잠시 살펴보고 싶다면 얼마든지 그렇게 해도

된다. 궁금한 정보를 모두 살펴봤다면 환영 창을 닫고 다음 내용을 진행한다. 다음 번에 엑스코

드를 실행할 때 환영 창이 나타나지 않게 하려면 환영 창을 닫기 전에 Show this window when

Xcode launches 체크박스를 선택 해제하면 된다.

Page 45: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

02 티키 신 달래기 l 19

그림 2-1 ㅣ 엑스코드의 환영 창

알아두기

컴퓨터와 연결된 iOS 기기가 있다면 엑스코드를 처음 실행할 때 연결된 기기를 개발에 사용할

지 묻는 대화상자가 보일 것이다. 지금은 일단 Ignore 버튼을 클릭한다. 또는 이때 여러분의

컴퓨터와 동기화된 기기 목록을 보여주는 Organizer 창이 나타날 수도 있다. Organizer 창

이 나타나면 창을 닫아 버린다. 유료 iOS 개발자 프로그램에 등록했다면 iOS 기기를 개발 및

테스트에 활용하는 방법을 알려주는 프로그램 포탈에 접근할 수 있다.

File 메뉴에서 New New Project...를 선택하거나 N 단축키를 사용해 새 프로젝트를 생

성한다. 그럼 새 프로젝트 창이 열리고 프로젝트 템플릿 선택 시트(그림 2-2)를 보여줄 것이다. 이

시트에서 애플리케이션을 개발할 때 시작점으로 사용할 프로젝트 템플릿을 선택해야 한다. 이

시트의 왼쪽 영역은 크게 iOS와 Mac OS X라는 두 영역으로 나뉘어 있다. 여기서는 iOS 애플리

케이션을 개발하고 있으므로 iOS 영역에서 Application을 선택해 iOS 애플리케이션 템플릿이

표시되게 한다.

Page 46: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

20 l 시작하세요! 아이폰 5 프로그래밍

그림 2-2 ㅣ 프로젝트 템플릿 시트는 새 프로젝트를 생성할 때 선택할 수 있는 다양한 템플릿을 제공한다.

그림 2-2의 우측 상단 영역에 있는 아이콘 각각은 iOS 애플리케이션의 시작점으로 사용할 수

있는 개별 프로젝트 템플릿을 나타낸다. 이 중 Single View Application이라는 라벨이 적힌 아이

콘은 가장 간단한 템플릿으로, 이 책의 처음 몇 장에서는 이 템플릿만 사용한다. 나머지 템플릿

은 자주 사용하는 아이폰 및 아이패드 애플리케이션 인터페이스를 생성하는 데 필요한 추가 코

드 및/또는 리소스를 제공한다. 이들 템플릿은 이후 장들에서 살펴볼 것이다.

(그림 2-2처럼) Single View Application 아이콘을 클릭하고 Next 버튼을 클릭한다. 그럼 그

림 2-3과 같은 프로젝트 옵션 시트를 볼 수 있다. 이 시트에서는 프로젝트의 Product Name과

Company Identi�er를 지정해야 한다. 엑스코드에서는 이 두 정보를 조합해 앱의 고유 번들 식

별자(Bundle Identi�er)를 생성한다. 그림 2-3과 같이 Product Name에는 Hello World를 입력

하고 Company Identi�er에는 com.apress를 입력한다. 나중에 개발자 프로그램에 가입하고 프

로비저닝 프로파일에 대해 배우고 나면 실제 여러분이 속한 회사의 식별자를 이 위치에 사용하

면 된다. 번들 식별자에 대해서는 이 장에서 나중에 좀 더 자세히 설명한다.

Page 47: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

02 티키 신 달래기 l 21

그림 2-3 ㅣ 프로젝트의 제품명과 회사 식별자를 선택. 지금은 일단 이 그림의 설정을 그대로 사용한다.

다음으로 보이는 텍스트 상자에는 Class Pre�x라는 라벨이 적혀 있다. 이 텍스트 상자에는 최

소 세 글자의 대문자를 사용해 내용을 채워야 한다. 이들 문자는 엑스코드에서 생성해주는 모든

클래스명 앞에 추가된다. 이런 동작은 (모든 두 글자 접두어의 사용을 예약어로 지정한) 애플 및

우리가 사용할 수 있는 다른 개발자의 코드와 클래스 이름이 충돌하는 것을 막기 위한 것이다.

오브젝티브-C에서는 둘 이상의 클래스가 같은 이름을 갖고 있으면 애플리케이션이 빌드되지 않

는다.

이 책의 프로젝트에서는 BID라는 접두어를 사용한다. BID는 Beginning iPhone Development

의 약어다. 예를 들어 클래스 이름이 ViewController인 클래스는 많이 있을 수 있지만 BIDMy

ViewController 같은 이름의 클래스는 이보다는 훨씬 수가 적은 게 보통이다. 따라서 이런 접두

어를 사용하면 그만큼 이름이 충돌할 가능성이 줄어든다.

또 Device Family도 지정해야 한다. 다시 말해 엑스코드에서는 개발자가 아이폰 및 아이팟 터

치용 앱을 개발하는지, 아이패드용 앱을 개발하는지, 또는 모든 iOS 기기에서 실행되는 유니버

설 앱을 개발하는지 묻는다. 아직 선택하지 않았다면 Device Family로 iPhone을 선택한다. 이

렇게 하면 엑스코드는 같은 화면 크기를 갖고 있는 아이폰과 아이팟 터치를 대상으로 이 앱을 개

발한다. 이 책의 앞 부분에서는 아이폰 기기 패밀리를 사용하고 있지만, 아이패드도 이후 다룰

테니 걱정하지 않아도 않다.

Page 48: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

22 l 시작하세요! 아이폰 5 프로그래밍

이 시트에는 세 개의 체크박스가 있다. 이 중 가운데 있는 Automatic Reference Counting 옵

션만 체크하고 나머지 두 체크박스는 선택 해제한 채로 둔다. 자동 참조 카운팅(ARC)은 iOS 5에

서 도입된 오브젝티브-C 언어의 새 기능으로, iOS 개발을 훨씬 더 쉽게 해준다. ARC에 대해서는

다음 장에서 간단히 설명할 것이다.

Use Storyboard 옵션은 10장부터 다루기 시작한다. 또 다른 옵션(Include Unit Tests)은 단위

테스트라는 특수 코드를 추가할 수 있게 프로젝트를 설정한다. 이런 단위 테스트 코드는 애플리

케이션에 포함되지는 않지만 애플리케이션을 개발하면서 특정 기능을 테스트할 때 매번 실행할

수 있다. 단위 테스트를 사용하면 새로 추가한 코드로 인해 기존에 동작하던 기능에 문제가 생

겼는지 여부를 쉽게 파악할 수 있다. 물론 단위 테스트 툴은 유용하긴 하지만 이 책에서는 자동

화된 단위 테스트를 사용하지 않는 만큼 이 체크박스는 빈 채로 둔다.

Next를 한 번 더 클릭하면 그림 2-4처럼 표준 저장 시트를 통해 새 프로젝트를 어디에 저장할

지 묻는 화면이 나온다. 아직 프로젝트 폴더를 생성하지 않았다면 파인더로 이동해 이 책의 프로

젝트를 저장할 마스터 디렉터리를 새로 생성하고, 엑스코드로 돌아온 후 이 디렉터리로 이동한

다. Create 버튼을 클릭하기 전에는 Create local git repository for this project 체크박스를 선택

해제했는지 확인한다. Source Control 체크박스를 선택 해제한 상태에서 Create 버튼을 클릭해

새 프로젝트를 생성한다.

알아두기

소스 컨트롤 저장소는 애플리케이션을 개발하는 동안 수정된 애플리케이션 소스 코드와 리소

스를 추적하는 데 사용하는 툴이다. 이런 소스 컨트롤 저장소는 소스 충돌이 일어날 경우 이를

해결해줄 툴을 제공함으로써 여러 개발자가 동시에 같은 애플리케이션에 대한 공동 작업을 쉽

게 할 수 있게 해준다. 이 책에서는 소스 컨트롤을 사용하지 않으므로 이 체크박스는 선택 해

제한 채로 두면 된다.

Page 49: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

02 티키 신 달래기 l 23

그림 2-4 ㅣ 하드 드라이브러의 프로젝트 폴더에 프로젝트를 저장

엑스코드 워크스페이스 창

저장 시트를 닫고 나면 엑스코드에서는 새 프로젝트를 생성하고 열어준다. 그럼 그림 2-5와 같은

새로운 워크스페이스 창을 볼 수 있다. 이 창에는 수많은 정보가 들어 있으며, iOS 개발을 하면

서 주로 시간을 보내는 곳 또한 바로 이 창이다.

Page 50: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

24 l 시작하세요! 아이폰 5 프로그래밍

그림 2-5 ㅣ 엑스코드의 Hello World 프로젝트

기존 엑스코드 버전을 사용해 본 경험이 있는 독자라 하더라도 엑스코드 3.x 이후 많은 내용

이 바뀌었으므로 이 절의 내용을 읽으면 많은 도움이 될 것이다. 그럼 엑스코드를 빠르게 살펴

보자.

툴바

엑스코드 워크스페이스 창의 상단은 툴바(그림 2-6)라고 부른다. 툴바의 좌측에는 프로젝트를

시작하고 멈출 수 있는 컨트롤, 실행할 스키마를 고를 수 있는 팝업 메뉴, 브레이크포인트를 켜고

끌 수 있는 토글 버튼이 있다. 스키마는 타깃과 빌드 설정을 함께 보여주며 툴바 팝업 메뉴는 클

릭 한 번으로 특정 설정을 선택할 수 있게 해준다.

툴바

그림 2-6 ㅣ 엑스코드 툴바

Page 51: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

02 티키 신 달래기 l 25

툴바의 가운데 있는 큰 상자는 액티비티 뷰다. 이름에서 알 수 있듯이 액티비티 뷰는 현재 진행

중인 행동과 프로세스를 표시한다. 예를 들어 프로젝트를 실행하면 애플리케이션을 빌드하는 데

필요한 여러 단계 중 현재 진행 중인 단계를 표시한다. 빌드 과정에서 에러나 경고가 발생하면 이

곳에도 이 정보가 표시된다. 이곳에서 에러나 경고를 클릭하면 이슈 내비게이터로 바로 이동해 에

러나 경고에 대한 상세 정보를 확인할 수 있다. 이슈 내비게이터는 다음 절에서 설명한다.

툴바 오른쪽에는 세 개의 버튼 그룹이 있다. Editor라고 적힌 왼쪽 버튼 그룹에서는 각기 다른

편집기 환경을 전환할 수 있게 해준다.

� 표준 뷰(standard view)는 파일 또는 프로젝트 관련 설정 값 편집에 특화된 단일 영역을

제공한다.

� 매우 강력한 어시스턴트 뷰(assistant view)는 편집 영역을 좌우 두 영역으로 나눈다. 이

때 우측 영역은 보통 왼쪽에 있는 파일과 관련한 파일을 보여주거나 왼쪽에 있는 파일을

편집하는 동안 참조할 파일을 보여준다. 각 영역에 들어갈 내용은 직접 지정할 수도 있고

엑스코드에서 작업과 관련해 가장 적합한 내용을 보여주게 할 수도 있다. 예를 들어 오브

젝티브-C 클래스(.m 파일)의 구현체를 편집 중일 때는 엑스코드에서 자동으로 이 클래

스의 헤더 파일(.h 파일)을 오른쪽 영역에 보여준다. 또 왼쪽에서 UI를 디자인 중일 때는

엑스코드가 UI에서 상호작용할 수 있는 코드를 오른쪽에 보여준다. 어시스턴트 뷰를 활

용하는 법은 이 책을 통해 계속해서 살펴볼 것이다.

� 버전 버튼은 서브버전이나 깃(Git) 같은 소스 코드 관리 시스템과 연동하는 타임머신 같

은 비교 뷰로 편집 영역을 바꾼다. 이를 통해 소스 파일의 현재 버전을 과거 커밋된 버전

과 비교하거나 과거 버전에 해당하는 두 코드를 서로 비교할 수도 있다.

에디터 버튼 그룹 오른쪽에는 편집기 영역의 좌우측에 있는 내비게이터 영역과 유틸리티 영역

을 보여주고 감출 수 있는 또 다른 버튼 그룹이 있다. 이들 버튼을 클릭해 이들 영역이 어떻게 바

뀌는지 확인해 보자.

끝으로 가장 오른쪽에 있는 버튼은 Organizer 창을 연다. 이 창에서는 프로젝트와 직접적인

관련이 없는 다양한 기능을 제공한다. 이 창은 애플의 API 문서를 보는 문서 뷰어로 사용할 수도

있고, 엑스코드에서 알고 있는 모든 소스 코드 저장소를 보여주기도 하며, 지금까지 연 모든 프로

젝트 목록을 보관하고, 컴퓨터와 동기화된 모든 기기 목록을 관리하기도 한다.

Page 52: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

26 l 시작하세요! 아이폰 5 프로그래밍

내비게이터 뷰

툴바 바로 아래, 워크스페이스 창 왼쪽에는 내비게이터 뷰가 있다. 내비게이터 뷰는 프로젝트 뷰

를 전환할 수 있는 7가지 설정을 제공한다. 내비게이터 뷰 상단에 있는 아이콘 중 하나를 클릭하

면 다음 내비게이터 사이에서 전환할 수 있다(왼쪽에서 오른쪽 순서).

� 프로젝트 내비게이터: 이 뷰에는 프로젝트에서 사용하는 파일 목록이 들어 있다(그림

2-7 참고). 소스 코드 파일부터 아트워크, 데이터 모델, 프로퍼티 리스트(또는 plist) 파일

(이 장에서 ‘프로젝트 자세히 살펴보기’ 절에서 나중에 다룸)에 이르기까지 모든 내용(심

지어 다른 프로젝트 파일조차)에 대한 참조를 저장할 수 있다. 한 워크스페이스에 여러

프로젝트를 저장하면 여러 프로젝트에서 리소스를 공유할 수 있다. 내비게이터 뷰에서

파일 하나를 클릭하면 이 파일은 편집기 영역에서 열린다. 이때 파일을 보는 것 외에 파일

을 편집할 수도 있다(엑스코드에서 파일을 편집하는 법을 알고 있는 경우).

프로젝트 내비게이터

그림 2-7 ㅣ 엑스코드 내비게이터 뷰에서 프로젝트 내비게이터를 보여주는 모습. 뷰 상단에 있는 7개의 아

이콘 중 하나를 클릭하면 내비게이터를 전환할 수 있다.

� 심볼 내비게이터: 이름에서 암시하듯 이 내비게이터는 워크스페이스에서 정의한 심볼에

초점을 맞춘다(그림 2-8 참고). 심볼은 기본적으로 컴파일러에서 인식하는 항목들로, 오

브젝티브-C 클래스, 열거형, 구조체, 전역 변수 등을 말한다.

Page 53: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

02 티키 신 달래기 l 27

심볼 내비게이터

그림 2-8 ㅣ 엑스코드 내비게이터 뷰가 심볼 내비게이터를 보여주는 모습. 펼침 삼각형을 열면 각 그룹에 들

어 있는 파일과 심볼을 확인할 수 있다.

� 검색 내비게이터: 이 내비게이터는 워크스페이스 내에서 전체 파일에 대한 검색을 수행할

때 사용할 수 있다(그림 2-9 참고). Find 팝업 메뉴에서 Replace를 선택하고 검색을 수행

하면 검색 결과 전체 또는 선택된 영역을 다른 내용으로 바꿀 수 있다. 보다 상세한 검색

을 수행하려면 검색 필드의 돋보기와 연계된 팝업 메뉴에서 Show Find Options를 선택

하면 된다.

Page 54: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

28 l 시작하세요! 아이폰 5 프로그래밍

검색 내비게이터

그림 2-9 ㅣ 검색 내비게이터를 보여주는 엑스코드 내비게이터 뷰. Find 단어와 검색 필드에 돋보기가 있을

때는 팝업 메뉴가 감춰져 있는 것을 확인하자.

� 이슈 내비게이터: 프로젝트를 빌드할 때 생긴 에러나 경고는 이 내비게이터에 나타나고,

에러 번호에 대한 상세 메시지는 창 상단의 액티비티 뷰에 나타난다(그림 2-10 참고). 이

슈 내비게이터에서 에러를 클릭하면 편집기 영역의 해당 코드 줄로 바로 이동한다

이슈 내비게이터

그림 2-10 ㅣ 이슈 내비게이터를 보여주는 엑스코드 내비게이터 뷰. 이곳에서 컴파일러 에러와 경고를 볼

수 있다.

� 디버그 내비게이터: 이 내비게이터는 디버깅 프로세스의 메인 뷰다(그림 2-11 참고). 디버

깅을 해본 적이 없다면 엑스코드 4 사용자 가이드에서 디버깅에 대한 내용을 참고하는

게 좋다(http://developer.apple.com/library/mac/#documentation/ToolsLanguages/

Conceptual/Xcode4UserGuide/Debugging/Debugging.html).

Page 55: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

02 티키 신 달래기 l 29

디버그 내비게이터에는 개별 활성 스레드에 대한 스택 프레임 목록이 나와 있다. 스택 프

레임은 앞서 호출한 함수 또는 메서드를 호출 순서대로 나열한 목록이다. 메서드를 클릭

하면 편집기 영역에서 관련 코드가 나타난다. 편집기에서는 디버깅 프로세스를 제어하고

데이터 값을 보여주거나 수정하며, 저수준 디버거에 접근할 수 있게 해주는 또 다른 프레

임을 제공한다. 디버그 내비게이터 하단에 있는 슬라이더를 사용하면 추적하는 레벨을

제어할 수 있다. 슬라이더를 오른쪽 끝으로 옮기면 모든 파일 시스템 호출을 비롯해 모든

내용을 전부 볼 수 있다. 슬라이더를 왼쪽 끝으로 옮기면 여러분이 호출한 내용만 볼 수

있다. 처음 사용할 때는 가운데 있는 기본 설정을 그냥 사용하는 게 좋다.

디버그 내비게이터

그림 2-11 ㅣ 디버그 내비게이터를 보여주는 엑스코드 내비게이터 뷰. 볼 수 있는 디버그 상세 레벨을 제어

할 수 있게 해주는 창 하단 상세 슬라이더를 꼭 사용해 보자.

� 브레이크포인트 내비게이터: 브레이크포인트 내비게이터는 설정한 모든 브레이크포인트

를 볼 수 있게 해준다(그림 2-12 참고). 이름에서 암시하듯 브레이크포인트는 애플리케이

션이 실행을 멈추는 코드 점을 가리키며, 이런 브레이크포인트를 설정해 개발자는 변수

의 값을 살펴보거나 애플리케이션을 디버그하는 데 필요한 기타 작업을 할 수 있다. 이 내

비게이터의 브레이크포인트 목록은 파일순으로 조직화된다. 이 목록에서 브레이크포인

트를 클릭하면 해당 코드 줄이 편집기 영역에 나타난다. 브레이크포인트 내비게이터를 볼

때는 워크스페이스 창의 좌측 하단 구석에 있는 팝업도 확인하자. 플러스 팝업은 예외 또

는 심볼 브레이크포인트를 추가하게 해주고, 마이너스 팝업은 선택한 브레이크포인트를

삭제한다.

Page 56: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

30 l 시작하세요! 아이폰 5 프로그래밍

브레이크포인트 내비게이터

그림 2-12 ㅣ 브레이크포인트 내비게이터를 보여주는 엑스코드 내비게이터 뷰. 브레이크포인트 목록은 파

일순으로 조직화된다.

� 로그 내비게이터: 이 내비게이터는 최근 빌드 결과와 실행 로그 히스토리를 보관한다(그

림 2-13 참고). 특정 로그를 클릭하면 편집 영역과 빌드 명령과 빌드 이슈가 표시된다.

로그 내비게이터

그림 2-13 ㅣ 로그 내비게이터를 보여주는 엑스코드 내비게이터. 로그 내비게이터는 빌드 목록을 보여주고,

편집 영역을 통해 선택한 항목의 상세 로그를 보여준다.

점프 바

점프 바는 클릭 한 번으로 현재 이동 중인 계층구조 내에서 특정 항목으로 바로 이동할 수 있게

해준다. 예를 들어 그림 2-14에서는 편집 영역에서 편집 중인 소스 파일이 나와 있다. 점프 바는

이 소스 코드 바로 위에 있다. 이때 점프 바를 활용하는 법은 다음과 같다.

Page 57: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

02 티키 신 달래기 l 31

� 점프 바의 좌측 끝에 있는 아이콘은 최근에 사용한 파일, 저장하지 않은 파일, 대응되는

파일, 상위 클래스, 하위 클래스, 형제 클래스, 카테고리, 클래스 인클루드, 현재 파일에서

포함하는 파일 목록으로 구성된 하위 메뉴를 보여주는 팝업 메뉴다.

� 위버 메뉴 오른쪽에는 이전 파일로 이동하거나 다음 파일로 넘어갈 수 있게 해주는 좌우

측 화살표가 있다.

� 점프 바에는 현재 편집기에서 보여줄 수 있는 현재 프로젝트 관련한 파일들을 보여주는

팝업도 들어 있다. 그림 2-14에서는 현재 소스 코드 편집기상에서 작업 중이므로 프로젝

트의 모든 소스 코드를 볼 수 있다. 점프 바 끝에는 현재 선택한 파일에 들어 있는 메서드

와 기타 심볼을 보여주는 팝업이 있다. 그림 2-14의 점프 바는 BIDAppDelegate.m과 더

불어 이 파일에 정의된 심볼들을 나열한 서브 메뉴도 함께 보여주고 있다.

그림 2-14 ㅣ 엑스코드 편집기 영역에서 소스 코드 파일을 선택한 채로 점프 바를 보여주는 모습. 하위 메

뉴에서는 선택된 파일의 메서드 목록을 보여준다.

점프 바는 매우 강력한 기능을 제공한다. 엑스코드 4를 구성하는 다양한 인터페이스 요소를

살펴보면서 이런 점프 바를 어떻게 활용할지 기대해 보자.

라이온(맥 OS X 10.7)에서 엑스코드를 실행 중이라면 전체 화면 모드를 완벽히 지원한다. 프

로젝트 창의 우측 상단에 있는 전체 화면 버튼을 클릭하면 다른 화면의 방해를 받지 않고 전체

화면에서 코딩을 즐길 수 있다!

Page 58: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

32 l 시작하세요! 아이폰 5 프로그래밍

엑스코드 키보드 단축키

마우스로 화면 컨트롤을 클릭하지 않고 키보드 단축키를 사용해 이동하는 것을 더 선호한

다면 엑스코드에서 제공하는 단축키 기능을 참고하자. 엑스코드에서 자주 하는 대부분의

작업은 지정된 단축키를 사용하더라도 처리할 수 있다. 예를 들어 B를 사용하면 애플리

케이션을 빌드할 수 있고, N을 사용하면 새 파일을 생성할 수 있다.

또 엑스코드의 키보드 단축키는 모두 변경할 수 있으며 엑스코드 환경설정에서 Key

Bindings 탭을 통해 기본으로 제공하지 않는 단축키 명령은 새로 추가할 수도 있다. 정말

편리한 단축키를 하나 소개하면 O가 있다. 이 단축키는 엑스코드의 빨리 열기 기능 단

축키다. 이 단축키를 누른 다음 파일, 설정, 심볼의 이름을 입력하기 시작하면 엑스코드에

서는 여러 가지 옵션 목록을 보여준다. 옵션 목록에 찾고 있는 파일 하나만 남을 때까지 파

일명을 입력한 후 리턴을 누르면 이 파일을 편집기 영역에서 바로 열 수 있다. 이와 같이 이

단축키를 활용하면 키보드를 단 몇 차례만 눌러서 손쉽게 파일을 전환할 수 있다.

유틸리티 영역

앞서 언급한 것처럼 엑스코드 툴바에서 오른쪽 측면 끝에서 두 번째 있는 버튼은 유틸리티 영역

을 열고 닫는다. 인스펙터와 마찬가지로 유틸리티 영역은 맥락을 인지해 현재 편집 영역에서 보여

주는 내용에 따라 그 내용이 달라진다. 유틸리티 영역을 활용하는 예제는 이 책을 통해 계속해서

보게 될 것이다.

인터페이스 빌더

과거 엑스코드 버전에는 프로젝트의 사용자 인터페이스를 개발하고 커스터마이징할 수 있는 인

터페이스 빌더라는 디자인 툴이 들어 있었다. 엑스코드 4에서 크게 달라진 점 중 하나는 인터페

이스 빌더가 워크스페이스로 통합된 점이다. 이제 인터페이스 빌더가 더 이상 별도의 프로그램

이 아니다. 이 말은 코드를 작성하고 UI를 개발하는 동안 엑스코드와 인터페이스 빌더 사이를

계속 왔다갔다 하는 일을 더 이상 하지 않아도 된다는 뜻이다.

이 책에서는 엑스코드의 인터페이스 개발 기능과 관련한 세부 사항을 모두 살펴봄으로써 인터

페이스 빌더를 폭넓게 활용한다. 사실 이 장에서도 잠시 후 첫 번째 인터페이스 개발을 시작한다.

새 컴파일러와 디버거

엑스코드 4에서 가장 중요한 변경 사항 중 하나는 엑스코드 내부에 감춰져 있다. 즉, 엑스코드의

새 컴파일러와 저수준 디버거가 이에 해당한다. 둘 모두 이전 컴파일러 및 디버거와 비교해 눈에

Page 59: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

02 티키 신 달래기 l 33

띄게 빨라졌으며 더 똑똑해졌다.

새 컴파일러인 LLVM 3는 기존 엑스코드 버전에서 기본 컴파일러였던 GCC에서 생성한 코드

보다 훨씬 빠른 코드를 생성한다. LLVM은 빠른 코드를 생성할 뿐 아니라 코드에 대해서도 더 많

은 지식을 알고 있으므로, 더 똑똑하고 정확한 에러 메시지와 경고를 내보낼 수 있다.

또 LLVM은 더욱 정확한 코드 완성 기능을 제공할 수 있으며 경고를 내보내거나 가능한 해결

책으로 보여줄 팝업 메뉴를 생성할 때도 개발자가 입력한 코드의 실제 의도를 좀 더 정확히 예측

할 수 있다. 이로 인해 잘못된 심볼명을 입력하는 오류나, 괄호가 일치하지 않는 오류, 세미콜론

을 빼먹는 오류를 쉽게 찾아 고칠 수 있다.

LLVM은 오브젝티브-C 메모리 관리와 관련한 문제를 비롯해 다양한 문제들을 코드에서 분석

할 수 있는 정교한 정적 코드 분석기를 사용할 수 있게 해준다. 사실 LLVM은 이런 정보를 매우

잘 알고 있으며 코드를 작성할 때 규칙 몇 가지를 지키기만 한다면 대부분의 메모리 관리를 대신

해줄 수 있다. 앞서 언급한 ARC라는 멋진 새 기능은 다음 장부터 살펴보기 시작한다.

프로젝트 자세히 살펴보기

이제 엑스코드 워크스페이스 창을 충분히 살펴봤으니 Hello World 프로젝트를 구성하는 파일

들을 살펴보자. (이 장의 '내비게이터 뷰' 절에서 설명한 것처럼) 워크스페이스 왼쪽에 있는 7개의

내비게이터 아이콘 중 가장 왼쪽에 있는 아이콘을 클릭하거나 1을 눌러 프로젝트 내비게이터

로 전환한다.

7개의 내비게이터 설정은 1부터 7 사이의 키보드 단축키를 통해서도 접근할 수 있다. 이

들 단축키에 사용하는 번호는 왼쪽에서부터 시작하는 아이콘과 대응된다. 따라서 1은 프로

젝트 내비게이터, 2는 심볼 내비게이터 순으로 진행돼 7은 로그 내비게이터로 이어진다.

프로젝트 내비게이터 목록의 첫 번째 항목은 프로젝트와 이름이 같다. 이 예제의 경우 이 항목

의 이름은 Hello World다. 이 항목은 전체 프로젝트를 나타내며 프로젝트 관련 설정도 이 항목

에서 지정할 수 있다. 이 항목을 한 번 클릭하면 엑스코드의 편집기에서 다양한 설정을 수정할

수 있다. 하지만 아직은 이런 설정에 대해 신경 쓰지 않아도 된다. 아직은 기본 설정을 그냥 사용

하면 된다.

Page 60: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

34 l 시작하세요! 아이폰 5 프로그래밍

그림 2-7을 다시 살펴보자. 그럼 Hello World 왼쪽에 있는 삼각형이 열려 있고 여러 개의 하위

폴더(엑스코드에서는 그룹이라고 부름)가 있는 것을 볼 수 있다.

� Hello World: 항상 프로젝트와 이름이 같은 첫 번째 폴더는 개발하면서 대부분의 작업을

하는 폴더다. 이 폴더에는 여러분이 앞으로 작성할 대부분의 코드가 들어가고, 더불어 애

플리케이션의 UI를 구성하는 파일들도 이 폴더에 보관한다. 코드를 좀 더 조직화하려면

Hello World 폴더 안에 하위 폴더를 마음대로 생성하면 되고, 좀 더 다른 조직화 방식을

사용하려면 아예 다른 그룹을 사용할 수도 있다. 이 책에서는 다음 장까지는 이 폴더에

들어 있는 대부분의 파일을 건드리지 않지만, 다음 절에서 인터페이스 빌더를 활용하는

과정에서 한 파일은 자세히 살펴볼 것이다.

• BIDViewController.xib에는 프로젝트의 메인 뷰 컨트롤러와 관련한 사용자 인터페

이스 요소가 들어 있다.

� Supporting Files: 이 폴더에는 오브젝티브-C 클래스에 속하지 않지만 프로젝트에는 필

요한 소스 코드 파일과 리소스가 들어 있다. 보통 개발할 때는 다른 소스 폴더에서 많은

시간을 보내지는 않는다. 새 아이폰 애플리케이션 프로젝트를 생성하면 이 폴더에 네 개

의 파일이 들어 있다.

• Hello_World-Info.plist는 애플리케이션에 대한 정보를 담고 있는 프로퍼티 리스트다.

이 파일의 내용은 이 장의 ‘아이폰 앱처럼 다듬기 - 화룡점정’ 절에서 간단히 살펴볼 것

이다.

• InfoPlist.strings는 info 프로퍼티 리스트에서 참조할 수 있는 사람이 읽기 쉬운 문자

열이 들어 있는 텍스트 파일이다. info 프로퍼티 리스트와 달리 이 파일은 애플리케이

션에서 여러 언어 번역을 포함할 수 있도록 지역화할 수 있다(이 주제는 21장에서 다

룬다).

• main.m은 애플리케이션의 main() 메서드를 포함한다. 보통 이 파일은 편집하거나 수

정하지 않아도 된다. 사실 이 파일처럼 내용을 제대로 이해하지 못하는 요소들은 그

냥 건드리지 않는 게 좋다.

• Hello_World_Prefix.pch는 프로젝트에서 사용하는 외부 프레임워크의 헤더 파일

목록이다(.pch 확장자는 precompiled header(사전 컴파일한 헤더)를 나타낸다). 이

파일에서 참조하는 헤더는 보통 프로젝트에 포함되지 않은 헤더로, 자주 바뀌지 않는

헤더가 대부분이다. 엑스코드는 이런 헤더를 미리 컴파일 한 후 향후 빌드에서 계속

Page 61: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

02 티키 신 달래기 l 35

해서 미리 컴파일한 헤더를 사용한다. 이렇게 하면 Build나 Run을 선택할 때 프로젝

트를 컴파일하는 데 드는 시간을 줄일 수 있다. 가장 많이 사용하는 헤더 파일들은 이

미 포함돼 있으므로 한동안은 이 파일에 대해 실제로 걱정하지 않아도 된다.

� Frameworks: 이 폴더는 코드와 더불어 이미지, 사운드 파일 같은 리소스를 포함할 수 있

는 특수 라이브러리다. 이 폴더에 추가한 프레임워크나 라이브러리는 애플리케이션으로

연결되며 코드에서는 이런 프레임워크나 라이브러리에 들어 있는 객체, 함수, 리소스를

모두 사용할 수 있다. 가장 많이 사용하는 프레임워크와 라이브러리는 프로젝트에 기본

으로 연결돼 있는 만큼, 보통은 이 폴더에 아무 내용도 추가하지 않아도 된다. 기본으로

연결돼 있지 않으며 사용 빈도가 조금 덜한 라이브러리나 프레임워크를 꼭 추가해야 할

때는 Frameworks 폴더에 손쉽게 추가할 수 있다. 프레임워크를 추가하는 법은 7장에서

살펴본다.

� Products: 이 폴더에는 프로젝트가 빌드될 때 생성하는 애플리케이션이 들어 있다.

Products 폴더를 펼치면 Hello World.app이라는 항목을 볼 수 있다. 이 항목이 바로 이

프로젝트에서 생성한 애플리케이션이다. Hello World.app은 이 프로젝트의 유일한 결과

물이다. 아직 이 프로젝트를 빌드하지 않았으므로 Hello World.app은 현재 빨간색으로

표시돼 있다. 이 표시는 엑스코드에서 파일 참조가 아직 존재하지 않는 대상을 가리키고

있음을 알려줄 때 사용한다.

알아두기

내비게이터 영역에서 폴더는 맥의 파일 시스템 폴더와 완전히 대응되지 않는다. 이들 폴더는

애플리케이션 작업을 할 때 좀 더 쉽게 내용을 찾을 수 있게끔 엑스코드에서 모든 내용을 조직

화하기 위해 사용하는 논리적인 그룹일 뿐이다. 두 프로젝트 폴더에 포함된 항목들이 프로젝

트 디렉터리에 직접 저장된 경우도 있지만, 이들 항목은 (필요하다면 프로젝트 폴더 바깥을 비

롯해) 어디에나 저장할 수 있다. 엑스코드 내의 계층구조는 파일 시스템 계층구조로부터 완전

히 독립적이므로 예를 들어 엑스코드의 프로젝트명 폴더에서 파일을 꺼낸다고 해서 하드 드라

이브의 물리적인 파일 위치가 바뀌지는 않는다.

물론 유틸리티 영역에서 특정 파일 시스템 디렉터리를 사용해 그룹을 설정할 수도 있다. 하지

만 기본적으로 프로젝트에 추가되는 새 그룹은 파일 시스템으로부터 완전히 독립적이며, 그룹

에 들어 있는 내용도 아무 위치로나 옮길 수 있다.

Page 62: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

36 l 시작하세요! 아이폰 5 프로그래밍

엑스코드 인터페이스 빌더의 소개

아직 열려 있지 않다면 워크스페이스 창의 프로젝트 내비게이터에서 Hello World 그룹을 펼치

고 BIDViewController.xib 파일을 선택한다. 그럼 그림 2-15처럼 이 파일이 편집 영역에서 바로

열릴 것이다. 편집 영역에서는 인터페이스를 수정할 때 멋진 대비를 이루는 모눈종이 배경을 볼

수 있다. 이 편집 영역이 바로 엑스코드의 인터페이스 빌더(IB라고 부르기도 한다)이며, 바로 이

곳에서 애플리케이션의 UI를 디자인한다.

인터페이스 빌더는 오랜 역사를 갖고 있다. 인터페이스 빌더는 1988년에 출시됐으며

NeXTSTEP, OpenStep, 맥 OS X용 애플리케이션 개발에 사용되다가 현재는 아이폰, 아이패드

같은 iOS용 기기에 사용되고 있다. 앞서 설명한 대로 엑스코드 4 이전에는 인터페이스 빌더가 엑

스코드와 함께 설치되는 별도 애플리케이션이었으며, 엑스코드와 병행해 사용됐다. 하지만 지금

은 인터페이스 빌더가 엑스코드로 완전히 통합됐다.

인터페이스 빌더는 두 가지 파일 타입을 지원한다. 바로 .nib 확장자를 갖고 있는 과거 형식과

.xib 확장자를 갖고 있는 새 형식이다. iOS 프로젝트 템플릿은 모두 기본적으로 .xib을 사용하지

만 인터페이스 빌더가 나온 후 처음 20년 동안 모든 인터페이스 빌더 파일이 .nib 확장자를 사용

했다. 이로 인해 대부분의 개발자들은 인터페이스 빌더 파일을 ‘nib 파일’이라고 많이 부른다. 인

터페이스 빌더 파일은 실제 파일에 사용한 확장자가 .xib이든 .nib이든 상관없이 nib 파일로 많

이 부른다. 실제로 애플의 문서에서도 nib 또는 nib 파일이란 용어를 계속해서 사용하고 있다.

모눈종이 좌측 모서리에 있는 회색 수직 바는 독(dock)이라고 부른다. 독에는 nib 파일의 최

상위 레벨 객체 각각에 대한 아이콘이 들어 있다. 독의 하단 오른쪽에 있는 동그라미 안의 삼각

형을 클릭하면 이들 객체를 리스트 뷰 형태로 볼 수 있다. 이 아이콘을 다시 한 번 클릭하면 아이

콘 뷰로 되돌아온다.

Page 63: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

02 티키 신 달래기 l 37

그림 2-15 ㅣ 프로젝트 내비게이터에서 BIDViewController.xib를 선택한 모습. 이렇게 BIDView

Controller.xib을 선택하면 편집 영역에 이 파일이 열린다. 편집 영역에서는 모눈종이 배경을 볼 수 있다. 모눈

종이 왼쪽에 있는 회색의 수직 바는 독이라고 부른다.

nib 파일에서 상단에 있는 두 아이콘은 File’s Owner와 First Responder라고 부른다. 이들 항

목은 모든 nib 파일이 갖고 있는 특수 항목으로, 잠시 후 좀 더 자세히 설명할 것이다. 나머지 아

이콘 각각은 nib 파일이 로드될 때 자동으로 생성되는 오브젝티브-C 클래스의 단일 인스턴스를

나타낸다. 이 nib 파일에는 필수 File’s Owner와 First Responder 외에 추가 아이콘이 한 개뿐이

다. 이 세 번째 아이콘(가로 선 아래 있는 아이콘)은 뷰 객체를 나타낸다. 이 뷰 객체는 애플리케

이션이 실행될 때 보이는 뷰로, 앞서 이 프로젝트에서 Single View Application 템플릿을 선택했

을 때 자동으로 생성됐다.

이번에는 버튼 인스턴스를 생성한다고 가정해 보자. 이런 버튼은 코드를 작성해 생성할 수도

있지만 라이브러리에서 버튼을 드래그해 인터페이스 객체를 생성하고 어트리뷰트를 지정하는 방

식이 훨씬 간편하다. 더불어 두 경우 모두 런타임 시점에 보이는 결과는 같다.

Page 64: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

38 l 시작하세요! 아이폰 5 프로그래밍

현재 우리가 보고 있는 BIDViewController.xib 파일은 애플리케이션이 실행될 때 자동으로

로드된다(지금은 어떻게 자동 로드되는지 걱정하지 않아도 된다). 따라서 애플리케이션의 UI를

구성하는 객체를 추가하기에는 이 파일이 가장 적당하다. 인터페이스 빌더에서 객체를 생성하면

nib 파일이 로드될 때 프로그램에서 이들 객체의 인스턴스가 생성된다. 이와 관련한 예제는 앞으

로 이 책에서 수없이 보게 될 것이다.

Nib 파일에 포함된 내용

앞에서 언급한 것처럼 nib 파일의 내용은 편집 영역 바로 왼쪽에 있는 독에서 아이콘 또는 목록

형태로 표시된다(그림 2-15 참고). 모든 nib 파일은 처음에 File’s Owner와 First Responder라는

두 개의 아이콘으로 시작한다. 이들 두 항목은 자동으로 생성되며 삭제할 수 없다. 더불어 이들

항목은 nib 파일에 추가하는 객체와는 별도 구분선을 통해 시각적으로 분리돼 있다. 이를 통해

독자들도 이들 항목이 얼마만큼 중요한지 충분히 예상할 수 있을 것이다.

� File’s Owner는 디스크에서 nib 파일로 로드한 객체를 나타낸다. 다시 말해 File’s Owner

는 이 nib 파일의 복사본을 소유하는 객체다.

� First Responder는 기본 용어 정의상 사용자가 현재 상호작용 중인 객체를 나타낸다. 예

를 들어 현재 사용자가 텍스트 필드에 데이터를 입력 중이라면 이 텍스트 필드가 현 시

점의 퍼스트 리스폰더다. 퍼스트 리스폰더는 사용자가 UI를 사용함에 따라 바뀌며 First

Responder 아이콘을 활용하면 현재 퍼스트 리스폰더에 해당하는 컨트롤이나 뷰를 판단

하는 코드를 작성하지 않고 (어떤 객체가 됐든) 현재 퍼스트 리스폰더와 손쉽게 연동할

수 있다.

이들 객체에 대해서는 다음 장부터 좀 더 자세히 설명할 예정이므로 언제 퍼스트 리스폰더를

사용하고 또 nib 파일의 소유자를 구성하는 내용이 무엇인지 잘 이해되지 않더라도 걱정하지 않

아도 된다.

Page 65: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

02 티키 신 달래기 l 39

처음에 나온 이들 두 항목을 제외하고 이 창에 있는 나머지 아이콘들은 모두 nib 파일이 로드

될 때 alloc과 init 코드를 통해 새 오브젝티브-C 객체를 생성할 때와 똑같이 생성될 객체 인스턴

스를 나타낸다. 이 예제에서 현재 세 번째 아이콘은 View이다(그림 2-15 참고).

View 아이콘은 UIView 클래스의 인스턴스를 나타낸다. UIView 객체는 사용자가 보고 상호

작용할 수 있는 영역을 보여준다. 이 애플리케이션에서는 뷰가 하나뿐이므로, 이 아이콘은 애플

리케이션에서 사용자가 볼 수 있는 전체 내용을 나타낸다. 이 책에서는 나중에 여러 뷰로 구성된

복잡한 애플리케이션을 개발할 예정이지만, 일단 지금은 애플리케이션을 사용할 때 사용자가 보

는 내용이 이 뷰라고 생각하면 된다.

알아두기

엄밀히 말해서 이 애플리케이션에서 뷰는 한 개보다 많다. 화면에 표시할 수 있는 버튼, 텍스

트 필드, 라벨 같은 UI 요소들은 모두 UIView의 하위 클래스다. 하지만 이 책에서 뷰라는 용

어는 보통 실제 UIView의 인스턴스만을 나타내는 용도로 사용하며, 이 애플리케이션의 경우

이런 뷰는 단 한 개뿐이다.

View 아이콘을 클릭하면 (아직 보이지 않을 경우) 아이폰 크기의 화면 모양이 열린다. 바로 이

곳에서 그래픽적으로 UI를 디자인할 수 있다.

라이브러리

그림 2-16에서 볼 수 있듯이 워크스페이스의 오른쪽을 차지하는 유틸리티 뷰는 두 개의 영역으

로 나뉜다. 현재 유틸리티 뷰가 보이지 않는다면 툴 바의 세 가지 뷰 버튼 중 가장 오른쪽 버튼을

클릭하고 View Utilities Show Utilities를 선택하거나 0(옵션-커맨드-0)을 누르면 된다.

Page 66: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

40 l 시작하세요! 아이폰 5 프로그래밍

라이브러리

그림 2-16 ㅣ 라이브러리에서는 인터페이스 빌더에서 사용할 수 있는 UIKit 객체들을 찾을 수 있다. 라이브

러리 위와 툴바 아래 사이의 모든 영역을 합쳐서 인스펙터라고 부른다.

유틸리티 뷰의 하단 절반은 라이브러리 영역 또는 그냥 라이브러리라고 부른다. 라이브러리는

프로그램에서 사용할 수 있는 재사용 가능한 항목들을 모아놓은 곳이다. 라이브러리 상단의 바

에 있는 네 개의 아이콘은 라이브러리를 네 영역으로 나눠준다.

� 파일 템플릿 라이브러리: 이 영역에는 프로젝트에 새 파일을 추가할 때 사용할 수 있는 템

플릿들이 들어 있다. 예를 들어 프로젝트에 새 오브젝티브-C 클래스를 추가하려면 파일

템플릿 라이브러리에서 오브젝티브-C 클래스를 드래그하면 된다.

� 코드 조각 라이브러리: 이 영역에는 소스 코드 파일로 드래그할 수 있는 코드 조각들이

들어 있다. 예를 들어 오브젝티브-C의 빠른 열거형 구문이 기억 안 날 때는 라이브러리에

서 해당 코드 조각을 드래그하면 별도로 구문을 찾아보지 않아도 된다. 또 나중에 재사

용할 수 있는 코드를 작성한 경우 텍스트 편집기에서 코드를 선택하고 코드 조각 라이브

러리로 드래그하면 된다.

Page 67: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

02 티키 신 달래기 l 41

� 객체 라이브러리: 이 영역에는 텍스트 필드, 라벨, 슬라이더, 버튼 등 iOS 인터페이스를 디

자인하는 데 필요한 재사용 가능한 객체들이 들어 있다. 이 책에서는 객체 라이브러리를

폭넓게 활용해 예제 프로그램의 UI를 개발한다.

� 미디어 라이브러리: 이름에서 암시하듯 이 영역에는 사진, 사운드, 동영상 같은 미디어가

들어 있다.

알아두기

객체 라이브러리에 들어 있는 항목들은 앱의 UI를 개발할 때 사용하는 객체 프레임워크인

iOS UIKit의 내용이 대부분이다. UIKit은 코코아 터치에서 코코아의 앱킷(AppKit)과 같은 역

할을 한다. 두 프레임워크는 개념상 동일하지만 플랫폼이 다른 만큼 많은 차이점이 있다. 그에

반해 NSString과 NSArray 같은 파운데이션 프레임워크 클래스들은 코코아와 코코아 터치

모두 공통으로 사용한다.

라이브러리 하단의 검색 필드를 주의해서 보자. 예를 들어 버튼을 찾고 싶다면 이 검색 필드에

button을 입력하면 현재 라이브러리에서 이름에 button이 들어간 아이템만 보여준다. 검색이 끝

나면 검색 필드를 지우는 것을 잊지 말아야 한다.

뷰에 라벨 추가하기

이제 인터페이스 빌더를 사용해 보자. 라이브러리 상단에서 객체 라이브러리 아이콘(큐브 모양

아이콘)을 클릭해 객체 라이브러리를 띄운다. 그런 다음 Table View를 찾을 때까지 스크롤한다

(계속 스크롤하면 찾을 수 있다). 그런데 이 방법보다 더 간단한 방법이 있다. 그냥 Table View를

검색 필드에 검색어로 입력하면 된다. 독자들이 느끼기에도 이 방식이 훨씬 쉬울 것이다.

^3 단축키를 사용하면 검색 필드로 바로 이동하고 검색어가 하이라이트 표시된다.

이번에는 라이브러리에서 Label을 찾아보자. 라벨은 객체 라이브러리 상단 부근에 있다. 이어

서 라벨을 앞에서 본 뷰로 드래그한다(편집 영역에서 뷰가 보이지 않으면 인터페이스 빌더 독에

서 View 아이콘을 클릭한다). 뷰 위에 커서가 올라오면 커서가 파인더에서 익히 사용하는 녹색

Page 68: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

42 l 시작하세요! 아이폰 5 프로그래밍

의 더하기 표시(복사 표시)로 바뀐다. 라벨을 뷰 가운데로 드래그한다. 라벨을 가운데에 정렬할

때는 두 개의 파란색 안내선(하나는 수평, 하나는 수직)이 나타난다. 이 라벨을 꼭 가운데에 둘

필요는 없지만 이런 안내선이 제공된다는 사실은 알아두면 좋다. 그림 2-17은 앞에서 드래그한

라벨을 놓았을 때의 워크스페이스 화면을 보여준다.

그림 2-17 ㅣ 라이브러리에서 라벨을 찾아 뷰로 드래그한 모습. 객체 라이브러리의 검색 필드에서 label을

입력하면 label이 들어 있는 컨트롤만 라이브러리에 보이게 할 수 있다.

UI 항목들은 계층구조 형태로 보관된다. 물론 버튼과 그 외 여러 컨트롤처럼 하위 뷰를 포함

할 수 없는 뷰가 일부 있지만 대부분의 뷰는 하위 뷰를 포함할 수 있다. 인터페이스 빌더는 매우

똑똑하다. 객체가 하위 뷰를 받아들일 수 없는 경우 다른 객체를 이 객체 위로 드래그할 수 없다.

이 예제에서는 라벨을 메인 뷰(View라는 이름의 뷰)의 하위 뷰로 추가하고, 사용자에게 뷰가

보일 때 라벨이 자동으로 보이게 할 것이다. 라이브러리에서 Label을 드래그해 View라는 뷰에 내

려놓으면 UILabel의 인스턴스가 애플리케이션 메인 뷰의 하위 뷰로 추가된다.

이번에는 라벨을 수정해 내용을 바꿔보자. 방금 생성한 라벨을 더블클릭하고 Hello, World!

를 입력한다. 그런 다음 라벨 바깥을 클릭하고 라벨을 다시 선택해 라벨을 가운데 정렬하기 위해

드래그하거나 화면상의 원하는 위치로 옮긴다.

이제 저장하면 모든 작업이 끝난다. File Save를 선택하거나 S를 누른다. 그런 다음 엑스

코드 워크스페이스 창의 좌측 상단에 있는 팝업 메뉴를 클릭하고 iPhone Simulator를 선택한다

Page 69: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

02 티키 신 달래기 l 43

(이 팝업 메뉴에 버전 번호가 들어 있을 수도 있다. 이때는 가장 높은 버전을 선택하면 된다). 그

럼 앱이 시뮬레이터에서 실행될 것이다. 애플의 유료 iOS 개발자 프로그램에 이미 가입했다면 폰

에서도 앱을 실행할 수 있다. 시뮬레이터에서 앱을 실행할 때에는 유료 멤버십이 필요 없으므로

이 책에서는 가능한 한 시뮬레이터 테스트 방식을 고수한다.

실행할 준비가 됐다면 Product Run을 선택하거나 R을 누른다. 그럼 엑스코드에서 앱을

컴파일하고 그림 2-18처럼 아이폰 시뮬레이터에서 앱을 실행한다.

알아두기

빌드 및 실행 시점에 iOS 기기가 맥과 연결된 경우 애플리케이션 실행이 앞에서와 조금 다르

게 진행될 수 있다. 간단히 말해 애플리케이션을 빌드해 아이폰, 아이패드, 아이팟 터치에서

실행하려면 먼저 애플의 iOS 개발자 프로그램을 유료로 등록해야 하고 엑스코드를 적절히 설

정하는 과정을 모두 거쳐야 한다. 유료 개발자 프로그램에 등록하면 애플에서는 이 과정에 필

요한 정보를 개발자들에게 전송해준다. 하지만 개발자 등록 승인이 나기 전까지는 책의 대다

수 프로그램을 그냥 아이폰 시뮬레이터나 아이패드 시뮬레이터에서 실행해도 괜찮다.

그림 2-18 ㅣ 드디어 Hello World 프로그램을 아이폰 버전으로 완성했다!

첫 애플리케이션을 만들었다는 벅찬 감동이 어느 정도 진정되면 다시 엑스코드로 돌아온다.

Page 70: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

44 l 시작하세요! 아이폰 5 프로그래밍

에스코드와 시뮬레이터는 별도의 응용프로그램으로 돼 있다.

앱을 충분히 살펴봤다면 시뮬레이터를 종료해도 되지만, 이 장에서는 잠시 후 다시 시뮬레이

터를 시작할 것이므로 그대로 두는 게 좋다. 시뮬레이터가 실행되는 상태에서 엑스코드에서

애플리케이션을 재실행하면 엑스코드는 기존 앱을 먼저 중단할지 아니면 현재 시뮬레이터는

그대로 둔 채 새 시뮬레이터에서 앱을 실행할지 묻는다. 이런 질문이 헷갈린다면 앱을 테스트

할 때마다 매번 시뮬레이터를 종료해도 된다. 이렇게 하더라도 아무도 나무라는 사람은 없다.

잠시만! 이게 끝이라니? 아직 코드를 한 줄도 쓰지 않았는데.

그렇다. 이처럼 아이폰 개발은 무척이나 간단하다.

그런데 텍스트 크기나 색상 같은 라벨의 속성을 변경하고 싶다면 어떻게 해야 할까? 이때는 코

드를 써야 할까?

이 역시 대답은 '아니오'다. 이번에는 얼마나 쉽게 이런 속성을 수정할 수 있는지 살펴보자.

속성의 변경

엑스코드로 돌아와 Hello World 라벨을 한 번 클릭해 선택한다. 속성을 변경하려면 라이브러리

영역의 상단 부분을 살펴봐야 한다. 유틸리티 영역에서 이 부분은 인스펙터라고 부른다. 라이브

러리와 마찬가지로 인스펙터 영역의 상단에는 특정 데이터 타입을 볼 수 있게 인스펙터를 변경

하는 여러 아이콘이 있다. 라벨의 속성을 변경하려면 왼쪽에서 네 번째 아이콘을 사용해야 한다.

이 아이콘을 누르면 그림 2-19처럼 객체 어트리뷰트 인스펙터가 나타난다.

프로젝트 내비게이터와 마찬가지로 인스펙터도 각 아이콘에 대응되는 키보드 단축키를 갖고

있다. 인스펙터의 키보드 단축키는 가장 왼쪽 아이콘은 1, 그 다음 아이콘은 2 순으

로 진행된다. 프로젝트 내비게이터와 달리 인스펙터의 아이콘 개수는 현재 상황을 인식해 내

비게이터 및/또는 편집기에서 어떤 객체를 선택했는지에 따라 바뀐다.

Page 71: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

02 티키 신 달래기 l 45

인스펙터

그림 2-19 ㅣ 객체 어트리뷰트 인스펙터에서 라벨의 어트리뷰트를 보여주는 모습

이제 원하는 대로 라벨의 모양을 바꿔보자. 텍스트의 폰트, 크기, 색상을 마음대로 바꿔보자.

폰트 크기를 늘리면 커진 텍스트가 보일 수 있게 라벨의 크기도 늘려야 하므로 주의해야 한다.

텍스트 수정을 마쳤다면 파일을 저장하고 다시 한 번 Run을 선택한다. 그럼 이번에도 코드 한 줄

작성하지 않고 여러분이 수정한 내용이 애플리케이션에 그대로 보일 것이다.

Page 72: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

46 l 시작하세요! 아이폰 5 프로그래밍

알아두기

아직은 객체의 속성에 해당하는 각 필드의 의미를 모른다고 걱정하지 않아도 된다. 또 수정한

내용 중 일부가 보이지 않는다고 해서 조바심 낼 필요도 없다. 이 책을 계속해서 읽다 보면 어

트리뷰트 인스펙터는 물론 각 필드가 하는 일에 대해 자세히 배우게 될 것이다.

엑스코드는 그래픽적으로 인터페이스를 디자인할 수 있게 해줌으로써 개발자들이 UI를 구성

하는 코드를 작성하는 데 시간을 들이지 않고 애플리케이션에 꼭 필요한 코드를 작성하는 데만

집중할 수 있게 해준다.

대다수 현대 애플리케이션 개발 환경은 UI를 그래픽적으로 개발할 수 있는 도구를 제공한다.

엑스코드의 인터페이스 빌더와 이런 개발 도구들 사이의 주된 차이점은 인터페이스 빌더에서는

별도 관리해야 하는 코드를 전혀 생성하지 않는다는 점이다. 대신 인터페이스 빌더는 마치 실제

코드로 작성한 것처럼 오브젝티브-C 객체를 생성하고 이들 객체를 nib 파일로 직렬화함으로써

런타임 시에 객체가 메모리에 직접 로드되게 한다. 이 방식은 코드 자동 생성과 관련한 많은 문제

를 겪지 않게 해주고 전반적으로 더욱 강력한 개발 접근 방식이다.

아이폰 앱처럼 다듬기 - 화룡점정

이 장을 끝마치기 전에 마지막으로 진짜 아이폰 애플리케이션 같은 느낌이 나도록 애플리케이션

에 기름칠을 하고 광을 내보자. 먼저 프로젝트를 실행한다. 시뮬레이터 창이 나타나면 아이폰 시

뮬레이터의 홈 버튼을 클릭한다(홈 버튼은 시뮬레이터 창의 최하단에 있는 흰색 사각형이 들어

있는 검은색 버튼이다). 이렇게 홈 버튼을 누르면 그림 2-20에 보이는 아이폰 홈 화면으로 이동하

게 된다. 이 화면을 잠시 살펴보며 어색한 점을 찾아보자.

화면 상단에 있는 Hello World 아이콘을 보면 좀 밋밋하다는 생각이 들 것이다. 이 문제를 해

결하려면 아이콘을 생성하고 그래픽 파일(.png)로 저장해야 한다. 사실 이런 아이콘은 두 개 생

성해야 한다. 하나는 114×114 픽셀 크기로 생성해야 하고, 다른 하나는 57×57 픽셀 크기로 생성

해야 한다. 왜 두 아이콘이 필요할까? 그 이유는 아이폰 4에서 레티나 디스플레이를 도입했는데,

레티나 디스플레이는 이전 아이폰 모델보다 해상도가 정확히 두 배이기 때문이다. 따라서 두 아

이콘 중 작은 아이콘은 레티나 디스플레이가 없는 기기에서 사용하고, 큰 아이콘은 레티나 디스

플레이가 적용된 기기에서 사용한다.

Page 73: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

02 티키 신 달래기 l 47

아이콘을 디자인할 때는 아이폰에 이미 들어 있는 기존 버튼의 스타일에 꼭 맞추려고 하지 않

아도 된다. 아이폰은 자동으로 모서리를 둥글게 만들고 멋진 광택 효과를 아이콘에 부여해준다.

따라서 아이콘은 일반적인 사각형의 평평한 이미지 형태로 만들면 된다. 직접 아이콘을 만들고

싶지 않다면 프로젝트의 압축 파일(02 - Hello World 폴더 내에 들어 있다)에 들어 있는 icon.png

[email protected] 이미지를 사용하면 된다. 큰 아이콘 파일명에 들어 있는 @2x는 이 파일이 @2x

가 없는 같은 이름의 파일에 대한 레티나 버전임을 알려주기 위해 사용하는 특수 명명 관례다.

그림 2-20 ㅣ Hello, World 아이콘이 조금 밋밋하다. 좀 더 그럴듯한 아이콘이 필요하다!

알아두기

애플리케이션의 아이콘은 의무적으로 .png 파일을 사용해야 하지만, iOS 프로젝트에 추가하

는 다른 이미지 형식도 항상 .png 파일을 사용하는 게 좋다. 엑스코드는 빌드 시점에 자동으

로 .png 이미지를 최적화해주므로 .png 파일은 iOS 애플리케이션에서 가장 빠르고 효과적으

로 사용할 수 있는 이미지 형식이다.

물론 대부분의 일반 이미지 형식이 제대로 보이기는 하지만 다른 이미지 형식을 꼭 사용해야

하는 상황이 아니라면 .png 파일을 사용하는 게 좋다.

Page 74: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

48 l 시작하세요! 아이폰 5 프로그래밍

애플리케이션의 아이콘을 디자인한 후에는 1을 눌러 프로젝트 내비게이터를 열고 내비게이

터의 최상단 행(파란색 아이콘과 Hello World라는 이름의 행)을 클릭한다. 그런 다음 편집기 영

역을 살펴본다.

그럼 편집기 영역의 좌측에서 PROJECT와 TARGETS라는 라벨이 들어 있는 흰색 칼럼을 볼

수 있다. 여기서 Hello World 타깃이 선택돼 있는지 확인한다. 이 칼럼 오른쪽에서는 큰 회색

설정 영역을 볼 수 있다. 이 영역의 상단에는 다섯 개의 탭이 있다. Summary 탭을 선택한다. 그

런 다음 Summary 탭 내에서 스크롤을 내려 App Icons라는 라벨이 있는 영역을 찾는다(그림

2-21). 바로 이 위치에 새로 추가한 라벨을 드래그하면 된다.

Retina Display

App Icons

그림 2-21 ㅣ 프로젝트의 Summary 탭 내의 App Icon 상자. 이곳에서 애플리케이션의 아이콘을 설정한다.

파인더에서 icon.png를 왼쪽 사각형으로 드래그한다. 그럼 icon.png가 프로젝트에 복사되고

애플리케이션의 아이콘으로 설정된다. 이어서 파인더에서 [email protected]를 오른쪽 사각형으로

드래그해 애플리케이션의 레티나 디스플레이 아이콘으로 설정한다.

다시 프로젝트 내비게이터를 살펴보면 프로젝트에 두 개의 이미지가 추가됐지만 폴더에 들

어 있지 않은 것을 볼 수 있다(그림 2-22 참고). 프로젝트를 좀 더 정돈하기 위해 icon.png과

[email protected]를 선택하고 Supporting Files 그룹으로 드래그한다.

Page 75: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

02 티키 신 달래기 l 49

그림 2-22 ㅣ 아이콘이 프로젝트에 추가될 때는 하위 폴더로 들어가지 않는다. 프로젝트를 정돈하려면 직

접 하위 폴더로 아이콘을 옮겨야 한다.

이번에는 엑스코드에서 내부적으로 이런 아이콘을 어떻게 처리하는지 살펴보자. 엑스코드의

프로젝트 내비게이터에서 Supporting Files 폴더를 펼치고 Hello_World-Info.plist 파일을 한 번

클릭한다. 이 파일은 프로퍼티 리스트 파일로 프로젝트 아이콘 파일에 대한 세부 정보를 포함한

일반 정보를 담고 있다.

Hello_World-Info.plist를 선택하면 편집 영역에서 프로퍼티 리스트가 열린다. 프로퍼티 리스

트 내, 좌측 칼럼에서 Icon �les 라벨이 들어 있는 행을 찾는다. 그럼 같은 행의 오른쪽 칼럼에 (2

items)가 표시돼 있을 것이다. 이 행은 배열을 포함하고 있는데, 이런 배열은 여러 개의 값을 보관

할 수 있다. 이 배열에는 앞서 지정한 각 아이콘 별로 행이 하나씩 들어 있다. Icon Files 이름 옆에

있는 삼각형 펼침 아이콘을 한 번 클릭하면 그림 2-23과 같이 이 배열에 들어 있는 두 항목을 확

인할 수 있다.

Page 76: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

50 l 시작하세요! 아이폰 5 프로그래밍

그림 2-23 ㅣ 삼각형 펼침 아이콘을 열면 Icon Files 배열의 내용을 확인할 수 있다. 이 배열 내부에서는 두

아이콘 파일에 대한 행이 하나씩 들어 있는 것을 볼 수 있다.

그림 2-23에서 프로퍼티 리스트의 내용을 살펴보면 Icon Files (iOS 5)라는 또 다른 행도 볼 수

있다. 이 항목 옆에 있는 펼침 아이콘을 누르면 두 개의 이름 항목이 들어 있는 것을 볼 수 있다.

이 중 하나는 Primary Icon이고, 다른 하나는 Newsstand Icon으로 돼 있다. Primary Icon을 펼

치면 앞서 Icon Files 아래에서 본 내용과 같은 내용을 볼 수 있다. 이 부분에 대해서는 지나치게

신경 쓰지 않아도 된다. 이 책에서 앞서 한 대로 엑스코드를 사용해 아이콘을 설정하기만 하면

엑스코드가 항상 프로퍼티 리스트를 정확히 설정해준다.

이처럼 같은 아이콘 정보가 두 번 표시된 이유는 iOS 5이전에는 앱마다 한 개의 아이콘만 있었

으므로 아이콘에 대한 정보를 보관할 때 배열 하나(Icon Files)로도 충분했지만, iOS 5부터 애플

에서 애플의 뉴스가판대 앱 내에서 사용할 아이콘을 비롯해 애플리케이션에서 다른 아이콘 타

입을 지정할 수 있는 방법을 도입했기 때문이다. 이 책에서는 뉴스가판대는 다루지 않으므로 언

제, 왜 이런 아이콘을 지정해야 하는지에 대해서는 신경 쓰지 않아도 된다. 다만 iOS 5에서 새로

운 아이콘 지정 방식을 도입했고, 당분간은 앱에서 기존 방식과 새 방식을 모두 지원한다는 사실

만 알아두면 된다.

Page 77: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

02 티키 신 달래기 l 51

알아두기

이 예제에서는 두 개의 아이콘 이미지 파일을 엑스코드 프로젝트에 복사하기만 하고 아무 일

도 하지 않아도 아이콘이 화면에 실제로 보인다. 어떻게 이런 일이 생기는 것일까? 기본적으

로 아이콘 파일명을 지정하지 않으면 SDK에서는 icon.png라는 이름의 리소스를 찾아 이를

아이콘으로 사용한다. 더불어 이때 아이콘의 @2x 버전을 별도로 알려줄 필요도 없다. 레티나

디스플레이를 사용하는 기기에서는 iOS가 이런 아이콘을 자동으로 찾기 때문이다. 하지만 향

후 호환성을 위해서라도 안전하게 항상 애플리케이션의 아이콘을 info 프로퍼티 리스트에 지

정하는 게 좋다.

이번에는 Hello_World-Info.plist의 다른 행을 살펴보자. 다른 행의 설정은 대부분 지금 그대

로 둬도 되지만 한 행에 대해서는 좀 더 관심을 가져야 한다. 바로 Bundle identi�er(번들 식별자)

다. 번들 식별자는 앞서 프로젝트를 생성할 때 입력한 고유 식별자다. 이 값은 항상 설정해야 한

다. 번들 식별자의 표준 명명 관례는 com이나 org 같은 최상위 레벨의 인터넷 도메인 중 하나를

사용하고 이어서 점, 회사나 기관명, 점, 애플리케이션 이름을 차례로 사용하는 것이다.

이 프로젝트를 생성할 때는 번들 식별자를 입력하는 대화상자에서 com.apress를 입력했다.

번들 식별자 문자열의 마지막 값은 애플리케이션이 빌드될 때 애플리케이션의 이름으로 치환되

는 특수 코드다. 엑스코드는 이런 방식을 활용해 애플리케이션의 번들 코드를 애플리케이션의

이름과 연계한다. 프로젝트를 생성한 후에 애플리케이션의 고유 식별자를 변경해야 하는 경우에

는 이 번들 식별자 행에서 수정하면 된다.

이제 앱을 컴파일하고 실행해 보자. 시뮬레이터가 실행을 마치면 흰 사각형이 있는 버튼을 눌

러 홈으로 이동한 후 새로 적용한 멋진 아이콘을 확인한다. 이 예제에서 사용한 아이콘은 그림

2-24에 나와 있다.

Page 78: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

52 l 시작하세요! 아이폰 5 프로그래밍

그림 2-24 ㅣ 이제 애플리케이션이 멋진 아이콘을 갖췄다!

알아두기

아이폰 시뮬레이터의 홈 화면에서 기존 애플리케이션을 제거하려면 아이폰 시뮬레이터의 메

뉴에서 iPhone Simulator Reset Content and Settings…를 선택하면 된다.

Page 79: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

02 티키 신 달래기 l 53

정리하며...

자신의 어깨를 한 번씩 토닥여주자. 이 장에서 그다지 한 일이 많지 않아 보일 수도 있지만 실제

로는 꽤 많은 기초 지식을 배웠다. 이 장에서는 iOS 프로젝트 템플릿에 대해서 배웠고 애플리케

이션을 생성해 봤으며 인터페이스 빌더를 사용하는 법을 살펴보고 애플리케이션 아이콘과 번들

식별자를 설정하는 법도 배웠다.

하지만 Hello World 애플리케이션은 엄밀히 말해 단방향 애플리케이션이다. 사용자에게 정보

를 보여주긴 하지만 사용자로가 정보를 입력할 수는 없다. iOS 기기의 사용자로부터 입력을 받고

사용자의 입력에 따라 반응하게 하는 법을 배울 준비가 됐다면 다음 페이지로 넘어가자.

Page 80: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

Beg

inni

ng iO

S 5

Dev

elop

men

t

Page 81: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

55

03기본 상호작용 처리

Hello World 애플리케이션은 코코아 터치를 활용해 iOS 애플리케이션을 개발하는 법을 소개하

기에는 딱 좋은 예제였지만 핵심 기능 한 가지가 빠져 있다. 사용자와 상호작용할 수 있는 기능이

없는 것이다. 사용자와의 상호작용이 없으면 애플리케이션의 활용 범위가 크게 제한될 수밖에

없다.

이 장에서는 그림 3-1과 같이 라벨은 물론

두 개의 버튼도 들어 있는 조금 더 복잡한 애

플리케이션을 개발한다. 사용자가 두 버튼

중 하나를 탭하면 라벨의 텍스트가 바뀐다.

이 애플리케이션 예제도 마찬가지로 간단해

보이기는 하지만 이 예제에는 iOS 애플리케

이션에서 사용자와의 상호작용을 구현하는

데 필요한 핵심 개념들이 담겨 있다.

그림 3-1 ㅣ 이 장에서 개발할 간단한 두 버튼

애플리케이션

Page 82: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

56 l 시작하세요! 아이폰 5 프로그래밍

모델-뷰-컨트롤러 패러다임

내용에 들어가기 앞서 잠깐 이론을 살펴보자. 코코아 터치의 설계자들은 모델-뷰-컨트롤러

(MVC)라는 개념을 기반으로 코코아 터치를 설계했다. MVC는 GUI 기반의 애플리케이션을 구

성하는 코드를 서로 분리하는 매우 논리적인 설계다. 오늘날 거의 모든 객체 지향 프레임워크가

어느 정도는 MVC 패턴을 구현하고 있지만 코코아 터치만큼 MVC 모델을 충실히 따르는 프레임

워크는 거의 없다.

MVC 패턴은 기능을 세 개의 각기 다른 범주로 구분한다.

� 모델: 애플리케이션의 데이터를 보관하는 클래스

� 뷰: 창, 컨트롤, 기타 사용자가 볼 수 있고 상호작용할 수 있는 UI 요소로 구성

� 컨트롤러: 모델과 뷰를 묶어주는 코드. 사용자 입력을 어떻게 처리할지 결정하는 애플리

케이션 로직을 포함한다.

MVC 패턴의 목적은 이들 세 종류의 코드를 구현하는 객체들을 가능한 한 서로 떼어내는 것

이다. MVC 패턴에서는 객체가 세 범주 중 어느 곳에 속하는지 바로 식별할 수 있어야 하며, 객체

는 자신이 속한 범주 이외의 나머지 두 범주에 해당하는 기능을 거의 또는 전혀 갖지 않아야 한

다. 예를 들어 버튼을 구현하는 객체는 사용자가 버튼을 탭했을 때 데이터를 처리하는 코드를 포

함하지 않아야 하며, 은행 계좌를 구현한 객체는 은행 거래 내역을 보여주는 표를 그리는 로직을

포함하지 않아야 한다.

MVC를 활용하면 재사용성을 극대화하는 데 도움이 된다. 범용적인 버튼을 구현한 클래스는

모든 애플리케이션에서 그대로 사용할 수 있다. 하지만 버튼을 클릭했을 때 특정 연산을 수행하

는 클래스 구현체는 본래 이 클래스를 사용하려고 한 애플리케이션에서만 사용할 수 있다.

코코아 터치 애플리케이션을 개발할 때는 가끔씩 코드를 통해 인터페이스를 수정하기도 하고

기존 뷰나 컨트롤의 하위 클래스를 구현하기도 하지만, 주로 엑스코드 내의 시각 편집기인 인터

페이스 빌더를 활용해 뷰 컴포넌트를 생성한다.

모델은 애플리케이션의 데이터를 보관할 오브젝티브-C 클래스를 작성하거나 13장에서 배울

코어 데이터를 활용해 데이터 모델을 만드는 형태로 구현한다. 이 장의 애플리케이션에서는 별도

로 저장하거나 보관할 데이터가 없으므로 모델 객체는 만들지 않지만, 나중에 애플리케이션이

점차 복잡해지면 모델 객체에 대해서도 자세히 소개할 것이다.

Page 83: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

03 기본 상호작용 처리 l 57

컨트롤러 컴포넌트는 주로 애플리케이션에 맞춰 생성하는 클래스들로 구성된다. 컨트롤러는

완전한 커스텀 클래스(NSObject의 하위 클래스)로 만들 수도 있지만 보통은 잠시 후 보게 될

UIKit 프레임워크의 UIViewController 같은 기존 컨트롤러 클래스를 상속한 하위 클래스 형태

로 구현한다. 이처럼 기존 클래스를 상속하면 처음부터 복잡한 로직을 다시 만들지 않고 수많은

기능을 바로 쓸 수 있으므로 훨씬 편하다.

코코아 터치를 좀 더 배우다 보면 UIKit 프레임워크의 클래스들이 어떻게 연동해 MVC 원칙

을 따르는지 금세 이해할 수 있다. 개발을 진행하면서 머릿속에 이 원칙을 잘 기억해 두면 훨씬

더 깔끔하고 유지보수하기 쉬운 코드를 작성할 수 있다.

프로젝트의 생성

이제 엑스코드 프로젝트를 생성할 차례다. 이 장에서도 앞 장과 같은 템플릿을 활용해 프로젝트

를 생성한다. 즉 이번에도 Single View Application 템플릿을 활용한다. 이 템플릿을 기반으로

프로젝트를 한 번 더 생성하면 뷰와 컨트롤러 객체가 iOS 애플리케이션에서 어떻게 연동하는지

쉽게 이해할 수 있다. 나머지 템플릿들은 이후 장들에서 사용할 예정이다.

엑스코드를 실행하고 File New New Project...를 선택하거나 N을 누른다. Single

View Application 템플릿을 선택하고 Next를 클릭한다.

그럼 앞 장에서 본 것과 같은 옵션 시트가 보인다. Product Name 필드에 새 애플리케이션의

이름인 Button Fun을 입력한다. Company Identi�er 필드에는 앞 장에서 사용한 식별자가 그

대로 있을 테니 식별자는 그대로 둔다. Class Pre�x 필드에서도 앞 장에서 사용한 것과 같은 값

(BID)을 계속 사용한다.

Hello, World 프로젝트와 마찬가지로 이번에도 아이폰 애플리케이션을 개발하므로 Device

Family로는 iPhone을 선택한다. 여기서는 스토리보드나 단위 테스트를 사용하지 않으므

로 이들 옵션은 선택 해제한 채로 두면 된다. 하지만 ARC는 사용해야 하므로 Use Automatic

Reference Counting 체크박스는 선택한다. ARC에 대해서는 이 장에서 설명한다. 그림 3-2는 이

렇게 완성한 옵션 시트를 보여준다.

Page 84: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

58 l 시작하세요! 아이폰 5 프로그래밍

그림 3-2 ㅣ 프로젝트명 지정과 옵션 선택

Next를 누르면 프로젝트를 저장할 위치를 묻는 대화상자가 나타난다. 이때 Create local git

repository 체크박스는 선택 해제한 채로 두면 된다. 프로젝트는 나머지 책 프로젝트와 같은 경

로에 저장한다.

뷰 컨트롤러 살펴보기

이 장에서는 잠시 후 앞 장에서 한 것처럼 인터페이스 빌더를 활용해 애플리케이션에 대한 뷰(또

는 사용자 인터페이스)를 디자인할 것이다. 하지만 그 전에 자동으로 생성된 소스 코드 파일을

몇 개 살펴보고 내용을 수정해 보자. 그렇다. 드디어 이 장에서 최초로 코드 작성을 시작해 보는

것이다.

코드를 수정하기 전에 먼저 자동으로 생성된 파일들을 살펴보자. 프로젝트 내비게이터를 보면

Button Fun 그룹이 이미 펼쳐져 있을 것이다. 아직 Button Fun 그룹이 펼쳐져 있지 않다면 옆에

있는 펼침 삼각형을 클릭해 펼친다(그림 3-3 참고).

Page 85: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

03 기본 상호작용 처리 l 59

그림 3-3 ㅣ 프로젝트 템플릿에서 자동으로 생성해준 클래스 파일들을 보여주는 프로젝트 내비게이터.

클래스 파일명에 클래스 접두어가 자동으로 추가된 점에 주의하자.

Button Fun 폴더에는 네 개의 소스 코드 파일(.h나 .m으로 끝나는 파일)과 한 개의 nib 파일

이 들어 있을 것이다. 네 개의 소스 코드 파일은 애플리케이션에서 필요로 하는 두 개의 클래스

를 구현한다. 즉, 이들 파일은 애플리케이션 델리게이트와 애플리케이션의 유일한 뷰에 대한 뷰

컨트롤러를 구현한다. 이때 엑스코드에서 이들 클래스명 앞에 모두 접두어를 자동으로 추가한

것을 볼 수 있다.

애플리케이션 델리게이트는 이 장에서 잠시 후 살펴볼 것이다. 그 전에 먼저 자동으로 생성된

뷰 컨트롤러 클래스에 대해 살펴보자.

BIDViewController라는 컨트롤러 클래스는 애플리케이션의 뷰를 책임진다. 이 클래스명에

서 BID 부분은 우리가 지정한 클래스 접두어로 인해 자동으로 추가됐으며, ViewController 부

분은 이 클래스가 뷰 컨트롤러임을 보여준다. 프로젝트 내비게이터에서 BIDViewController.h

를 클릭하면 이 클래스의 헤더 파일 내용을 볼 수 있다.

#import <UIKit/UIKit.h>

@interface BIDViewController : UIViewController

@end

이 헤더 파일 안에는 별다른 내용이 없다. BIDViewController는 앞에서 언급한 범용 컨트롤

러 클래스 중 하나인 UIViewController의 하위 클래스다. UIViewController는 UIKit에 속하

며, 이 클래스를 상속하면 다양한 기능을 바로 사용할 수 있다. 엑스코드는 애플리케이션이 담

당할 구체적인 내용은 알지 못하지만 우리가 어떤 기본 기능을 필요로 하는지는 충분히 알고 있

으므로 애플리케이션과 관련한 구체적인 기능을 수행할 수 있게끔 이런 클래스를 자동으로 생

성해준다.

Page 86: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

60 l 시작하세요! 아이폰 5 프로그래밍

아웃렛과 액션의 이해

2장에서는 엑스코드의 인터페이스 빌더를 사용해 UI를 디자인했다. 또 방금 전에는 뷰 컨트롤

러 클래스의 셸을 살펴봤다. 둘을 종합적으로 생각해 보면 이런 뷰 컨트롤러 클래스가 nib 파일

과 상호작용할 수 있는 방법이 있을 거란 생각이 든다.

물론 당연히 인터페이스 빌더와 뷰 컨트롤러가 상호작용하는 방법이 있다! 컨트롤러 클래스는

아웃렛이라고 하는 특수한 속성을 사용해 nib 파일에 있는 객체를 참조할 수 있다. 아웃렛은 nib

파일 내에 있는 객체를 가리키는 포인터로 생각하면 된다. 예를 들어 (2장에서 한 것처럼) 인터페

이스 빌더에서 텍스트 라벨을 생성한 후 코드 내에서 라벨의 텍스트를 변경한다고 가정하자. 아

웃렛을 선언하고 이 아웃렛을 라벨 객체와 연결하면, 코드 내에서 아웃렛을 활용해 라벨에 보이

는 텍스트를 변경할 수 있다. 이를 어떻게 구현하는지는 이 장에서 잠시 후 보게 될 것이다.

반대로 nib 파일에 있는 인터페이스 객체들이 컨트롤러 클래스에 있는 특수 메서드를 호출하

게 설정할 수도 있다. 이런 특수 메서드는 액션 메서드(또는 그냥 액션)라고 부른다. 예를 들어 사

용자가 버튼을 탭하면 코드에 들어 있는 특수 액션 메서드를 실행하게끔 인터페이스 빌더에서

지정할 수 있다. 또 사용자가 버튼을 처음 터치할 때는 특정 액션 메서드를 호출하고, 버튼에서

손을 떼면 다른 액션 메서드를 호출하도록 인터페이스에서 설정할 수도 있다.

엑스코드 4 이전에는 뷰 컨트롤러의 헤더에서 아웃렛과 액션을 먼저 생성한 후 인터페이스 빌

더로 이동해 아웃렛과 액션을 연결해야 했다. 하지만 엑스코드 4의 어시스턴트 뷰는 아웃렛과

액션을 생성하고 바로 연결할 수 있게 해줌으로써 훨씬 더 빠르고 직관적으로 작업할 수 있게 도

와준다. 이 방법을 활용해 아웃렛과 액션을 연결하는 법은 잠시 후 살펴볼 것이다. 하지만 이런

연결 작업을 하기 전에 먼저 아웃렛과 액션에 대해 좀 더 자세히 알아보자. 아웃렛과 액션은 iOS

앱을 개발할 때 사용하는 가장 기본적인 두 요소이므로, 그 개념과 사용법을 잘 이해하는 게 중

요하다.

Page 87: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

03 기본 상호작용 처리 l 61

아웃렛

아웃렛은 IBOutlet이라는 키워드를 사용해 선언하는 특수 오브젝티브-C 속성이다. 아웃렛은

컨트롤러 클래스 헤더 파일에서 선언하며, 대략 다음과 같이 선언할 수 있다.

@property (nonatomic, retain) IBOutlet UIButton *myButton;

이 예제 코드는 myButton이라는 아웃렛으로, 이 아웃렛은 인터페이스 빌더에서 임의의 버튼

을 가리키도록 설정할 수 있다.

IBOutlet 키워드는 다음과 같이 정의돼 있다.

#ifndef IBOutlet

#define IBOutlet

#endif

이 부분이 잘 이해되지 않는다면 이것만 알아두자. IBOutlet은 컴파일러와 관련해서는 아무

일도 하지 않는다. 아웃렛의 목적은 아웃렛이 nib 파일에 있는 객체와 연결할 속성이라는 사실

을 인터페이스 빌더에게 알려주는 것뿐이다. nib 파일에 있는 객체와 연결해야 하는 속성 앞에서

는 항상 IBOutlet 키워드를 사용해야 한다. 다행히 지금은 엑스코드가 아웃렛을 자동으로 생성

해준다.

Page 88: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

62 l 시작하세요! 아이폰 5 프로그래밍

아웃렛의 변화

시간이 지나면서 애플이 아웃렛을 선언하고 사용하는 방식도 계속 변하고 있다. 어느 시점에는

과거 코드를 실행할 일도 생길 수 있으니 여기서는 그동안 아웃렛이 어떻게 변했는지 살펴보자.

이 책의 초판에서는 속성과 아웃렛에 사용하는 내부 인스턴스 변수를 모두 선언했다. 그 당

시 속성은 오브젝티브-C 언어에 새로 추가된 구조체였으며, 속성을 선언하려면 다음과 같

이 대응되는 인스턴스 변수도 함께 선언해야 했다.

@interface MyViewController : UIViewController{ UIButton *myButton;}@property (nonatomic, retain) UIButton *myButton;@end

그 당시에는 다음과 같이 IBOutlet 키워드를 인스턴스 변수 앞에 뒀다.

IBOutlet UIButton *myButton;

이런 표기 방식은 당시 애플의 예제 코드에 사용된 방식이었을 뿐 아니라 코코아와

NeXTSTEP에서는 전통적으로 IBOutlet 키워드를 이런 식으로 사용했다.

이 책의 두 번째 개정판을 쓸 즈음, 애플은 IBOutlet 키워드를 인스턴스 변수 앞에 두는 관행에

서 벗어나 다음과 같이 속성 선언 내에 IBOutlet 키워드를 배치하는 것을 표준으로 지정했다.

@property (nonatomic, retain) IBOutlet UIButton *myButton;

두 방식 모두 여전히 사용할 수 있었지만(지금도 사용할 수 있다), 우리는 애플의 권고를 따

라 인스턴스 변수 앞에 있던 IBOutlet 키워드를 속성 선언 위치로 옮기도록 예제 코드를

모두 수정했다.

최근 애플이 GCC에서 LLVM으로 기본 컴파일러를 바꿈에 따라 이제 속성에 인스턴스 변

수를 선언하는 일이 불필요해졌다. LLVM은 대응되는 인스턴스 변수가 없는 속성을 찾아

내면 인스턴스 변수를 자동으로 생성해준다. 이로 인해 이 책에서는 아웃렛에 대해 더 이상

인스턴스 변수를 선언하지 않는다.

이들 방식은 모두 같은 기능을 한다. 즉 인터페이스 빌더에게 아웃렛을 알려주는 일을 하는

것이다. IBOutlet 키워드를 속성 선언에 두는 방식은 애플이 현재 권장하는 방식이므로,

이 책에서도 이 방식을 사용한다. 다만 여기서는 과거 코드에서 IBOutlet 키워드를 인스턴

스에 사용한 적이 있다는 사실을 독자들이 알 수 있게 이런 부연 설명을 첨부했다.

오브젝티브-C 속성에 대한 내용은 마크 달림플과 스콧 내스터가 집필한 <Learn Objective-C

on the Mac(Apress, 2009)>과 애플의 개발자 웹사이트에서 제공하는 오브젝티브-C

프로그래밍 언어 소개(http://developer.apple.com/documentation/Cocoa/

Conceptual/ObjectiveC)를 참고하자.

Page 89: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

03 기본 상호작용 처리 l 63

액션

간단히 말해 액션은 IBAction이라는 특수 반환 타입을 사용해 선언한 메서드다. IBAction 키워

드를 사용하면 인터페이스 빌더는 이 메서드가 nib 파일의 컨트롤에서 호출할 수 있는 메서드라

는 사실을 알게 된다. 보통 액션 메서드는 다음과 같이 선언한다.

- (IBAction)doSomething:(id)sender;

또는 다음과 같이 선언하기도 한다.

- (IBAction)doSomething;

액션 메서드의 실제 이름은 원하는 대로 지정해도 되지만 액션 메서드는 항상 IBAction 타입

을 반환해야 한다. IBAction 타입은 void 반환 타입과 같은 타입이다. void 반환 타입은 액션 메

서드에서 값을 반환하지 않음을 알려줄 때 사용한다. 또 액션 메서드는 인자를 전혀 안 받거나

보통 sender라고 부르는 단일 인자를 받는다. 액션 메서드가 호출될 때 sender에는 액션 메서드

를 호출한 객체에 대한 포인터가 포함된다. 예를 들어 버튼을 탭했을 때 호출되는 액션 메서드의

경우 sender는 사용자가 탭한 버튼을 가리키게 된다. sender 인자는 액션 메서드를 한 개만 사용

해 여러 컨트롤에 반응할 때 유용하다. 이런 sender를 활용하면 액션 메서드를 호출한 컨트롤이

누구인지 알 수 있다.

실제로는 잘 사용하지 않지만 다음과 같이 IBAction을 선언하는 세 번째 방식도 있다.

- (IBAction)doSomething:(id)sender

forEvent:(UIEvent *)event;

컨트롤 이벤트에 대해서는 다음 장부터 다루기 시작한다.

액션 메서드를 선언할 때 sender 인자를 액션 메서드에 선언해 놓은 후 sender 인자를 무시하

더라도 손해볼 일은 없다. 실제로 이런 식으로 sender 인자를 선언만 해 놓고 쓰지 않는 예제 코

드를 앞으로 많이 볼 수 있을 것이다. 코코아와 NeXTSTEP에서는 액션 메서드를 선언할 때 사

용 여부와 상관없이 sender 인자를 받아야 했는데, 이런 관행을 따라 많은 iOS 코드(특히 예전

에 작성된 iOS 코드)가 이런 방식을 따르고 있다.

이제 액션과 아웃렛에 대해 이해했으니 인터페이스에서 이를 어떻게 활용할 수 있는지 살펴보

자. 하지만 그 작업을 하기 전에 조금 정리 정돈이 필요하다.

Page 90: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

64 l 시작하세요! 아이폰 5 프로그래밍

뷰 컨트롤러 정리하기

프로젝트 내비게이터에서 BIDViewController.m을 한 번 클릭해 구현체 파일을 연다. 그럼

프로젝트 템플릿에서 제공하는 반복 코드의 양이 꽤 많이 있음을 볼 수 있다. 이들 메서드는

UIViewController 하위 클래스에서 자주 사용하는 메서드이므로 엑스코드에서는 개발자가 코

드를 바로 추가할 수 있게 이들 메서드의 스텁 코드를 제공한다. 하지만 이 프로젝트에서는 이들

스텁 구현체 대부분이 불필요하므로, 이들 코드는 사실상 자리만 차지하고 코드를 읽는 데 방해

가 될 뿐이다. 따라서 여기서는 불필요한 코드를 먼저 삭제해 보겠다.

viewDidUnload를 제외한 모든 메서드를 삭제한다. 작업을 마치면 구현체 코드가 다음과 같

이 돼 있을 것이다.

#import "BIDViewController.h"

@implementation BIDViewController

- (void)viewDidUnload

{

[super viewDidUnload];

// 메인 뷰에서 갖고 있는 하위 뷰를 릴리스.

// e.g. self.myOutlet = nil;

}

@end

이제 코드가 한결 간단해졌다. 방금 지운 메서드들에 대해서는 걱정하지 않아도 된다. 이들 메

서드 대부분은 이 책의 내용을 진행하면서 그때그때 설명할 것이다.

앞에서 남겨둔 메서드는 아웃렛을 갖고 있는 모든 뷰 컨트롤러가 구현해야 하는 메서드다. 뷰

가 언로드되면(뷰 언로드는 시스템이 추가 메모리를 필요로 할 때 일어날 수 있다) 아웃렛을 nil

로 설정하는 게 중요하다. 이렇게 하지 않으면 아웃렛에서 사용하는 메모리가 반환되지 않는다.

다행히 우리가 할 일은 빈 구현체 코드를 그대로 두는 게 전부다. 이 장에서 잠시 후 보겠지만 우

리가 생성한 아웃렛 자원을 반환하는 일은 모두 엑스코드에서 자동으로 처리해준다.

UI 디자인

방금 수정한 내용을 저장했는지 확인하고 BIDViewController.xib을 한 번 클릭해 엑스코드의

인터페이스 빌더에서 애플리케이션 뷰를 연다(그림 3-4 참고). 앞 장의 내용을 통해 기억하겠지

만 편집 영역에 나오는 회색 창은 애플리케이션의 하나뿐인 뷰를 나타낸다. 그림 3-1을 다시 보면

이 뷰에는 두 개의 버튼과 라벨이 필요함을 알 수 있다.

Page 91: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

03 기본 상호작용 처리 l 65

잠시 이 애플리케이션에 대해 생각해 보자. 이 애플리케이션에는 두 개의 버튼과 한 개의 라벨

을 추가해야 하는데, 이런 UI를 추가하는 방식은 앞 장에서 한 것과 거의 동일하다. 더불어 이 애

플리케이션에는 애플리케이션이 사용자와 상호작용할 수 있게 아웃렛과 액션이 필요하다.

버튼 각각은 컨트롤러의 액션 메서드를 호출해야 한다. 물론 각 버튼이 서로 다른 액션 메서드

를 호출하게 할 수도 있지만, 여기서는 기본적으로 같은 일(라벨의 텍스트 업데이트)을 하는 만큼

같은 액션 메서드를 호출하게 한다. 다만 앞 절에서 설명한 sender 인자를 활용해 두 버튼을 서로

구분한다. 액션 메서드 외에 라벨의 텍스트를 바꿀 수 있게 라벨에 연결할 아웃렛도 필요하다.

그림 3-4 ㅣ 엑스코드의 인터페이스 빌더에서 편집 중인 BIDViewController.xib

이제 버튼부터 추가한 후 라벨을 추가해 보자. 이들 컨트롤에 사용할 액션과 아웃렛은 UI를

디자인하면서 같이 생성할 것이다. 물론 액션과 아웃렛을 직접 선언한 후 UI 항목을 액션과 아

웃렛으로 연결할 수도 있지만, 엑스코드에서 아웃렛과 액션 생성 작업을 대신해 주는 만큼 굳이

이렇게 추가로 작업할 필요는 없다.

Page 92: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

66 l 시작하세요! 아이폰 5 프로그래밍

버튼과 액션 메서드의 추가

먼저 UI에 버튼 두 개를 추가해야 한다. 그런 다음 엑스코드에서 빈 액션 메서드를 생성하게 한

후 두 버튼을 이 액션 메서드로 연결하면 된다. 이렇게 하면 사용자가 이들 버튼을 탭할 때 연결

한 액션 메서드가 호출된다. 이 액션 메서드 안에 작성한 코드는 사용자가 버튼을 탭하는 시점에

실행된다.

View Utilities Show Object Library를 선택하거나 ^3을 눌러 객체 라이브러리를 연

다. 객체 라이브러리의 검색 상자에 UIButton을 입력한다(사실 UIBu만 입력해도 검색 목록을

충분히 걸러낼 수 있다). 이렇게 입력하고 나면 객체 라이브러리에 Round Rect Button 버튼 하

나만 보일 것이다(그림 3-5 참고).

그림 3-5 ㅣ 객체 라이브러리에 표시된 Round Rect Button

라이브러리에서 Round Rect Button을 드래그해 회색 뷰에 올려놓는다. 이렇게 하면 애플리케

이션의 뷰에 버튼이 하나 추가된다. 뷰의 좌측 모서리로부터 적절한 간격을 유지하도록 파란색

안내선을 활용해 버튼을 뷰의 좌측에 정렬한다. 또 뷰의 중심을 안내해주는 파란색 안내선을 활

용해 버튼을 뷰의 세로 중심에 맞춘다. 그림 3-1을 가이드로 삼아 버튼 위치를 지정한다.

Page 93: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

03 기본 상호작용 처리 l 67

알아두기

객체를 인터페이스 빌더에서 옮길 때 나타나는 파란색 안내선은 애플의 휴먼 인터페이스 가

이드라인(보통 HIG라고 부른다)을 따르기 위한 것이다. 애플은 아이폰과 아이패드 애플리

케이션 디자인에 대한 휴먼 인터페이스 가이드라인을 제공한다. HIG에서는 사용자 인터페

이스를 어떻게 디자인해야 하는지 설명하고, 어떻게 디자인하지 말아야 하는지도 설명한다.

HIG에는 모든 iOS 개발자가 꼭 알아야 하는 중요한 정보가 들어 있으므로 꼭 읽어볼 것을 권

장한다. HIG 문서는 http://developer.apple.com/iphone/library/documentation/

UserExperience/Conceptual/MobileHIG/에서 확인할 수 있다.

새로 추가한 버튼을 더블클릭한다. 그럼 버튼의 제목을 편집할 수 있다. 버튼 제목을 Le�로 지

정한다.

이제 엑스코드 4의 마법 같은 기능을 활용할 시간이다. View Assistant Editor Show

Assistant Editor를 선택하거나 단축키를 눌러 어시스턴트 편집기를 연다. 또 프로젝트 창

의 우측 상단에 있는 7개의 버튼 중 좌측 버튼 그룹의 가운데 있는 편집기 버튼을 클릭하더라도

어시스턴트 편집기를 보여주거나 감출 수 있다(그림 3–6).

그림 3-6 ㅣ 어시스턴트 편집기 보여주기 토글 버튼

특별히 다른 방식으로 지정하지 않으면(Assistant Editor 메뉴에서 옵션을 확인) 어시스턴트

편집기는 편집 영역의 오른쪽에 나타난다. 이때 왼쪽 영역은 계속해서 인터페이스 빌더를 보여주

지만 오른쪽은 nib 파일을 ‘소유하는’ 뷰 컨트롤러의 헤더 파일인 BIDViewController.h를 보여

준다.

Page 94: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

68 l 시작하세요! 아이폰 5 프로그래밍

어시스턴트 편집기를 연 후에는 작업 공간을 충분히 확보하기 위해 창 크기를 조절해야 할 수

도 있다. 맥북 에어 같은 작은 화면에서 작업 중인 경우 유틸리티 뷰를 닫거나 프로젝트 내비

게이터를 닫으면 좀 더 효과적으로 어시스턴트 편집기를 활용할 수 있는 공간을 마련할 수 있

다. 프로젝트 창의 우측 상단에 있는 세 개의 뷰 버튼을 활용하면 이런 작업을 쉽게 할 수 있다

(그림 3-6 참고).

앞 장에서 File’s Owner 아이콘에 대해 설명한 내용을 기억할지 모르겠다. nib을 로드하는

객체가 바로 이런 소유자(owner)가 되며, 애플리케이션 뷰의 UI를 정의하는 nib의 경우 nib의

소유자는 nib과 대응되는 뷰 컨트롤러 클래스가 된다. 이 예제의 뷰 컨트롤러 클래스는 File’s

Owner이므로, 어시스턴트 편집기는 이런 정보를 기반으로 액션과 아웃렛을 연결할 위치로 가

장 적합한 뷰 컨트롤러 클래스의 헤더 파일을 보여준다.

앞에서 본 것처럼 BIDViewController.h에는 별 내용이 없다. 이 헤더는 그냥 빈 UIView

Controller 하위 클래스가 전부다. 하지만 잠시 후 이 하위 클래스에도 새로운 내용을 채울 것

이다.

이번에는 엑스코드에서 새 액션 메서드를 자동으로 생성하게 한 후 방금 생성한 버튼과 액션

을 서로 연결해 보자.

이를 위해서는 먼저 새 버튼을 클릭해 선택해야 한다. 그런 다음 키보드에서 컨트롤 키를 누른

채로 버튼을 클릭하고 어시스턴트 편집기의 소스 코드로 드래그한다. 그럼 버튼부터 커서로 이

어지는 파란색 선을 볼 수 있다(그림 3-7 참고). 이 파란색 선이 nib 안에 들어 있는 객체와 코드

또는 다른 객체를 서로 연결해주는 선이다.

이 파란색 선은 버튼을 연결할 아무 대상으로 드래그할 수 있다. 예를 들어 어시스턴트 편집기

의 헤더 파일이나, File’s Owner 아이콘, 편집 영역의 좌측에 있는 기타 아이콘, 또는 nib의

다른 객체로도 드래그할 수 있다.

Page 95: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

03 기본 상호작용 처리 l 69

그림 3-7 ㅣ 소스 코드로 컨트롤-드래그하면 아웃렛, 액션, 아웃렛 컬랙션을 생성할 수 있는 옵션이 나타난다.

커서를 @interface와 @end 키워드 사이로 옮기면(그림 3-7 참고) 회색 상자가 나타나 마우스

버튼에서 손을 떼면 아웃렛, 액션, 아웃렛 컬렉션을 삽입할 수 있음을 알려준다.

알아두기

여기서는 액션과 아웃렛은 사용하지만 아웃렛 컬렉션은 사용하지 않는다. 아웃렛 컬렉션은 객

체별로 별도 속성을 생성하는 대신 같은 종류의 여러 객체를 하나의 NSArray 속성으로 연결

할 수 있게 해준다.

이 연결을 마무리하기 위해 마우스 버튼에서 손을 떼면 그림 3-8에 보이는 것처럼 팝업이 나타

난다. 이 팝업에서는 원하는 행동을 커스터마이징할 수 있다. 팝업 창에서 Connection이라는 메

뉴를 클릭하고 선택 항목을 Outlet에서 Action으로 바꾼다. 이렇게 하면 엑스코드는 아웃렛 대

신 액션을 생성해준다.

Page 96: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

70 l 시작하세요! 아이폰 5 프로그래밍

그림 3-8 ㅣ 소스 코드로 컨트롤-드래그한 후 나타나는 팝업

그럼 팝업이 그림 3-9처럼 바뀔 것이다. 이 팝업의 Name 필드에 buttonPressed를 입력한다.

이렇게 입력한 후 엔터를 누르지 않도록 주의한다. 이때 엔터를 누르면 아웃렛이 최종 확정되는

데, 아직 아웃렛에 대해 해야 할 작업이 남아 있기 때문이다. 대신 탭을 누르면 Type 필드로 이동

할 수 있는데, 이 위치에서 UIButton을 입력해 기본값인 id를 대체한다.

알아두기

기억하는 독자도 있겠지만 id는 모든 오브젝티브-C 객체를 가리킬 수 있는 범용적인 포인터

다. 물론 id를 그대로 둔 채 작업해도 되지만 id를 이 메서드를 호출할 클래스로 바꾸면, 이 메

서드에 잘못된 객체 타입을 연결할 때 컴파일러가 경고를 내보낼 수 있다. 때로는 각기 다른

여러 컨트롤에서 같은 액션 메서드를 유연하게 호출해야 하는 경우도 있는데, 이때는 그냥 id

를 그대로 두면 된다. 여기서는 이 메서드를 버튼에서 호출할 생각이므로 엑스코드와 LLVM에

게 버튼에 대한 정보를 알려줬다. 이제 엑스코드에서는 의도치 않게 잘못된 객체를 연결하려

고 할 경우 우리에게 경고해줄 수 있다.

그림 3-9 ㅣ 연결 타입을 Action으로 바꾸면 팝업의 모양도 바뀐다.

Type 아래에는 두 개의 필드가 있는데, 여기서는 두 필드 모두 기본값을 그대로 사용한다.

Event 필드는 언제 메서드가 호출되는지 지정한다. 기본값은 Touch Up Inside로, 사용자가 화면

Page 97: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

03 기본 상호작용 처리 l 71

에서 버튼에 손가락이 닿은 상태에서 화면에서 손가락을 뗄 때 일어난다. 이 이벤트는 버튼에 사

용하는 표준 이벤트다. 이 이벤트는 사용자가 어떤 행동을 할지 한 번 더 생각할 수 있게 해준다.

사용자가 화면에서 손가락을 떼기 전에 손가락이 버튼 밖으로 나가면 이 이벤트가 일어나지 않

는다.

Arguments 필드는 액션 메서드에 사용할 수 있는 세 가지 메서드 시그너처 중 하나를 고를 수

있게 해준다. 이 예제에서는 메서드를 어떤 버튼이 호출했는지 알 수 있게 sender 인자가 필요하

다. sender 인자를 사용하는 메서드 시그너처는 기본값으로 지정돼 있으므로 여기서는 기본값

을 그대로 사용하면 된다.

이제 리턴 키를 누르거나 Connect 버튼을 클릭하면 엑스코드에서 액션 메서드를 자동으로 삽

입해줄 것이다. 이제 BIDViewController.h 파일의 내용도 다음과 같이 바뀌었다.

#import <UIKit/UIKit.h>

@interface BIDViewController : UIViewController

- (IBAction)buttonPressed:(id)sender;

@end

알아두기

애플에서는 우리가 사용하는 엑스코드와 코드 템플릿 모두를 조금씩 수정하고 있다. 이런 경

우에는 책의 단계별 설명을 조금 수정해야 한다. 이 예제의 경우 사실 buttonPressed 매개변

수 선언에 id가 아니라 UIButton 1 이 와야 맞다. 이런 문제는 차차 모두 수정될 예정이며 접근

방식 또한 조금씩 달라질 수 있다. 하지만 이런 문제는 심각한 문제는 아니다. 엑스코드처럼

거대한 개발 환경에서는 흔히 있을 수 있는 일이다.

1   (옮긴이) 현재 코드로 드래그(drag-to-code) 기능을 활용해 액션을 연결할 때는 Type을 UIButton 등으로 지정하더라

도 실제 코드에는 id 타입으로 선언된다. 이 문제는 저자들이 설명한 것처럼 향후 수정될 것으로 보인다.

이제 엑스코드에서 클래스 헤더 파일에 메서드 선언을 새로 추가해줬다. BIDViewController.

m를 한 번 클릭해 구현체 파일을 살펴보면 구현체에도 스텁 메서드가 추가된 것을 볼 수 있다.

- (IBAction)buttonPressed:(id)sender {

}

잠시 후에는 이 코드로 다시 돌아와 사용자가 각 버튼을 탭할 때 호출할 코드를 작성할 것이

Page 98: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

72 l 시작하세요! 아이폰 5 프로그래밍

다. 엑스코드는 메서드 선언과 구현체를 생성해줄 뿐 아니라 버튼을 이 액션 메서드로 연결하고

그 정보를 nib 파일에 보관하는 일도 마무리했다. 이 말은 애플리케이션이 실행될 때 버튼에서

이 액션 메서드를 호출하게 하기 위해 우리가 할 일이 아무것도 없다는 뜻이다.

BIDViewController.xib으로 돌아가 또 다른 버튼을 드래그한다. 이번에는 버튼을 화면 오른

쪽에 정렬한다. 버튼을 배치한 후에는 더블클릭하고 이름을 Right로 바꾼다. 버튼을 정렬할 때

는 앞에서 본 것처럼 파란색 안내선의 도움을 받아 버튼을 우측, 세로 중앙에 배치한다.

라이브러리에서 새 객체를 드래그하지 않고 옵션 키를 누른 채로 원본 객체(이 경우 Left 버

튼)을 드래그할 수도 있다. 옵션 키를 누르면 인터페이스 빌더는 드래그하는 객체의 복사본을

만든다.

이번에는 새 액션 메서드를 생성하지 않고, 앞서 엑스코드에서 생성해준 기존 액션 메서드에

버튼만 연결한다. 이때는 버튼을 어떻게 연결해야 할까? 이때도 첫 번째 버튼을 연결할 때와 방

식은 거의 같다.

버튼 이름을 바꾼 후 버튼을 컨트롤-클릭하고 헤더 파일로 다시 드래그한다. 이번에는

buttonPressed: 선언 가까이 커서가 오면 메서드가 강조되고 Connect Action이라는 회색 팝업

이 표시될 것이다(그림 3-10 참고). 이 팝업이 보이면 마우스 버튼에서 손을 뗀다. 그럼 엑스코드

는 이 버튼을 기존 액션 메서드와 연결해준다. 이렇게 연결하고 나면 사용자가 이 버튼을 탭할 때

앞의 버튼과 동일한 액션 메서드가 호출된다.

그림 3-10 ㅣ 기존 액션 메서드로 드래그하면 버튼을 기존 액션 메서드로 연결할 수 있다.

Page 99: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

03 기본 상호작용 처리 l 73

이 방식은 구현체 파일에 있는 메서드로 버튼을 컨트롤-드래그하더라도 그대로 동작한다. 다

시 말해 새로 만든 버튼을 BIDViewController.h에 있는 buttonPressed 선언으로 컨트롤-드래

그하든, BIDViewController.m에 있는 buttonPressed 메서드 구현체로 컨트롤-드래그하든 모

두 연결된다. 엑스코드 4는 이 정도로 똑똑하다!

라벨과 아웃렛의 추가

객체 라이브러리에서 검색 필드에 Label을 입력해 라벨 UI를 찾는다(그림 3-11 참고). Label을 앞

서 배치한 두 버튼 사이 적절한 위치로 드래그한다. 그런 다음 라벨의 크기 조정 핸들을 사용해

왼쪽 마진에서 오른쪽 마진까지 라벨을 늘린다. 그럼 사용자에게 보여줄 수 있는 충분한 라벨 공

간을 마련할 수 있을 것이다.

그림 3-11 ㅣ 객체 라이브러리에 보이는 라벨

기본적으로 라벨은 글자를 좌측 정렬하지만 이 예제에서는 가운데 글자를 가운데 정렬하려고

한다. View Utilities Show Attributes Inspector를 선택(또는 4 단축키를 누름)해 어트

리뷰트 인스펙터를 연다(그림 3-12 참고). 라벨을 선택됐는지 확인한 후 어트리뷰트 인스펙터에

서 Alignment 버튼을 찾는다. 라벨 텍스트를 가운데 정렬하도록 가운데 있는 Alignment 버튼

을 선택한다.

Page 100: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

74 l 시작하세요! 아이폰 5 프로그래밍

그림 3-12 ㅣ 라벨의 어트리뷰트 인스펙터

사용자가 버튼을 탭하기 전에는 라벨에 아무 내용도 보이지 않도록 (텍스트를 선택할 수 있게)

라벨을 더블클릭하고 키보드의 삭제 버튼을 누른다. 이렇게 하면 라벨에 현재 지정된 텍스트를

모두 지울 수 있다. 리턴 키를 눌러 수정한 내용을 반영한다. 이렇게 텍스트를 지우고 나면 선택

하지 않은 경우 라벨이 보이지 않지만, 라벨은 여전히 뷰에 있으니 걱정하지 않아도 된다.

빈 라벨처럼 보이지 않는 UI가 있는 상태에서 UI 위치를 확인하려면 Assistant Editor 메뉴

에서 Canvas를 선택하고, 이어서 나오는 팝업 하위 메뉴에서 Show Bounds Rectangles 옵

션을 켜면 된다.

Page 101: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

03 기본 상호작용 처리 l 75

이제 라벨에 사용할 아웃렛을 생성하는 일만 남았다. 라벨 아웃렛 생성은 앞에서 액션

을 생성하고 연결할 때와 같은 방식으로 진행하면 된다. 어시스턴트 편집기가 열려 있고

BIDViewController.h를 보여주는지 확인하자. 파일을 전환해야 한다면 어시스턴트 편집기 위

에 있는 팝업을 사용하면 된다.

다음으로 인터페이스 빌더에서 라벨을 선택하고 라벨을 헤더 파일로 컨트롤-드래그한다. 커서

가 기존 액션 메서드 바로 위로 올라올 때까지 계속 드래그한다. 그림 3-13 같은 화면이 보이면 마

우스 버튼에서 손을 뗀다. 그럼 (그림 3-8에서 본 것 같은) 팝업 창이 다시 나타난다.

그림 3-13 ㅣ 아웃렛을 생성하기 위해 컨트롤-드래그한다.

이번에는 아웃렛을 생성해야 하므로 Connection은 기본 타입인 Outlet으로 두면 된다. 또 아

웃렛을 생성할 때는 코드에서 사용할 때 기억하기 쉽도록 사용 목적을 잘 설명해주는 이름을 지

정해야 한다. Name 필드에 statusText를 입력한다. Type 필드는 UILabel로 설정한다. 마지막에

있는 Storage 필드는 그냥 기본값으로 두면 된다.

리턴 키를 눌러 수정한 내용을 반영하면, 엑스코드에서 코드에 아웃렛 속성을 삽입해줄 것이

다. 이제 컨트롤러 클래스의 헤더 파일이 다음과 같이 바뀌었다.

Page 102: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

76 l 시작하세요! 아이폰 5 프로그래밍

#import <UIKit/UIKit.h>

@interface BIDViewController : UIViewController

@property (strong, nonatomic) IBOutlet UILabel *statusText;

- (IBAction)buttonPressed:(id)sender;

@end

이제 아웃렛이 추가됐을 뿐 아니라 엑스코드에서 라벨과 아웃렛을 자동으로 연결해줬다. 이

말은 코드에서 statusText와 관련해 내용을 수정하면, 수정된 내용이 UI에 있는 라벨에 반영된

다는 뜻이다. 예를 들어 statusText의 text 속성을 설정하면 이 속성값이 라벨에 표시된다.

프로젝트 내비게이터에서 BIDViewController.m을 한 번 클릭해 컨트롤러의 구현체를 살펴

본다. 그럼 엑스코드가 속성을 생성하면서 속성 앞에 @synthesize 명령을 삽입한 것을 볼 수 있

다. 또 이 외에 엑스코드는 한 가지 일을 더 해줬다. 앞서 템플릿의 반복 메서드를 제거하면서 유

일하게 남겨둔 메서드를 기억할 것이다. 이제 이 메서드를 살펴보자.

- (void)viewDidUnload {

[self setStatusText:nil];

[super viewDidUnload];

// 메인 뷰에서 갖고 있는 하위 뷰를 릴리스

// e.g. self.myOutlet = nil;

}

그럼 super 호출 전에 코드 한 줄이 새로 추가된 것을 볼 수 있다. 물론 이 코드도 엑스코드가

자동으로 추가해준 것이다. 뷰가 언로드될 때는 모든 아웃렛을 릴리스해야 한다. 이렇게 하지 않

으면 메모리가 반환될 수 없다. 아웃렛에 nil 값을 대입하면, 아웃렛에서 기존에 갖고 있는 값이

메모리로부터 해제돼 자원을 반환할 수 있다.

이처럼 기본적으로 컨트롤-드래그를 통해 아웃렛을 생성하는 것만으로 아웃렛을 사용하는

데 필요한 모든 설정을 마무리할 수 있다.

Page 103: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

03 기본 상호작용 처리 l 77

자동 참조 카운팅

오브젝티브-C에 이미 익숙하거나, 이 책의 이전 버전을 읽어본 독자라면 예제 코드에서

dealloc 메서드가 없는 것을 눈치챘을 것이다. 그럼 속성을 릴리스하지 않는 것일까?

그렇지 않다. 이 부분에 대해서는 이제 걱정하지 않아도 된다. 이제 더 이상 객체를 릴리스

하지 않아도 된다. 사실 이 말은 완전히 정확한 표현은 아니다. 객체 릴리스는 여전히 필

요하지만, 다만 iOS 5부터 애플이 제공하는 LLVM 3.0 컴파일러는 매우 똑똑하므로 자

동 참조 카운팅(ARC)이라는 새 기능을 활용해 이런 지저분한 작업을 모두 처리해 객체를

대신 릴리스해준다. 이 말은 이제 더 이상 dealloc 메서드를 쓸 필요도 없으며 release나

autorelease를 호출하는 일을 걱정하지 않아도 된다는 뜻이다.

ARC는 코어 파운데이션 객체나 malloc() 등으로 할당한 객체에는 적용되지 않고 오브젝

티브-C 객체에만 적용되므로 이따금씩 주의할 사항이 있지만, 대부분의 경우 메모리 관리

에 대한 걱정은 이제 과거지사일 뿐이다.

ARC에 대한 상세 설명은 아래 URL에 있는 ARC 릴리스 노트를 참고하자.

https://developer.apple.com/library/ios/#releasenotes/ObjectiveC/

RN-TransitioningToARC/

ARC는 매우 멋진 기능이지만 마법은 아니다. 독자들은 ARC를 사용하다 생길 수 있는 문

제를 해결할 수 있게 여전히 기본적인 메모리 관리 규칙을 이해하고 있어야 한다. 오브젝티

브-C의 메모리 관리 규칙을 꺼내 보려면 다음 URL에서 애플의 Memory Management

Programming Guide를 참고하면 된다.

https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/

MemoryMgmt/

액션 메서드의 작성

지금까지 UI를 디자인하고 아웃렛과 액션 모두를 UI와 연결하는 일을 했다. 이제 남은 일은

사용자가 버튼을 누를 때 이들 액션과 아웃렛을 활용해 텍스트를 설정하는 것뿐이다. 아직

BIDViewController.m이 열려 있지 않다면 프로젝트 내비게이터에서 이 파일을 한 번 클릭해 편

집기에서 열어본다. 그런 다음 엑스코드에서 앞서 생성해준 빈 buttonPressed: 메서드를 찾는다.

두 버튼을 구분하려면 sender 매개변수를 사용해야 한다. 여기서는 sender를 통해 사용자가

누른 버튼의 제목을 가져오고, 이 제목을 기반으로 새 문자열을 생성한 후 이를 라벨의 텍스트

에 대입한다. 빈 메서드 아래에 다음 볼드체 코드를 추가한다.

Page 104: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

78 l 시작하세요! 아이폰 5 프로그래밍

- (IBAction)buttonPressed:(UIButton *)sender {

NSString *title = [sender titleForState:UIControlStateNormal];

statusText.text = [NSString stringWithFormat:@"%@ button pressed.", title];

}

이 코드는 매우 간단하다. 첫 번째 줄에서는 sender를 사용해 사용자가 탭한 버튼의 제

목을 가져온다. 버튼은 현재 상태에 따라 각기 다른 제목을 가질 수 있으므로 여기서는

UIControlStateNormal 매개변수를 사용해 버튼의 일반적인, 탭하지 않은 상태의 제목을 가져

온다. 보통 컨트롤(버튼도 컨트롤이다)의 제목을 가져올 때는 이 상태를 지정한다. 컨트롤의 상

태는 4장에서 좀 더 자세히 살펴본다.

다음 줄에서는 앞 줄에서 가져온 제목에 ‘button pressed.’ 텍스트를 덧붙여 새 문자열을 생성

한다. 이렇게 하면 제목이 Le�인 왼쪽 버튼을 탭하면 ‘Le� button pressed.’라는 문자열이 생성

된다. 새로 생성한 문자열은 라벨의 text 속성에 대입한다. 이렇게 하면 라벨이 보여주는 텍스트

를 변경할 수 있다.

메시지 중첩

어떤 개발자들은 오브젝티브-C의 메시지를 중첩해 사용한다. 독자들은 다음과 같은 코드

를 간혹 본 적이 있을 것이다.

statusText.text = [NSString stringWithFormat:@"%@ button pressed.",

[sender titleForState:UIControlStateNormal]];

이 코드 한 줄은 앞의 buttonPressed: 메서드 두 줄에서 하는 기능을 똑같이 한다. 오브젝

티브-C 메서드를 이처럼 중첩하면 중첩된 메서드 호출의 반환값을 생략해 메서드를 간략

히 표시할 수 있다.

이 책의 예제 코드에서는 코드를 명확히 하기 위해 alloc과 init을 호출하는 부분을 제외하

고 보통 이런 중첩 메시지를 사용하지 않는다. alloc과 init의 경우 메시지를 중첩해 사용하

는 방식은 오랜 관행이 됐으며, 이들 메서드는 거의 항상 메시지를 중첩해 사용한다.

테스트

이제 모든 작업이 끝났다. 이번에는 직접 앱을 테스트해 보자.

Product Run을 선택한다. 컴파일 에러나 연결 에러가 일어났다면 코드로 돌아가 이 장에

서 작성한 코드와 같은지 비교해 보자. 코드가 제대로 빌드되면 엑스코드에서 아이폰 시뮬레이

Page 105: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

03 기본 상호작용 처리 l 79

터를 구동해 애플리케이션을 실행해줄 것이다. 이 앱에서 오른쪽 버튼을 탭하면 ‘Right button

pressed.’ 텍스트가 표시될 것이다(그림 3-1). 또 왼쪽 버튼을 탭하면 ‘Le� button pressed.’ 텍스

트가 표시될 것이다.

애플리케이션 델리게이트 살펴보기

이제 애플리케이션이 잘 동작한다! 다음 주제로 넘어가기 전에 이 장에서 아직 살펴보지 않은 두

소스 코드 파일, 즉 BIDAppDelegate.h와 BIDAppDelegate.m에 대해 알아보자. 이들 파일은 애

플리케이션 델리게이트를 구현하는 파일이다.

코코아 터치는 델리게이트를 폭넓게 활용한다. 델리게이트는 다른 객체를 대신해 특정 작업을

수행하는 클래스를 말한다. 애플리케이션 델리게이트를 활용하면 UIApplication 클래스를 대

신해 특정 시점에 작업을 처리할 수 있다. 모든 아이폰 애플리케이션에는 UIApplication 인스턴

스가 단 하나뿐이며, 이 인스턴스는 애플리케이션의 실행 흐름을 책임지고 사용자 입력 등을 적

절한 컨트롤러 클래스로 전달하는 등의 애플리케이션 레벨 기능을 처리한다. UIApplication은

UIKit에 속하며 대부분의 작업을 내부적으로 수행하므로 보통은 UIApplication에 대해 따로

신경 쓰지 않아도 된다.

애플리케이션이 실행되는 동안 애플리케이션은 델리게이트가 존재하고, 델리게이트에

서 특정 메서드를 구현하는 경우 특정 시점에 델리게이트의 메서드를 호출한다. 예를 들

어 프로그램이 종료되기 전에 실행해야 할 코드가 있다면 애플리케이션 델리게이트에서

applicationWillTerminate: 메서드를 구현하고 애플리케이션 종료 코드를 이 메서드 내에 작성

하면 된다. 이와 같이 작업을 위임하는 방식을 통해 애플리케이션은 UIApplication의 하위 클래

스를 구현하지 않아도, 또 내부 로직을 모르더라도 애플리케이션 레벨에서 자주 사용하는 기능

을 구현할 수 있다.

프로젝트 내비게이터에서 BIDAppDelegate.h를 클릭하면 애플리케이션 델리게이트의 헤더

파일을 볼 수 있다. 이 파일의 내용은 대략 다음과 같다.

#import <UIKit/UIKit.h>

@class BIDViewController;

@interface BIDAppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

Page 106: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

80 l 시작하세요! 아이폰 5 프로그래밍

@property (strong, nonatomic) BIDViewController *viewController;

@end

이 파일에서 중요하게 살펴볼 코드는 바로 다음 코드다.

@interface BIDAppDelegate : UIResponder <UIApplicationDelegate>

이 코드에서는 꺽쇠 괄호 사이에 값이 들어 있는 것을 볼 수 있다. 이 값은 이 클래스가

UIApplicationDelegate라는 프로토콜을 따르고 있음을 나타낸다. 이제 옵션 키를 누르

면 커서가 십자 모양으로 바뀔 것이다. 이 커서를 UIApplicationDelegate 단어로 가져가 보

자. 그럼 커서가 브라우저의 링크를 표시할 때처럼 가운데 물음표가 있는 손 모양으로 바뀌고

UIApplicationDelegate 단어가 강조될 것이다(그림 3-14 참고).

그림 3-14 ㅣ 엑스코드에서 옵션 키를 누른 채로 코드의 심볼을 가리키면 심볼이 강조되고 커서가 물음표

가 들어 있는 손 모양으로 바뀐다.

옵션 키를 여전히 누른 채로 이 링크를 클릭한다. 그럼 그림 3-15처럼 UIApplicationDelegate

프로토콜에 대해 간단히 설명하는 작은 팝업창이 열린다.

그림 3-15 ㅣ 소스 코드에서 <UIApplicationDelegate>를 옵션 클릭하면 엑스코드는 프로토콜에 대한 설

명이 나와 있는 빠른 도움말 패널 팝업창을 열어준다.

Page 107: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

03 기본 상호작용 처리 l 81

이 팝업 문서창의 우측 상단 구석에서는 두 개의 아이콘을 볼 수 있다(그림 3-15 참고). 이 중

왼쪽 아이콘을 클릭하면 이 심볼에 대한 전체 문서를 볼 수 있고, 오른쪽 아이콘을 클릭하면 헤

더 파일에서 심볼의 정의를 볼 수 있다. 마찬가지로 편집기 영역에 나와 있는 클래스, 프로토콜,

카테고리 이름, 메서드 이름에도 같은 방식을 적용해 빠른 도움말을 열 수 있다. 아무 단어나 옵

션-클릭하면 엑스코드는 문서 브라우저에서 이 단어를 검색해준다.

이렇게 문서에서 내용을 빨리 찾는 것도 중요하지만 이 프로토콜의 정의를 살펴보는 게 더 중

요하다. 프로토콜 정의를 살펴보면 애플리케이션 델리게이트에서 구현할 수 있는 메서드의 내용

과, 이들 메서드가 언제 호출되는지 알 수 있다. 이들 메서드에 대한 설명은 충분히 시간을 들여

읽어볼 만한 가치가 있다.

알아두기

과거에 오브젝티브-C를 사용해봤지만 오브젝티브-C 2.0은 사용해본 적이 없다면 오브

젝티브-C 2.0에서는 프로토콜에서 선택 메서드를 지정할 수 있다는 사실을 알아두자.

UIApplicationDelegate에도 많은 선택 메서드가 있다. 하지만 애플리케이션 델리게이트에

서는 꼭 필요하지 않다면 이들 선택 메서드를 구현하지 않아도 된다.

다시 프로젝트 내비게이터로 돌아와 BIDAppDelegate.m을 클릭해 애플리케이션 델리게이트

의 구현체를 살펴본다. 그럼 내용이 다음과 같을 것이다.

#import "BIDAppDelegate.h"

#import "BIDViewController.h"

@implementation BIDAppDelegate

@synthesize window = _window;

@synthesize viewController = _viewController;

- (BOOL)application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

// 애플리케이션 구동 후 커스터마이징을 위해 오버라이드할 부분

self.viewController = [[BIDViewController alloc]

initWithNibName:@"BIDViewController" bundle:nil];

self.window.rootViewController = self.viewController;

[self.window makeKeyAndVisible];

return YES;

}

Page 108: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

82 l 시작하세요! 아이폰 5 프로그래밍

- (void)applicationWillResignActive:(UIApplication *)application

{

/*

애플리케이션이 활성 상태에서 비활성 상태로 막 이동하려고 할 때 호출된다. 이런 상태 전환은 일시적인 방해(예를 들어 전화 수신 또는 메시지 수신)에 의해 일어날 수도 있고 사용자가 애플 리케이션을 종료해 애플리케이션이 백그라운드 상태로 전환될 때 일어날 수도 있다.

이 메서드는 진행 중인 작업을 일시 정지하고, 타이머를 비활성화하며, 오픈지엘 ES 프레임 레이트 를 낮추는 용도 등에 사용하면 된다. 게임에서는 이 메서드를 사용해 게임을 일시정지해야 한다.

*/

}

- (void)applicationDidEnterBackground:(UIApplication *)application

{

/*

이 메서드는 공유 리소스를 반환하고, 사용자 데이터를 저장하며, 타이머를 무효화하고, 애플리 케이션이 나중에 종료될 경우에 대비해 현재 상태로 향후 애플리케이션이 복원될 수 있도록 충분 한 상태 데이터를 저장하는 데 사용한다.

애플리케이션이 백그라운드 실행을 지원할 경우 사용자가 애플리케이션을 종료하면 applicationWillTerminate: 대신 이 메서드가 호출된다.

*/

}

- (void)applicationWillEnterForeground:(UIApplication *)application

{

/*

백그라운드 상태에서 비활성 상태로의 전환 도중 호출된다. 이 메서드에서는 백그라운드에 진입 할 때 수정한 내용 중 대부분을 언두할 수 있다.

*/

}

- (void)applicationDidBecomeActive:(UIApplication *)application

{

/*

애플리케이션이 비활성화된 동안 일시정지한 작업(또는 아직 시작하지 않은 작업)을 재시작한다. 애플리케이션이 기존에 백그라운드에 있었다면 선택적으로 UI를 갱신할 수 있다.

*/

}

- (void)applicationWillTerminate:(UIApplication *)application

{

/*

애플리케이션이 막 종료되려고 할 때 호출된다.

필요하다면 데이터를 저장한다.

applicationDidEnterBackground: 메서드도 함께 참고한다.

*/

}

@end

Page 109: 시작하세요! 아이폰 5 프로그래밍 : iOS SDK를 이용한 아이폰 개발

03 기본 상호작용 처리 l 83

이 파일의 상단부에서는 애플리케이션 델리게이트가 문서에 나온 프로토콜 메서드 중 하나인

application:didFinishLaunchingWithOptions:를 구현하는 것을 볼 수 있다. 쉽게 예상할 수 있

듯 이 메서드는 애플리케이션이 모든 설정 작업을 마치고 사용자와의 상호작용을 시작하는 준비

를 마치는 순간 호출된다.

이 델리게이트 구현체의 application:didFinishLaunchingWithOptions:는 창을 생성한 후,

뷰를 포함하는 nib 파일을 로드해 컨트롤러 클래스의 인스턴스를 생성한다. 그런 다음 컨트롤러

의 뷰를 애플리케이션 창의 하위 뷰로 추가해, 뷰가 보이게 한다. 뷰는 이런 설계를 거쳐 사용자

눈 앞에 보이게 된다. 이 과정에서 여러분이 할 일은 아무것도 없다. 이런 작업은 프로젝트를 만

들 때 선택한 템플릿 코드에서 모두 담당해주기 때문이다. 다만 여기서는 어떤 일이 일어나는지

알 수 있게 간단히 내부 로직을 살펴봤다.

이로써 애플리케이션 델리게이트가 내부적으로 하는 작업을 간단히 살펴봤고 이 장을 마치기

전에 모든 내용이 서로 어떻게 연결되는지 확인해 봤다.

내용 정리

이 장에서는 간단한 애플리케이션을 통해 MVC 개념을 소개하고 아웃렛과 액션을 생성해 서로

연결했으며, 뷰 컨트롤러를 구현하고 애플리케이션 델리게이트도 활용해 봤다. 이 장에서는 버

튼을 탭할 때 액션 메서드를 실행하는 법을 배웠고 런타임 시에 라벨 텍스트를 변경하는 법도 살

펴봤다. 이 장의 예제는 간단하긴 하지만 이 장에서 소개한 기본 개념들은 버튼뿐 아니라 iOS에

서 제공하는 모든 컨트롤을 활용할 때 똑같이 적용된다. 실제로 이 장에서 버튼과 라벨을 사용

한 과정은 iOS의 대다수 표준 컨트롤을 구현하고 이들 컨트롤과 상호작용할 때도 거의 같은 형

태로 진행된다.

이 장의 내용은 모두 이해해야 하며 왜 이렇게 했는지 꼭 알아야 한다. 아직 이해되지 않는 부

분이 있다면 완전히 이해할 때까지 해당 부분을 반복 숙달하자. 이런 습관을 들이는 게 중요하

다. 만일 지금 이 장의 내용을 다 이해하지 못했다면 이 책에서 앞으로 보게 될 좀 더 복잡한 인터

페이스를 생성할 때는 그만큼 더 어려워질 것이기 때문이다.

다음 장에서는 표준 iOS 컨트롤에 속하는 다른 컨트롤을 몇 가지 살펴본다. 또 경고창을 활용

해 사용자에게 중요한 정보를 알려주는 법과 액션 시트를 활용해 작업을 진행하기 전에 사용자

가 항목을 선택할 수 있게 하는 법을 배운다. 다음 장을 배울 준비가 됐다면 스스로 좋은 학생임

을 인정한다는 의미로 자신의 어깨를 살짝 토닥여주고 다음 장으로 넘어가자.