오브젝티브-C가 스위프트를 만났을 때 (오브젝티브-C 유저에게 매우 유용한 전환 가이드)

오브젝티브-C가 스위프트를 만났을 때 (오브젝티브-C 유저에게 매우 유용한 전환 가이드)

$23.36
Description
오브젝티브-C를 써 왔던 스위프트 개발자들의 부담을 덜어주는 최적의 가이드
스위프트는 격변의 시기를 거쳐 어느새 강하고 튼튼한 언어로 자리매김했으며 빠른 속도로 오브젝티브-C를 밀어내고 있다. 초기에는 매번 동일한 주제의 오브젝티브-C 코드를 참고하고 이를 스위프트 코드로 변환하는 수작업을 거쳐야만 했지만, 이제는 원하는 내용을 구현하는 스위프트 코드를 쉽게 찾아볼 수 있을 정도다. 그럼에도 상당수의 오브젝티브-C 개발자들은 스위프트로 옮겨가는 시기를 고민하고 있다. 오브젝티브-C에 익숙한 사람들에게 스위프트를 충실히 안내하는 이 책은 그래서 절묘하다. 이미 상당한 기반 지식이 있는 이들에게 백과사전이나 바이블 식의 설명은 필요 없을 것이다. 핵심은 현재의 오브젝티브-C를 스위프트가 어떤 식으로 대체하고 있는가에 있기 때문이다. 이 책은 오브젝티브-C 유저들이 익숙하고 자연스럽게 스위프트 문법과 구조에 익숙해질 수 있는 최적의 구성을 갖췄다. 아울러 ‘꼼꼼한 재은 씨’ 시리즈의 저자 이재은 씨가 최근 업데이트 된 기능들을 감수 보완하여 믿음을 더했다.
저자

모리스켈리

저자모리스켈리는2001년대학을졸업하고소프트웨어엔지니어링에몸담아왔다.이동통신서버소프트웨어작업에여러해를보낸뒤,iOS개발자가되어사용자인터페이스분야에서책임자를맡았다.

목차

_감수자의말_오브젝티브-C유저들에게단비가될책
_머리말과기본소개

1장.스위프트프로젝트만들기
스위프트프로젝트시작하기
기본적인변화
_헤더파일이여,이젠안녕!
_메인함수가사라지다
_세미콜론?
스위프트와오브젝티브-C함께쓰기

2장.플레이그라운드와스위프트REPL
스위프트플레이그라운드
_플레이그라운드둘러보기
_플레이그라운드에서할수있는일
_플레이그라운드생성하기
스위프트REPL
_REPL사용법
_가능성
_한계

3장.언어기본사항
데이터타입
_기본타입
_문자열
_함수
_블록
_튜플
_클래스,구조체,열거형
_콜렉션
변수선언
_VAR와LET
_가변성
_타입추론
문법
_세미콜론
_@의행방
_대괄호의시대는갔다
_제어블록
_후기전처리기시대
_주석
연산자
_같은것
_다른것
_새로운것
튜플
_튜플생성과사용
_튜플재사용

4장.제어구조
전반적인변경사항
_소괄호는선택사항
_중괄호는필수
_부울조건부
반복문
_FOR-IN문
_WHILE문과REPEAT-WHILE문
조건문
_IF문
_GUARD문
_SWITCH문
정수,그너머의세계로!
_문자열
_열거형
_범위
_패턴일치
_안전성

5장.옵셔널
옵셔널이왜필요할까?
옵셔널선언
옵셔널사용하기
_추출
_옵셔널바인딩
_암시적추출
_옵셔널체이닝
몇가지조심할점
_NIL병합연산자
_추출이필요없는경우

6장.함수
함수호출
함수정의
_파라미터명명
_디폴트파라미터값
_반환값
_함수파라미터수정
_입출력파라미터
_가변개수파라미터
함수범위
_전역범위
_메소드범위
_중첩함수
함수사용
_함수타입
_함수를파라미터값으로사용
_함수를반환값으로사용

7장.블록과클로저
클로저정의
_정의생성
_블록을변수로할당
_함수파라미터로받기
_타입별칭생성
_클로저실행
클로저최적화
_암시적반환
_타입추론
_단축인자이름들
_후행클로저구문
_연산자함수
값캡처링

8장.문자열
문자열구성
문자열조작
_문자열값검토
_문자열비교
_문자열콘텐츠수정
NSString과상호작용하기
_부분문자열
_변환
_경로수정과URL메소드
_명시적NSString생성
유니코드

