Top

스위프트 데이터 구조와 알고리즘 [프로그래밍의 튼튼한 기초]

  • 원서명Swift Data Structure and Algorithms (ISBN 9781785884504)
  • 지은이에릭 아자르(Erik Azar), 마리오 에귈루즈 알레빅토(Mario Eguiluz Alebicto)
  • 옮긴이동준상
  • ISBN : 9791161750170
  • 30,000원
  • 2017년 06월 29일 펴냄
  • 페이퍼백 | 344쪽 | 188*235mm
  • 시리즈 : acorn+PACKT

책 소개

소스 코드 파일은 여기에서 내려 받으실 수 있습니다.

본문에 쓰인 컬러 이미지는 여기에서 내려 받으세요.

요약

데이터 구조와 알고리즘은 문제를 해결하기 위한 패턴이라 할 수 있으며, 이를 잘 활용하면 어려운 문제를 간단하면서도 세련되게 해결할 수 있다. 반면, 데이터 구조에 대한 명확한 이해가 없다면 현대 프로그래밍 언어의 특징이라 할 수 있는 다양한 데이터 타입의 장단점을 파악하기 어려우며, 어떤 상황에서 어떤 데이터 구조를 사용해야 할지 판단할 수 없고, 결국 프로그램의 성능 문제로 남게 된다.
이 책은 스위프트 표준 라이브러리에서 제공하는 코어 데이터의 구조와 알고리즘, 큐, 스택, 리스트, 해시 테이블 등 보편적으로 사용되는 데이터 구조와 알고리즘을 소개한다. 또한 다양한 정렬 알고리즘의 개요를 소개하고 각 알고리즘 성능의 장단점과 데이터 입력 크기에 따른 성능 차이를 비교 분석한다. 스위프트 언어를 통해 구현할 수 있는 다양한 트리 데이터 구조와 알고리즘, 고급 검색 기법을 설명하고, 알고리즘의 성능과 효율성을 한눈에 파악할 수 있는 그래프 구현 방법을 소개한다.
이 책의 목적은 데이터 구조와 알고리즘을 통해 모두들 해결이 어렵다고 말하는 문제에서 패턴 또는 실마리를 찾고, 이를 바탕으로 일상적인 개발 업무에서 즉각적으로 활용할 수 있는 다양한 해법 또는 응용 프로그램을 떠올리게 하는 것이다.

이 책에서 다루는 내용

■ 스위프트의 기본적인 데이터 구조에 대한 개념 정리
■ 스위프트 표준 라이브러리 컬렉션과 오브젝티브C 컬렉션의 브릿징 기법과 프로토콜 지향 프로그래밍
■ 스위프트 반복기와 시퀀스의 개념과 고급 데이터 구조에서의 활용 방법
■ 다양한 데이터 정렬 알고리즘의 구현 및 장단점 비교
■ 이진 트리, 이진 검색 트리, 스플레이 트리 구현 및 B-트리 등 고급 트리의 작동 원리 분석
■ 레드-블랙 트리, AVL, 트라이 트리 등을 활용한 고급 검색 메소드 구현
■ 깊이 우선 검색, 너비 우선 검색, 미니멈 스패닝 트리, 최단 경로 등의 그래프 알고리즘 구현

이 책의 대상 독자

스위프트 언어를 이용해 데이터 구조와 알고리즘을 구현하는 방법을 익히고자 하는 개발자를 위한 책이다. 컴퓨터 과학을 전공한 개발자는 물론, 스위프트에 대한 실무 경험 없이 스위프트에 대해 공부하고 있는 개발자도 큰 어려움 없이 최신 버전의 스위프트 언어로 고급 데이터 구조와 알고리즘 구현 방법을 익힐 수 있도록 구성했다.
이 책에 실린 대부분의 예제 코드는 모바일 환경은 물론, 서버 환경에서도 문제 없이 작동하도록 만들어졌다. 독자 여러분이 객체지향 프로그래밍에 대한 사전 지식과 경험이 있다면 전반적인 내용을 좀 더 쉽게 이해할 수 있겠지만, 객체지향 프로그래밍을 잘 모르는 독자라 하더라도 가장 기본이 되는 내용부터 설명하므로 큰 어려움 없이 기본 개념을 익히고 예제 코드를 실행해 볼 수 있으리라 생각한다.