9장.클래스
클래스정의
메소드
속성
_저장속성
_읽기전용속성
_self키워드에대한고찰
이니셜라이저
_이니셜라이저생성
_편의이니셜라이저와지정이니셜라이저사용
_디이니셜라이징
상속
_메소드재정의
_상위클래스호출
접근제어
_Private
_fileprivate
_Internal
_Public
_Open
서브스크립트지정

10장.구조체와열거형
구조체
_구조체정의
_구조체수정
열거형
_열거형생성
_열거형사용
_관련값
_메소드와계산속성
중첩유형

11장.메모리관리
스위프트메모리관리
약한참조와미소유참조를사용하는경우
클로저

12장.콜렉션
전반적인비교
배열
_배열생성
_배열콘텐츠읽어오기
_배열조작
딕셔너리
_딕셔너리생성
_딕셔너리로부터읽어오기
딕셔너리조작
_객체추가및교체
객체삭제
가변성

13장.프로토콜,익스텐션,제네릭
프로토콜
_프로토콜생성
_프로토콜요구조건만족
익스텐션
제네릭
_제네릭함수
_제네릭타입

14장.서로가지지못한것들
오브젝티브-C에서만가능한기능
_KVO
_리플렉션
_다이나믹디스패치
스위프트에서새롭게선보이는기능
_네임스페이스
_사용자지정연산자
_FILTER,MAP,REDUCE

15장.오브젝티브-C와상호작용하기
오브젝티브-C에스위프트도입하기
_스위프트파일추가하기
오브젝티브-C에서스위프트코드이용하기
스위프트에서오브젝티브-C코드이용하기
_오브젝티브-C파일추가
_문법변화
_타입변화
프레임워크

출판사 서평

스위프트를가볍게시작하게하는책.
바이블이부담스러운당신을위한책.
각장설명글만읽어도반하게될책.

소프트웨어개발에서가장어려운일이바로첫번째고비를잘넘기는것입니다.프로그래밍초보자가오브젝티브-C나스위프트를배우는것은큰도전일수있습니다.새프로젝트나워크스페이스를만들때,갈피를잡을수없이정렬된많은템플릿옵션들을보면반감마저생깁니다.경험많은iOS나macOS개발자라해도,새로운아이디어를시도한다는것이쉽지만은않습니다.프로젝트타입을선택해야하고(가장까다로운부분이죠?),코드실행을위해서매일똑같은‘빌드-앤-런(Build&Run)’버튼을클릭해서다람쥐쳇바퀴돌듯프로그램을돌려봐야합니다.아이디어가괜찮은것같다할지라도,템플릿은제대로선택한것인지,아니면다시전단계로되돌아가서새프로젝트를만들고코드를복사해서다시붙여야할지고민할수도있겠죠.애플은스위프트에서두가지새로운도구를선보였습니다.하나는REPL로,특히스크립트언어에서쓰던오래된방식인데,상호작용적프로그래밍이가능한Read-Eval-Print-Loop라는이름의개발환경입니다.다른하나는스위프트플레이그라운드라는것으로,언어를배우거나코딩하는데혼란을최소화할수있는아주편리하고도독창적인개발환경입니다.

모든프로그래밍책이언어의기본개념부터시작하는것은다이유가있습니다.기초적인개념을이해하지못하면,프로그래밍언어를제대로이해할수없기때문입니다.클래스나콜렉션같은고급구조체개념에서헤맬수도있지만기본데이터타입,함수,연산자같은기본사항을제대로이해하지못한다면정말난항을겪게됩니다.그럼에도많은경력프로그래머들이처음한두단원정도는그냥넘겨버리고기본은차차하면서배우겠다고생각하죠.스위프트와오브젝티브-C는비슷하지만똑같지않습니다.데이터타입,함수,변수및상수선언방식등두언어사이에는중요하면서도커다란차이가있습니다.그래서이책에서기본개념이무엇보다중요하다고강조하고,또여러분이플레이그라운드를열어새로운기능을직접사용해보라고권하는것입니다.

데이터를다룰때완전히순차적으로작업하는것은어렵습니다.그래서모든프로그래밍언어에서는제어구조가필수입니다.외견상으로는스위프트의제어구조가오브젝티브-C의제어구조와같아보여도,좀더자세히들여다보면여러측면에서기존의기능보다월등하다는것을알수있습니다.

옵셔널은값을가질수도있고,가지지않을수도있기때문에일반적인변수나상수와는다릅니다.애플이스위프트의기능을처음소개했을때오브젝티브-C개발자들이가장어려워한기능이바로옵셔널입니다.왜일까요?몇가지이유가있습니다.*오브젝티브-C에이미옵셔널변수가있다는오해.*옵셔널변수가있기때문에논-옵셔널(non-optional)변수도있어야한다는생각.*nil키워드의아주미묘한재정의.*스위프트코드에는물음표가하도많아서배트맨에게온갖수수께끼를내며괴롭히는악당리들러가코딩하는중인가싶을정도입니다.어떤이유에서건,옵셔널은애플프레임워크의중요한일부이고절대로옵션이아닌필수기능입니다.

어떤프로그래밍언어를쓰든간에함수는꼭필요합니다.스위프트는오브젝티브-C보다함수의기능이훨씬개선되었습니다.독립적으로쓰일수도있고클래스에속한메소드나구성체또는열거형에도쓰일수있습니다.함수안에또다른함수(중첩함수)를생성할수있고,함수를파라미터로다른함수에전달할수있으며,반환값으로다른함수에서반환할수도있습니다.함수의기능이이렇게확대되다보니스위프트에서는함수도일급객체(firstclasscitizen)라할만합니다.

오브젝티브-C에서함수와메소드는성격이매우다릅니다.함수가전형적인C언어의성향을띤다면메소드는전적으로오브젝티브-C의성질을띱니다.함수와메소드는문법도다르고수행하는기능도달랐죠.하지만스위프트에서는이둘의차이가많이줄어들었습니다.이제메소드는객체타입에속하는함수라고할수있습니다.이책에서는함수가단독으로사용될때와객체타입에속해서사용될때모두특별한언급이없는한함수라는단어를사용합니다.스위프트에서는구조체와열거형의영향력이막강해졌으므로,클래스,구조체,열거형을‘객체’라는용어로통일합니다.인스턴스라는용어도클래스,구조체,열거형중하나를의미합니다.필요할경우에는객체타입을‘클래스객체’,‘구조체인스턴스’와같이구별하여사용합니다.