이 책의 구성

1장, ‘플레이그라운드 살펴보기’에서는 데이터 구조와 알고리즘, 스위프트 REPL에 대한 개요를 소개하고, 커맨드라인 환경에서 스위프트 명령어를 입력하고 실행하는 방법에 대해 설명한다.
2장, ‘스위프트 기본 데이터 구조의 활용’에서는 클래스와 구조체, 배열, 딕셔너리, 세트 컬렉션 타입 구현을 위한 상세한 방법을 소개하고, 스위프트에서 오브젝티브C와 C 시스템 라이브러리를 활용하는 방법, 그리고 프로토콜 지향 프로그래밍 기법에 대해 설명한다.
3장, ‘스위프트 고급 데이터 구조의 활용’에서는 스위프트 프로토콜에의 부합 방법, 스택과 큐 구현 방법, 애플리케이션의 개발 요구 사항에 따른 올바른 타입의 선택 및 구현 방법에 대해 설명한다.
4장, ‘정렬 알고리즘 알고리즘의 개요와 정렬’에서는 알고리즘에 대해 소개하고, 배열 데이터 구조를 이용해서 정렬 알고리즘을 구현하는 방법에 대해 알아본다. 또한, 비교 정렬 기법 등 새로운 알고리즘을 소개하고, 단순 정렬 기법과 분리-정복 전략의 차이에 대해서도 설명한다.
5장, ‘나무를 통해 숲을 보기’에서는 트리 데이터 구조의 정의와 프로퍼티에 대해 소개하고, 이진 트리, 이진 검색 트리, B-트리, 그리고 스플레이 트리 등, 다양한 트리의 구현 방법에 대해 상세히 알아본다.
6장, ‘고급 검색 메소드’에서는 고급 트리 구조인 레드블랙 트리, AVL 트리, Trie 트리(Radix 트리)에 대해 소개하고, 서브스트링 검색 알고리즘 구현 방법에 대해서도 알아본다.
7장, ‘그래프 알고리즘’에서는 그래프 이론과 그래프를 위한 데이터 구조, 깊이 우선 검색, 너비 우선 검색, 스패닝 트리, 최단 경로, SwiftGraph에 대해 알아본다.
8장, ‘알고리즘의 성능과 효율성’에서는 알고리즘의 효율성의 개념을 소개하고 여러분이 만든 알고리즘의 효율성을 측정하는 방법과 Big-O 표기법, Big-O 함수의 순서, 실행 시간 복잡성의 개념에 대해 설명한다.
9장, ‘내게 꼭 맞는 알고리즘 선택하기’에서는 현실적인 복잡한 문제를 해결하기 위해 데이터 구조와 알고리즘을 설계하는 방법과 이를 스위프트 코드로 구현하는 방법에 대해 소개하고, 실제 상황에서 우리가 만든 알고리즘이 정상적으로 작동할 때 Big-O 표기법으로 복잡성을 측정하는 방법에 대해 알아본다. 마지막으로 병목 구간의 측정 및 감지, 성능 개선을 위한 코드 수정 기법에 대해서도 알아본다.

저자/역자 소개

지은이의 말

이 책은 실무 경험을 쌓은 개발자가 최신 버전의 스위프트를 활용할 수 있도록 돕는다. 스위프트는 애플이 만든 macOS, iOS, watchOS, tvOS, 리눅스 프로그래밍을 위한 언어이며, 스위프트를 이용해서 신속하고 안전하게 소프트웨어를 구현할 수 있다. 이 책에서 배운 내용을 바탕으로 애플리케이션을 좀 더 효율적으로, 좀 더 확장성 높게 만들 수 있다. 편안한 마음으로 이 책을 읽어나가길 바라며, 스위프트의 고급 기능에 대한 이해도 넓혀나가길 바란다. 무엇보다도 애플리케이션 코드 중 일부를 수정해서 극적인 성능 개선을 이뤄낼 수 있는 비법 또한 찾아내기 바란다.