블록은iOS와macOS개발에서상대적으로새로운개념입니다애플이오브젝티브-C에서블록을제공하기는하지만사실상C언어에있던기능을개선한것입니다.하지만블록을구현하는문법은헷갈리고외우기도어렵고직관적이지도않습니다.블록코드유형을몇가지보여주는GoshDarnBlockSyntax(http://goshdarnblocksyntax.com)와같은사이트가만들어진것을봐도블록을사용하기가꽤어렵다는것을알수있습니다.그럼에도블록은프로그래밍의일부이며API곳곳에서사용되고있습니다.애플은블록구문을개선하고많은패턴에서사용하는구문을단순화하여기능을최적화하려고오랜기간노력했습니다.또블록의이름을좀더세련된이름인클로저(closure)로바꿨습니다.클로저라는이름은다른언어들에있는같은이름의기능들과좀더공통점이많기때문에블록을다루면서헷갈릴가능성이적어졌지요.

문자열(String)은어떤프로그래밍언어에서도핵심요소입니다.다른프로그래밍언어대부분이고유의문자열을만족스럽게발전시켜지원하고있는반면,의외로오브젝티브-C는애플의파운데이션라이브러리에의존해C언어의저급한문자열함수에서약간발전시킨기능들을제공하는수준에머무르고있습니다.스위프트의강력한고유문자열타입(이름까지편리하게도String이죠)은NSString과함께쓸수있도록설계되었습니다.NSString이AppKit과UIKit프레임워크에임베드될수있다는점을생각하면,NSString을사용할만한자리에String을쓸수있다는사실(그반대의경우도가능하죠)에어느정도안도감이듭니다.스위프트에서문자열은구조체로구현되고,기본적으로Character값의집합으로이루어집니다.Char의크기가1바이트인오브젝티브-C와달리스위프트의Character는유니코드문자이며,String타입이자체적으로유니코드를처리합니다.

스위프트는오브젝티브-C와마찬가지로객체지향프로그래밍언어입니다.스위프트의핵심객체인클래스에서는객체지향언어의특징인상속(inheritance),다형성(polymorphism),캡슐화(encapsulation)가모두제공됩니다.

“이봐요,클래스!이제객체타입이댁들의독무대가아닙니다.”스위프트에선구조체와열거형도함수를데이터와연결하는능력을갖추게되었거든요.구조체와열거형은단순한데이터타입에서복합적객체타입으로새롭게변신했고,그래서한편으로는명확하게구분되던둘사이의특징이꽤모호해진면도있습니다.

아마도지난몇년간오브젝티브-C개발자들이힘겨워한것이메모리관리일것입니다.초기메모리관리에는수동참조계수(manualreferencecounting)가쓰였습니다.객체참조를유지하고작업이끝났을때참조를해제하라는의도를사용자가밝혀야했습니다.한동안애플이OSX개발중에형편없는콜렉션에손을대긴했지만참조계수는iOS에서유일한메모리관리수단으로,OSX에서인기도좋았습니다.그러다오브젝티브-C에자동참조계수(ARC)가나타났습니다.기본프로세스는같지만언제어디서객체를유지하고해제할것이냐를정하는힘든작업을사용자가아닌컴파일러가주로수행합니다.

오브젝티브-C와스위프트의콜렉션기능을다짜고짜비교부터해보자고드는것은좋은생각이아닙니다.NSArray나NSDictionary와같은콜렉션은워낙잘알려져있고자주사용되어오브젝티브-C의대표적기능으로꼽지만,실제로는파운데이션프레임워크의일부이고언어대언어로직접적비교를할수있는대상은오로지C언어고유의배열뿐이니까요.하지만파운데이션콜렉션이iOS와macOS의개발에널리사용된다는점에서보면,콜렉션의사용법차원에서스위프트의콜렉션과비교해보는일은의미가있습니다.스위프트에는두가지콜렉션타입(배열과딕셔너리)이있는데,스위프트의문자열처럼이둘도변수보다는상수로선언함으로써불변으로만들수있습니다.스위프트의콜렉션은Foundation의콜렉션들과상응합니다.Dictionary는NSDictionary또는NSMutableDictionary와,Array는NSArray또는NSMutableArray와,Set은NSSet또는NSMutableSet과상응하죠.

프로토콜은오브젝티브-C개발자에게아주익숙한단어입니다.프로토콜은클래스가따를동작을정의(속성이나메소드의형태로)할목적으로애플의프레임워크에서제공하는개념입니다.현재클래스에추가적인기능을제공하기위해사용되는익스텐션은어쩌면새롭게느껴질지도모르지만,오브젝티브-C에서카테고리로서이미존재하는개념입니다.스위프트의프로토콜과익스텐션은클래스와더불어구조체와열거형에도사용될수있다는점에서오브젝티브-C와다릅니다.‘제네릭’은스위프트에서도입된완전히새로운기술입니다.제네릭의목적은함수나타입이컴파일시점에특정자료형으로지정되지않아도될수있도록하는것입니다.이렇게되면함수나타입을좀더넓은범위의타입으로쓸수있고,이는사실상포괄적(generic)인것이됩니다.스위프트의배열과딕셔너리는강력한타입화를위해제네릭에의존합니다.만약제네릭이없다면스위프트개발자들은생성할모든타입을예측하기위해서뿐만아니라가능한모든타입조합을처리하기위해변형배열타입과변형딕셔너리타입을생성해야합니다.

애플이아무리노력했다고해도,처음몇차례의버전에서스위프트가오브젝티브-C의모든특징들을결코완전히대체하지는못했을것입니다.반대로말하면,구문만새롭고오브젝티브-C의특징을단순히모방한것에그쳤다면,스위프트는결코진정한최신언어로비춰질수없었을것입니다.

macOS와iOS개발의미래는분명스위프트에달려있습니다.스위프트가질풍노도의시기를겪고있는새로운언어라는사실,그리고코코아개발이여전히오브젝티브-C와도밀접하게연관되어있다는사실을감안하면,상호운용이어느정도가능하다는보증없이스위프트로완전히옮겨와도괜찮다고개발자들에게확신을심어주는것은결코쉬운일이아닐것입니다.다행히도,두언어를통합하는정도는개별개발자나개발조직에알맞게조정될수있습니다.현재의오브젝티브-C프로젝트에스위프트의클래스를선별적으로도입하거나,스위프트기반의프레임워크를통째로포함시킬수도있습니다.시작은소규모로했다가도시간이지나서엄청난수의스위프트코드를도입하는것입니다.반대로말하면,새프로젝트를스위프트로시작하고싶은경우에도현재의오브젝티브-C코드를개별클래스나프레임워크(서드파티나여러분만의)의형태로가져와서함께사용하는등,많은선택지가있습니다.