지은이 소개

에릭 아자르(Erik Azar)

지난 20년간 스타트업부터 포춘 500대 기업에 이르는 다양한 기업을 위해 네트워크 엔지니어링, 시스템 관리, 보안, 기업 비즈니스 서비스 분야에서 확장성을 겸비한 고성능 데스크톱, 웹과 모바일 애플리케이션 설계 및 개발 업무를 담당해온 컴퓨터 과학자다. 애플이 아이폰을 공개했던 2007년, 처음으로 WWDC에 참가한 이후 다양한 macOS와 iOS 애플리케이션을 개발해 왔다.
플로리다 주 잭슨빌에 있는 Availity, LLC의 개발자이자 아키텍트로서, 헬스케어 산업을 위한 각종 소프트웨어 솔루션을 개발하고 있으며, 팩트출판사의 기술 감수자로서 『RESTful 자바 웹 서비스 보안』을 리뷰하다가 자신의 책을 쓰고 싶다는 염원을 갖게 됐고, 결국 첫 번째 책을 내게 됐다.
개발 업무에 빠져있지 않을 때는 아내 레베카, 세 아이들과 즐거운 시간을 보내며, 때로는 모터사이클을 타고 플로리다 해안을 달리기도 한다

마리오 에귈루즈 알레빅토(Mario Eguiluz Alebicto)

개발 업계에서 잔뼈가 굵은 10년 차 소프트웨어 엔지니어다. 자바 개발자로 입문했으나 아이폰의 세계를 접한 뒤 오브젝티브C 개발자가 됐으며, 현재는 스위프트 언어를 함께 사용한다. 소상공인과 지역 사업자를 위한 모바일 애플리케이션 개발 스타트업을 설립했으며, 2011년 이후 신생 스타트업부터 포춘 500대 기업에 이르기까지 다양한 클라이언트의 애플리케이션을 개발해 왔다. 현재는 모바일 애플리케이션을 개발하는 프리랜서이자, 저술가, 강사로 활동 중이다.
개발 외에도 여행을 좋아하고, 새로운 것을 배우거나 스포츠를 즐기며 하드코어 게이머로서 다양한 게임을 섭렵하고 있다.

옮긴이의 말

최근 10여 년 사이, 인공지능과 빅데이터, 소셜과 모바일 서비스의 폭발적인 성장과 함께 프로그래밍을 배워야 한다는 사회 분위기가 강하게 조성되고 있다. 웹 2.0 시대에 사는 우리 대부분은 어떤 면에서는 모두 프로그래머이자 코더라고 할 수 있지만, 국내외 정부와 교육기관은 프로그래밍 로직을 작성하는 일을 전문 직업으로 택할 수 있는 수준을 강조하고 있다. 만일 프로그래머가 되는 것에 대해 진지하게 고민한 적이 있다면, 그 첫 번째 단추를 어디서부터 꿸 것인가가 무척 중요할 것이다. 그리고 이미 프로그래머로 활동하고 있다면, 전문가로서의 깊이를 얻기 위해 많은 노력을 하고 있을 것이다.
쿡북을 펴 들고 웹 기반, 혹은 모바일 기반의 애플리케이션을 만들어서 배포해보는 것도 좋은 방법이고, 개발 환경을 설치한 뒤 해당 플랫폼의 예제 코드를 실행해보거나 오픈소스 라이브러리를 다운로드 받아서 개발 문서의 스터디를 시작하는 것도 좋은 접근 방식이지만, 이런 과정을 거칠수록 프로그래밍에 대한 근원적인 궁금증이 커지기 마련이다. 오픈소스 시대에 사는 우리 대부분은 표면에 있는 모듈과 API를 가지고 프로그래밍 혹은 코딩을 시작하지만 시간이 지날수록 그 아래 감춰져 있는 요소를 발굴하고 차츰 더 아래에 있는 프로그래밍의 기단부 혹은 코어를 향해 내려가게 되는 것이다.
이 책에서 다루고 있는 데이터 구조와 알고리즘이 바로 여러분이 찾던 프로그래밍의 기단부이자 코어라고 할 수 있다. 모든 프로그램은 데이터 구조 혹은 알고리즘이라는 소박한 토대 위에 쌓아 올려진 건축물이라 할 수 있으며, 오픈소스 커뮤니티의 아버지라 할 수 있는 에릭 레이먼드(Eric S. Raymond)의 일갈처럼 우수한 데이터 구조는 곧 우수한 프로그램을 판단하는 척도라 할 수 있다.
현대 프로그래밍 언어 대부분은 서로의 장단점을 관찰하고 비교 분석해서 다양한 기능을 담은 모듈과 라이브러리를 지속적으로 배포 및 업데이트한다. 스위프트는 여러 언어 가운데서도 지난 3년 사이 가장 큰 변화를 만들고, 많은 주목을 받아온 프로그래밍 언어라 할 수 있다. 무려 30년간 애플이라는 플랫폼의 기본 언어였던 오브젝티브C를 대체할 목적으로 만들어진 스위프트는 클로저, 제너릭, 타입 추측, 다중 반환 타입, 네임스페이스 등 최신 프로그래밍 속성을 반영했으며, 문법의 간결성과 활용 가능성 측면에서 데이터 구조와 알고리즘을 익힐 수 있는 훌륭한 언어다.
프로그래밍 전문가에게도 데이터 구조와 알고리즘은 부담스러운 주제일 수 밖에 없다. 그 속에는 어쩔 수 없이 프로그래밍에 대한 근원적이면서도 낯선 물음이 포함돼 있기 때문이다. 하지만 약간의 어색함을 참을 용기만 있다면, 예제 코드를 확인해볼 수 있는 시간 여유만 있다면, 이 책에 포함된 내용 대부분을 편안하게 넘겨볼 수 있을 것이다. 대부분의 예제 코드는 그리 길지 않으며, 신속하게 알고리즘의 개요를 파악하고 활용 방안에 대해 생각할 수 있도록 돕는다.
iOS, macOS 애플리케이션을 만들고자 하는 개발자, 이미 다수의 애플리케이션을 배포했지만 프로그래밍에 대한 근원적인 궁금증을 품고 있는 개발자, 그리고 이미 완성된 알고리즘의 성능을 혁신적으로 개선할 방법을 찾고 있는 시스템 개발자에게 데이터 구조와 알고리즘 측면에서의 이해를 돕고 그 해법을 제시한다.

동준상

옮긴이 소개

동준상

넥스트플랫폼 대표이자 ICT 컨설턴트로 서비스 기획, UX 표준화 프로젝트에 참여해왔으며, AWS 테크놀로지 파트너로 클라우드 기반 서비스와 데이터 분석 애플리케이션을 개발한다. 삼성전자, 한국생산성본부, KT, 신한은행, 국민은행, 신세계 등에서 현대 ICT 서비스 기획론, UX 리서치 전략, SPRINT 방법론을 강의하고, 관련 교재를 집필했다. 한국콘텐츠진흥원, 한국생산성본부, 대구디지털산업진흥원, 부산정보진흥원의 기술 심사위원 및 멘토로 활동 중이다.
번역서로는 에이콘출판사에서 펴낸 『jQuery UI 1.8 한국어판』(2012), 『The iOS 5 Developer’s Cookbook (Third Edition) 한국어판』(2012), 『The Core iOS 6 Developer’s Cookbook (Fourth Edition) 한국어판』(2013), 『The Advanced iOS 6 Developer’s Cookbook (Fourth Edition) 한국어판』(2013), 『The Book of CSS3』(2014), 『Swift로 하는 iOS 프로그래밍』(2015), 『머신 러닝 인 자바』(2016) 등이 있다.

목차

목차
  • 1장. 플레이그라운드 살펴보기
    • 데이터 구조의 중요성
      • 데이터 구조 + 알고리즘 = 프로그램
      • 상호작용성 높은 플레이그라운드
      • 스위프트 REPL
    • 기본적인 데이터 구조
      • 인접 데이터 구조
        • 배열
        • 배열 선언
        • 배열 요소 가져오기
        • 배열 요소 추가
        • 배열 요소 삭제
      • 연결 데이터 구조
        • 단일 연결 리스트
    • 데이터 구조의 종류와 장단점
      • 알고리즘 개요
    • 스위프트에서의 데이터 타입
      • 밸류 타입과 레퍼런스 타입
      • 기명 타입과 복합 타입
      • 타입 알리아스
      • 스위프트 표준 라이브러리의 컬렉션 타입
    • 점근적 분석
      • 데이터 크기 분석 방법 - 성장의 순서
    • 정리

  • 2장. 스위프트 기본 데이터 구조의 활용
    • 스위프트 표준 라이브러리의 활용
      • 애플이 구조체를 사용하는 이유
      • 스위프트에서 배열 선언
        • 배열 초기화
        • 배열에 요소 추가 및 업데이트
        • 배열에서 요소 가져오기 및 삭제
      • 딕셔너리 가져오기 및 초기화하기
        • 딕셔너리 초기화하기
        • 키/값 쌍 추가, 변경, 삭제
        • 딕셔너리에서 값 가져오기
      • 세트 선언
        • 세트 초기화
        • 세트 요소 변경 및 가져오기
        • 세트 연산자
      • 튜플의 특징
        • 무기명 튜플
        • 기명 튜플
    • 서브스크립팅 구현
      • 서브스크립트 문법
      • 서브스크립트 옵션
    • 수정 가능 속성과 수정 불가 속성의 이해
      • 컬렉션의 수정가능 속성
    • 스위프트와 오브젝티브C의 상호관련성
      • 초기화 방식
      • 스위프트 타입의 호환성
      • 컬렉션 클래스 브릿징
        • NSArray를 Array로 브릿징
        • NSSet을 set로 브릿징
        • NSDictionary를 dictionary로 브릿징하기
    • 스위프트 프로토콜 지향 프로그래밍
      • 명령 전달을 위한 디스패치 기법
      • 프로토콜 작성 문법
      • 타입으로서의 프로토콜
      • 프로토콜 익스텐션
      • 컬렉션에서 활용하기 위한 프로토콜의 검증
        • Array 리터럴 문법
        • 열거형 배열 만들기
    • 정리

  • 3장. 스위프트 고급 데이터 구조의 활용
    • 반복기, 시퀀스, 컬렉션
      • 반복기
        • 시퀀스
      • 컬렉션
    • 스택
      • 애플리케이션 개요
      • 구현 방법
      • 프로토콜
      • 애플리케이션 개요
      • 구현 방법
      • 프로토콜
    • 순환 버퍼
      • 애플리케이션 개요
      • 구현 방법
      • 프로토콜
    • 우선순위 큐
      • 애플리케이션 개요
      • 구현 방법
      • 프로토콜
    • 스택 리스트
      • 애플리케이션 개요
      • 구현 방법
      • 프로토콜
    • 정리

  • 4장. 정렬 알고리즘
    • 삽입 정렬 알고리즘
      • 알고리즘 개요
      • 삽입 정렬 알고리즘 분석
      • 삽입 정렬 알고리즘 활용 사례
      • 최적화
    • 병합 정렬 알고리즘
      • 배열 기반 병합 정렬 알고리즘
      • 병합 정렬 알고리즘 분석
      • 연결 목록 기반 병합 정렬 알고리즘 분석
      • 알고리즘 성능 비교
    • 신속 정렬 알고리즘
      • 로무토의 신속 정렬 알고리즘
      • 로무토의 파티션 스킴 분석
      • 호어의 신속 정렬 알고리즘
      • 호어의 파티션 스킴 분석
        • 피봇 선택 방식
      • 신속 정렬 알고리즘을 위한 개선된 피봇 선택 방식
      • 최적화
    • 정리

  • 5장. 나무를 통해 숲을 보기
    • 트리: 정의와 주요 속성
    • 다양한 트리의 종류와 개요
      • 이진 트리
      • 이진 검색 트리
      • B 트리
      • 스플레이 트리
      • 레드블랙 트리
    • 이진 트리
      • 타입과 종류
      • 코드
    • 이진 검색 트리
      • 노드 삽입
      • 트리 워크(순회 방식)
        • 인오더 트리 워크
        • 프리오더 트리 워크
        • 포스트오더 트리 워크
      • 검색
      • 삭제
    • B 트리
    • 스플레이 트리
      • 스플레이 작업
        • 지그 회전
        • 지그지그 또는 재그재그 회전
        • 지그재그 회전
    • 정리

  • 6장. 고급 검색 메소드
    • 레드블랙 트리
      • 레드블랙 트리 노드의 구현
      • 회전
        • 우측 회전
        • 좌측 회전
      • 삽입
    • AVL 트리
      • AVL 트리 노드의 구현
      • AVL 트리 회전
        • 좌측 단순 회전
        • 단순 우측 회전
        • 우-좌 이중 회전
        • 좌-우 이중 회전
    • 검색
      • 삽입
    • Trie 트리
    • Radix 트리
    • 다양한 서브스트링 검색 알고리즘
      • 서브스트링 검색 알고리즘 사례
        • 나이브(브루트 포스) 알고리즘
        • Rabin-Karp 알고리즘
    • 정리

  • 7장. 그래프 알고리즘
    • 그래프 이론
      • 보편적으로 활용되는 그래프의 유형
        • 무방향성 그래프
        • 방향성 그래프
        • 가중치 그래프
      • 그래프의 표현 방식
        • 객체지향 접근법: 구조체와 클래스 활용
        • 이웃 목록
        • 이웃 매트릭스
        • 근접 매트릭스
    • 데이터 구조
      • 꼭지점
      • 모서리
      • 이웃 목록
    • 깊이 우선 검색
    • 너비 우선 검색
    • 스패닝 트리
      • 미니멈 스패닝 트리
    • Prim 알고리즘
    • 최단 경로
    • 다이크스트라 알고리즘
      • SwiftGraph
    • 정리

  • 8장. 알고리즘의 성능과 효율성
    • 알고리즘의 효율성
      • 최상, 최악, 그리고 평균의 경우
    • 효율성 측정과 Big-O 표기법
      • 점근적 분석
        • 복잡성 계산 방식
    • 일반적인 함수의 복잡성 순서
      • O(1)
      • O(log(n))
      • O(n)
      • O(nlog(n))
      • O(n^2)
      • O(2^n)
        • Big-O 그래프 비교
    • 런타임 복잡성의 평가
    • 정리

  • 9장. 내게 꼭 맞는 알고리즘 선택하기
    • URL 단축기
      • 긴 URL 문제
      • URL 단축기 구현 전략
      • 스위프트로 구현하는 URL 단축기
        • 구현 기법 1: 올바른 튜플 찾기
        • 구현 기법 2: 인덱스값으로 올바른 배열 위치에 바로 접근하기
    • 대규모 데이터의 검색
      • 대규모 블랙리스트 문제
      • 대규모 블랙리스트 검색 문제의 해법
      • 스위프트로 구현하는 대규모 블랙리스트 검색 알고리즘
        • 구현 기법 1: 기본적인 대규모 블랙리스트 검색
        • 구현 기법 2: 블룸 필터 기법

도서 오류 신고

도서 오류 신고

에이콘출판사에 관심을 가져 주셔서 고맙습니다. 도서의 오탈자 정보를 알려주시면 다음 개정판 인쇄 시 반영하겠습니다.

오탈자 정보는 다음과 같이 입력해 주시면 됩니다.

(예시) p.100 아래에서 3행 : '몇일'동안 -> 며칠동안

정오표

정오표

[p.62 : 아래서 7행]
인스턴에
->
인스턴스에

[p.64 : 아래서 1행]
미리 예약하는 reserve 예제다.
->
미리 예약하는 예제다.

[p.68 : 1행]
5 초과인
->
5 미만인

[p.89 : 6행]
전달되 실행
->
전달되어 실행

[p.109 : 2행]
스택의 하단에 요소를 추가
->
스택의 상단에 요소를 추가

[p.110 : 아래서 1행]