Top

그레이트 코드(Great Code) 세트 [Great Code Vol.1 2/e + Great Code Vol.2 2/e + Great Code Vol.3]

  • 원서명Write Great Code, Volume 1, 2nd Edition (ISBN 9781718500365)+Write Great Code, Volume 2, 2nd Edition (ISBN 9781718500389)+Write Great Code, Volume 3(ISBN 9781593279790)
  • 지은이랜달 하이드(Randall Hyde)
  • 옮긴이동준상, 송주경
  • ISBN : SET0000000007
  • 120,000원
  • 2022년 05월 31일 펴냄
  • 페이퍼백 | 1,932쪽 | 188*235mm
  • 시리즈 : 소프트웨어 아키텍처

책 소개

세트 구성: 전3권

1) Great Code Vol.1 2/e
2) Great Code Vol.2 2/e
3) Great Code Vol.3

『Great Code Vol.1 2/e』 소개

소프트웨어 개발에 필요한 컴퓨팅 머신의 작동 원리와 상호작용 방식을 정보 표현 방식, 주요 연산 장치 및 주변 장치의 작동 방식에 대한 전문적인 설명과 시각화 자료, 다양한 레벨의 실습용 코드로 이해하기 쉽게 설명한다. 정보 표현 방식으로서 비트 논리 연산, 부동소수점수, 문자 데이터를 소개하고, CPU 및 메모리, 입출력 장치, 주변 장치버스, 파일시스템 등 컴퓨팅 머신과의 상호작용 방식을 설명한다.

추천의 글
“오늘날 프로그래머는 과도한 업무 부담 속에 신기술을 따라잡느라 힘든 시간을 보내고 있으며, 컴퓨터 아키텍처의 기본이나 프로그래밍 언어의 작동 방식 등을 배울 겨를이 없다. 이 책은 그러한 간극을 채워주는 역할을 할 것이다. 프로그래머에게 적극 추천한다.”
— InformIT.com

“이 책은 시중에 나와있는 프로그래밍 자기 학습서와 다르며, 모든 프로그래밍 언어, 모든 프로그래밍 레벨의 토대를 설명한다. 서둘러 읽어보길 바란다.”
— BayLISA

“별 다섯 개를 줄 만한 책. 컴퓨터 사이언스 전공 과정에서 놓칠 수 있는 프로그래밍의 기본을 명쾌하게 설명한다. 효율적으로 작성한 코드란 무엇인지 알 수 있게 되며, 여러분이 직접 그러한 코드를 작성하게 될 것이다. 이 책은 여러분이 효율적인 소프트웨어를 작성하기 위한 좋은 출발점이 될 것이다.”
— MacCompanion

“읽는 재미가 있는 책”
— VSJ Magazine

“어셈블리 언어를 배우지 않고 프로그래밍 언어에 상관없이 탁월한 코드를 작성하는 방법을 알고자 하는 모두에게 권할 만한 책이다.”
— WebServerTalk

이 책에서 다루는 내용
◆ 효과적으로 머신을 활용하기 위한 숫자, 문자와 그 외 하이레벨 데이터 구조의 표현 방식을 알아보고, 각 데이터 타입의 리소스 비용 설명
◆ 머신이 좀 더 효율적으로 데이터에 접근할 수 있도록 조직화, 체계화하는 방법
◆ 머신의 본질적인 작동 방식을 파악하기 위한 CPU의 작동 방식
◆ 애플리케이션의 성능을 최대로 끌어올리기 위한 각종 I/O 주변 장치의 작동 방식
◆ 프로그램이 최고의 성능을 낼 수 있게 해주는 메모리 계층 구조

이 책의 대상 독자
특정 프로그램 언어에 맞춰 쓴 책이 아니기 때문에 설명하는 개념은 프로그래밍 언어의 종류와 관계없이 적용할 수 있다. 특정 언어를 사용하거나 알지 못해도 이 책을 읽는 데는 지장이 없도록 작성했으며, 이 책의 프로그램 예문은 이해의 폭을 넓히기 위해 몇 가지 언어를 교대로 사용한다. 예시를 설명할 때는 코드에 대한 정확한 설명을 덧붙일 것이므로, 해당 언어에 익숙하지 않더라도 프로그램의 동작 방식을 문제 없이 이해할 수 있을 것이다.

이 책의 구성
2장, 4장, 5장에서는 컴퓨터의 기본적인 데이터 표기법을 알아본다. 예를 들어 컴퓨터가 어떠한 방법으로 부호 있는 정수와 부호 없는 정수, 문자, 문자열, 문자 집합, 실수, 분수와 같은 값들을 표현하는지 알아본다. 컴퓨터가 다양한 자료를 어떻게 표현하는지 충분히 이해하지 못한다면, 특정 작업에서 왜 그렇게 많은 시간이 소요되는지 알 수 없을 것이다.
3장에서는 현대적인 컴퓨터 시스템에서 널리 사용하는 2진법의 계산과 비트 연산을 알아본다. 대부분의 프로그래밍 언어가 2진법과 비트 연산을 지원하므로, 이 책에서는 일반적인 프로그래밍 개론 과정에서 잘 다루지 않는 2진법과 논리 연산을 통해 코드의 성능을 향상시키는 방법을 소개한다. 탁월한 코드를 작성하는 프로그래머가 되기 위해서는 2진법 및 비트 연산을 능숙하게 활용할 수 있어야 할 것이다.
6장에서는 (컴퓨터가 메모리에 접근하는 방법과 메모리의 성능에 관련된 특징 등과 같은) 메모리에 대해 알아보며, CPU가 메모리에 있는 다양한 자료 구조에 접근할 때 사용하는 메모리 지정 모드도 살펴본다. 현대적인 애플리케이션의 성능 저하 문제 중 상당수는 프로그램이 메모리에 접근하는 방식을 잘못 지정해 발생하는 메모리 병목 현상과 관련이 있으며, 6장에서는 이러한 문제를 해결할 수 있는 기반 지식을 제공한다.
7장에서는 다시 데이터 표현으로 돌아가서 복합 데이터 타입과 메모리 객체를 다루며, 앞부분의 여러 장에서 다뤘던 내용과 달리 포인터, 배열 레코드, 구조체, 공용체 등과 같은 하이레벨 데이터 타입에 관해 설명한다. 적지 않은 프로그래머가 메모리나 성능상의 문제를 고려하지 않고 대용량의 복합 데이터 구조를 사용하는 경향이 있는데, 7장에서는 이런 하이레벨 복합 데이터 타입을 로우레벨의 관점으로 설명함으로써 프로그램에서 이 기법을 사용할 때 지불해야 할 비용이 얼마인지 알려준다. 이를 통해 이 기법을 좀 더 신중하고 현명하게 사용할 수 있게 될 것이다.
8장에서는 불리언 논리 연산과 디지털 설계를 다룬다. 8장에서는 CPU와 컴퓨터 시스템 요소를 이해하기 위해 필요한 수학적 토대와 논리 연산을 위한 기초 지식을 제공한다. 8장에서는 주로 불리언 표현식을 다루며, 그중에는 if, while 등 범용 하이레벨 언어에서 사용되는 불리언 식을 최적화하는 방법도 포함된다.
9장 역시 8장에 이어 하드웨어와 관련된 내용으로 CPU의 구조를 알아본다. 탁월한 코드를 작성하기 위해 프로그래머는 기본적인 CPU 설계와 연산 방식을 이해하고 있어야 한다. 여러분이 CPU가 코드를 실행하는 방식에 맞춰 코드를 작성할 수 있다면, 더 적은 시스템 자원을 사용해 더 좋은 성능을 얻을 수 있을 것이다.
10장에서는 CPU 명령어 집합 구조를 알아본다. 모든 CPU에서 명령어는 CPU 동작에 가장 기본이 되는 부분이고, 프로그램 수행 시간은 수행되는 명령어의 종류와 수에 직접적인 영향을 받는다. 컴퓨터 구조에서 명령어를 설계하는 방법을 이해하면 어떤 연산이 다른 연산보다 더 많은 시간이 걸리는 이유를 알 수 있다. 여러분이 명령어의 한계와 CPU가 명령어를 해석하는 방식을 이해하면, 형편없는 코드 시퀀스를 탁월한 코드로 탈바꿈시킬 수도 있다.
11장에서는 다시 메모리 주제로 돌아와서 메모리 아키텍처와 메모리 구조를 알아본다. 이 장은 코드의 실행 속도를 높이는 데 큰 도움이 될 것이다. 메모리의 계층 구조와 캐시의 성능을 극대화하는 방법, 다른 고속 메모리 구성 요소 등을 알아본다. 현대 애플리케이션의 일반적인 문제 중 하나인 스래싱(thrashing)을 알아보고, 저성능 메모리 접근 문제를 해결하는 방법도 살펴본다.
12장에서 15장까지는 컴퓨터 시스템과 외부 환경의 소통 방식을 알아본다. 컴퓨터 시스템과 연결된 다수의 입출력 주변 장치(peripheral device)는 CPU나 메모리에 비해 훨씬 느린 속도로 작동한다. 여러분이 작성한 개별 명령 시퀀스의 성능이 탁월하더라도, 이들 입출력 주변 장치의 한계 상황을 알지 못하면 애플리케이션의 전체 성능은 낮은 수준을 벗어날 수 없다. 따라서 책 후반의 네 개 장은 범용 I/O 포트, 시스템 버스, 버퍼링, 핸드셰이킹, 폴링, 인터럽트 등을 다룬다. 이를 통해 여러분은 키보드, 병렬 포트, 직렬 포트, 디스크 드라이브, 테이프 드라이브, 플래시 저장 장치, SCSI, IDE/ATA, USB, 사운드 카드 등 다양한 PC 주변 장치와의 효율적인 소통 방식을 이해할 수 있을 것이다.

『Great Code Vol.2 2/e』 소개

오늘날의 프로그래밍 언어는 생산성과 이식성을 제공하는데, 컴파일러에 최적화되지 않은 조잡한 코드를 쉽게 작성할 수도 있다. 로우레벨로 생각하고 하이레벨 언어로 코딩하면 컴파일러로 좋은 기계어 코드를 생성해내는 소스 코드를 만들 수 있게 해준다.

추천의 글
“아직 서점에 있다면, 친구에게 부탁하거나 돈을 모아 이 책을 구입하라. 집에 도착하면, 그 안에 담긴 내용을 마스터할 수 있도록 읽고 또 읽어라.”
— 데브시티(DevCity)

“이 책은 HLL로 애플리케이션을 작성할 때 개발자가 애플리케이션 성능에 더 많은 주의를 기울이도록 충분히 도와준다. 모든 하이레벨 애플리케이션 개발자에게 필수 도서다.”
— 「Free Software Magazine」

“HLL 프로그래머로서, 프로그램에서 실제로 무슨 일이 일어나고 있는지 알고 싶다면 어셈블리 언어를 배워라. 그보다 더 쉬운 방법은 없다.”
— 데브엑스(DevX)

“좋은 책이다. 매우 매우 훌륭한 책이다. 솔직히 글의 퀄리티가 엄청나다.”
— 토론토 루비 사용자 그룹(Toronto Ruby User Group)

이 책에서 다루는 내용
◆ 코드가 좋은 기계어 코드를 생성하는지 컴파일러의 출력물을 분석해 확인하는 방법
◆ 컴파일러가 생성하는 기계어 코드 명령문의 유형을 이해하고, 하이레벨 언어로 코딩할 때 최선의 명령문을 선택
◆ 컴파일러 출력을 읽기에 충분한 어셈블리 언어
◆ 컴파일러가 다양한 상수 및 변수 오브젝트를 기계어 데이터로 변환하는 방법

이 책의 대상 독자
독자들이 어느 정도의 사전 지식을 갖추고 있다는 가정을 바탕으로 한다. 다음과 같은 스킬을 갖고 있다면, 이 책에서 최대한 도움을 얻을 수 있다.

◆ 적어도 하나 이상의 명령형(절차적) 프로그래밍 언어나 객체지향 프로그래밍 언어에 상당히 능숙하다. (예를 들면, C, C++, 파스칼(Pascal), 자바(Java), 스위프트(Swift), 베이직(BASIC), 파이썬(Python), 어셈블리(assembly), 에이다(Ada), 모듈라-2(Modula-2), 포트란(FORTRAN) 등)
◆ 간단한 문제에 대한 설명을 듣고 해당 문제에 대한 소프트웨어 솔루션을 설계하고 구현할 수 있어야 한다. 대학에서 한 학기 정도 관련 과목을 수강했거나 몇 개월 정도 독학했다면, 충분히 준비될 수 있다.
◆ 컴퓨터 구조나 데이터 표현에 대한 기본적인 이해가 있어야 한다. 16진수와 이진수 시스템을 알아야 한다. 부호 있는 정수, 문자, 문자열 등 다양한 하이레벨 데이터 유형이 컴퓨터 메모리에 어떻게 표현되는지 이해하고 있어야 한다.

이 책의 구성
효율적인 코드를 작성하기 위해 전문 어셈블리 언어 프로그래머가 될 필요는 없지만, 이 책의 컴파일러 출력을 이해하려면 최소한 이에 대한 기본 지식은 필요하다. 1장과 2장에서는 어셈블리 언어 학습의 여러 측면을 살펴보고, 일반적인 오해, 컴파일러에 대한 고려사항, 사용 가능한 리소스를 다룬다. 3장에서는 80x86 어셈블리 언어에 대한 빠른 입문가이드를 제공한다. 온라인 부록(http://www.randallhyde.com/)은 파워PC, ARM, 자바 바이트코드, CIL(Common Intermediate Language) 어셈블리 언어에 대한 입문 가이드를 제공한다.
4장과 5장에서는 컴파일러 출력을 검사해 HLL 구문의 품질을 결정하는 방법에 대해 배운다. 또한 디스어셈블러, 오브젝트 코드 덤프 툴, 디버거, 어셈블리 언어 코드를 표시하기 위한 다양한 HLL 컴파일러 옵션과 기타 유용한 소프트웨어 툴에 대해 설명한다.
이 책의 나머지 부분인 6~15장에서는 컴파일러가 다양한 HLL 구문과 데이터 유형에 대한 기계어 코드를 생성하는 방법에 대해 설명한다. 이 지식들로 무장하면, 가장 적절한 데이터 유형, 상수, 변수, 제어 구조를 선택해 효율적인 애플리케이션을 생성할 수 있다.

『Great Code Vol.3』 소개

개발자가 알아야 할 개발 방법론과 생산성 관리 전략부터 객체지향적 디자인의 요구사항과 시스템 문서화에 이르는 방대한 내용을 알기 쉽게 설명한다. 개발자가 프로젝트 팀원으로서 알아야 할 문서화 작업 방법과 문서 간의 일관성 유지 기법, 소프트웨어 엔지니어링 디자인 문서라고 할 수 있는 UML 요구사항 작성 방법, IEEE 표준안 기반의 소프트웨어 품질 관리 방법을 다양한 예시와 사례로 알기 쉽게 설명한다.

이 책에서 다루는 내용
◆ 소프트웨어 장인 정신 모델을 통한 업무 능률 개선의 필요성
◆ 문서화 작업에서 문서 간의 일관성을 유지하기 위한 추적 기능 사용 방법
◆ 유스 케이스 분석에 따른 UML 요구사항 작성 방법
◆ IEEE 문서화 표준안 기반의 소프트웨어 품질 관리 방법

이 책의 대상 독자
C, C++, C#, 스위프트(Swift), 파스칼(Pascal), BASIC, 자바(Java), 어셈블리어 등 하나 이상의 절차적 프로그래밍 언어 또는 객체지향 프로그래밍 언어를 이해할 수 있다고 가정한다. 또한 소프트웨어 솔루션 디자인 및 구현 과정에 발생하는 문제를 구체화할 수 있다고 가정한다. 단과대학(기술 전문대학) 또는 일반 대학에서 컴퓨터 과학을 전공하거나 1학기 이상의 관련 과정을 이수했다면 읽는 데 큰 어려움은 없을 것이다.
독자가 컴퓨터 구조(machine organization)와 데이터 표현 방식(data representation)에 대한 기본적인 이해를 갖추고 있을 것으로 가정한다.

저자/역자 소개

지은이 소개

랜달 하이드(Randall Hyde)

『The Art of Assembly Language』, 『Write Great Code』 시리즈, 『Using 6502 Assembly Language』와 『P-Source』의 저자이고, 『The Waite Group’s MASM 6.0 Bible』의 공저자다. 지난 40여 년간 원자력 발전기, 교통신호 시스템, 다양한 소비자용 전자 제품을 위한 임베디드 소프트웨어 및 하드웨어 개발 도구를 만들어왔고, 포모나에 위치한 캘리포니아주립 폴리테크닉 대학교(California State Polytechnic University)와 리버사이드에 위치한 캘리포니아 대학교(University of California)에서 컴퓨터 과학을 가르쳐왔다.
프로그래밍과 소프트웨어 엔지니어링에 대한 다양한 자료를 제공하는 웹 사이트(www.randallhyde.com)를 운영한다.

옮긴이 소개

동준상

클라우드, 인공지능 부문 강연자이자 컨설턴트이며 AWS 테크놀로지 파트너, 한국생산성본부 인공지능 전문가위원이다. 한국생산성본부, 서울대학교, 삼성전자, 고려대학교, 국가정보자원관리원, 포항공과대학교에서 관련 주제로 강연을 했다.
소프트웨어 엔지니어링과 오픈소스에 관심이 많고 에이콘출판사에서 출간한 『AWS 공인 솔루션스 아키텍트 스터디 가이드 – 어소시에이트 3/e』(2022), 『AWS 공인 솔루션스 아키텍트 올인원 – 어소시에이트 2/e』(2021), 『기업용 블록체인』(2019), 『자바 머신 러닝 마스터』(2019), 『스위프트 데이터 구조와 알고리즘』(2017) 외 10여 권을 번역했다.

송주경

삼성전자 엔지니어 출신으로 현재 클라우드, 인공지능, 로봇, 메타버스, 블록체인 등 기술 융합 분야와 프로그래밍 강의를 하고 있다. 파이썬, 스파크, 스프링 분야의 번역서를 여러 권 출간했다.

목차

목차
  • 『Great Code Vol.1 2/e』
  • 1장. 탁월한 코드 작성을 위한 준비
  • 1.1 『Write Great Code』 시리즈의 개요
  • 1.2 이 책에서 다루는 내용
  • 1.3 이 책의 활용을 위한 준비
  • 1.4 탁월한 코드의 특징
  • 1.5 이 책에 실린 예제의 실행 환경
  • 1.6 이 책의 추가적인 활용 팁
  • 1.7 참고 자료

  • 2장. 컴퓨터의 수 표기법
  • 2.1 수란 무엇인가
  • 2.2 수
  • 2.2.1 10진 위치 표기법
  • 2.2.2 기수
  • 2.2.3 2진수 체계
  • 2.2.4 16진수 체계
  • 2.2.5 8진수 체계
  • 2.3 숫자와 문자의 상호 변환
  • 2.4 내부 숫자 표현법
  • 2.4.1 비트
  • 2.4.2 비트 문자열
  • 2.5 부호 있는 수와 부호 없는 수
  • 2.6 2진수의 유용한 속성
  • 2.7 데이터 타입 통일을 위한 부호 확장, 0 확장, 부호 축소
  • 2.8 포화
  • 2.9 2진화 10진 표기법
  • 2.10 고정소수점 표기
  • 2.11 배율 조정 수 포맷
  • 2.12 유리수 표기법
  • 2.13 참고 자료

  • 3장. 2진법 계산 및 비트 연산
  • 3.1 2진수와 16진수를 이용한 산술 연산
  • 3.1.1 2진수의 덧셈
  • 3.1.2 2진수의 뺄셈
  • 3.1.3 2진수의 곱셈
  • 3.1.4 2진수의 나눗셈
  • 3.2 비트 논리 연산
  • 3.3 2진수와 비트 문자열의 논리 연산
  • 3.4 비트 연산의 유용한 속성
  • 3.4.1 AND를 이용한 비트 문자열 검증
  • 3.4.2 AND를 이용한 비트 세트의 0 포함 여부 검증
  • 3.4.3 2진 문자열의 비트 세트 비교
  • 3.4.4 AND를 이용한 모듈로 n 카운터 구현
  • 3.5 이동 연산과 회전 연산
  • 3.6 비트 필드와 데이터 묶음
  • 3.7 데이터 묶기와 데이터 묶음 풀기
  • 3.8 참고 자료

  • 4장. 부동소수점 연산
  • 4.1 부동소수점 연산의 개요
  • 4.2 IEEE 부동소수점 형식
  • 4.2.1 단정밀도 부동소수점 형식
  • 4.2.2 복정밀도 부동소수점 형식
  • 4.2.3 확장 정밀도 부동소수점 형식
  • 4.2.4 쿼드 정밀도 부동소수점 형식
  • 4.3 부동소수점 수의 정규화와 비정규화
  • 4.4 라운딩
  • 4.5 특수한 부동소수점 값
  • 4.6 부동소수점 예외 규칙
  • 4.7 부동소수점 연산 방식의 이해
  • 4.7.1 이번 절에서 사용하는 부동소수점 형식
  • 4.7.2 부동소수점 덧셈 및 뺄셈
  • 4.7.3 부동소수점 곱셈 및 나눗셈
  • 4.8 참고 자료

  • 5장. 문자 데이터의 활용
  • 5.1 문자 데이터
  • 5.1.1 ASCII 문자셋
  • 5.1.2 IBM의 EBCDIC 문자셋
  • 5.1.3 더블 바이트 문자셋
  • 5.1.4 유니코드 문자셋
  • 5.1.5 유니코드 코드 포인트
  • 5.1.6 유니코드 코드 플레인
  • 5.1.7 서로게이트 코드 포인트
  • 5.1.8 글리프, 문자, 그래핌 클러스터
  • 5.1.9 유니코드 노멀과 캐노니컬 동등
  • 5.1.10 유니코드 인코딩
  • 5.1.11 유니코드 연결 문자
  • 5.2 문자열
  • 5.2.1 문자열 형식
  • 5.2.2 문자열 유형: 정적, 유사 동적, 동적 문자열
  • 5.2.3 문자열 참조 카운터
  • 5.2.4 델파이 문자열
  • 5.2.5 커스텀 문자열
  • 5.3 문자셋 데이터 타입
  • 5.3.1 문자셋의 멱집합 표기법
  • 5.3.2 문자셋의 리스트 표기법
  • 5.4 자체 문자셋 설계하기
  • 5.4.1 효율적인 문자셋의 설계
  • 5.4.2 숫자 표현을 위한 문자 코드 그룹화
  • 5.4.3 알파벳 문자 그룹화
  • 5.4.4 알파벳 문자의 비교 연산
  • 5.4.5 기타 문자의 그룹화
  • 5.5 참고 자료

  • 6장. 메모리 구조와 접근 방식
  • 6.1 컴퓨터의 기본적인 시스템 구성 요소
  • 6.1.1 시스템 버스
  • 6.2 메모리의 물리적 구조
  • 6.2.1 8비트 데이터 버스
  • 6.2.2 16비트 데이터 버스
  • 6.2.3 32비트 데이터 버스
  • 6.2.4 64비트 데이터 버스.
  • 6.2.5 80x86 이외 프로세서의 바이트, 워드, 더블워드 접근 방식
  • 6.3 빅 엔디안과 리틀 엔디안의 구조 비교
  • 6.4 시스템 클럭
  • 6.4.1 메모리 액세스와 시스템 클럭
  • 6.4.2 대기 상태
  • 6.4.3 캐시 메모리
  • 6.5 CPU의 메모리 액세스 방법
  • 6.5.1 직접 메모리 주소 지정 모드
  • 6.5.2 간접 메모리 주소 지정 모드
  • 6.5.3 인덱스 메모리 주소 지정 모드
  • 6.5.4 스케일 인덱스 주소 지정 모드
  • 6.6 참고 자료

  • 7장. 복합 데이터 타입과 메모리 객체
  • 7.1 포인터 타입
  • 7.1.1 포인터 구현
  • 7.1.2 포인터와 동적 메모리 할당
  • 7.1.3 포인터 작업 및 포인터 산술 연산
  • 7.1.3.1 포인터에 정수 더하기
  • 7.2 배열
  • 7.2.1 배열 선언
  • 7.2.2 메모리에서의 배열 표현
  • 7.2.3 배열 요소에 접근하기
  • 7.2.4 다차원 배열
  • 7.3 레코드와 구조체
  • 7.3.1 파스칼/델파이의 레코드
  • 7.3.2 C/C++의 레코드
  • 7.3.3 HLA의 레코드
  • 7.3.4 스위프트의 레코드(튜플)
  • 7.3.5 레코드의 메모리 저장 방식
  • 7.4 이산 유니온 데이터 타입
  • 7.4.1 C/C++의 유니온
  • 7.4.2 파스칼/델파이의 유니온
  • 7.4.3 스위프트의 유니온
  • 7.4.4 HLA의 유니온
  • 7.4.5 유니온 타입의 메모리 저장
  • 7.4.6 유니온 타입의 기타 활용 방식
  • 7.5 클래스
  • 7.5.1 클래스 개념 1: 상속
  • 7.5.2 클래스 구조체
  • 7.5.3 클래스 개념 2: 다형성
  • 7.5.4 추상 메소드와 추상 베이스 클래스
  • 7.6 C++의 클래스
  • 7.6.1 C++의 추상 멤버 함수 및 클래스
  • 7.6.2 C++의 다중 상속
  • 7.7 자바의 클래스
  • 7.8 스위프트의 클래스
  • 7.9 프로토콜과 인터페이스
  • 7.10 제네릭과 템플릿
  • 7.11 참고 자료

  • 8장. 불리언 로직과 디지털 설계
  • 8.1 불리언 대수
  • 8.1.1 불리언 연산자
  • 8.1.2 불리언 공리
  • 8.1.3 불리언 연산자의 우선순위
  • 8.2 불리언 함수와 진리표
  • 8.3 함수 번호
  • 8.4 불리언 수식의 대수 처리
  • 8.5 정규형
  • 8.5.1 최소항의 합 정규형과 진리표
  • 8.5.2 대수적으로 생성된 최소항의 합 정규형
  • 8.5.3 최대항의 곱 정규형
  • 8.6 불리언 함수의 단순화
  • 8.7 불리언 로직의 적용 방식
  • 8.7.1 전자 회로와 불리언 함수의 대응 관계
  • 8.7.2 조합 회로
  • 8.7.3 시퀀셜 로직과 클럭 로직
  • 8.8 참고 자료

  • 9장. CPU 아키텍처
  • 9.1 CPU의 기본적인 설계 방식
  • 9.2 명령어 디코딩 및 실행: 랜덤 로직과 마이크로코드의 비교
  • 9.3 단계별 명령어 실행
  • 9.3.1 mov 명령어
  • 9.3.2 add 명령어
  • 9.3.3 jnz 명령어
  • 9.3.4 loop 명령어
  • 9.4 RISC vs. CISC: 명령어의 신속 실행을 통한 성능 향상
  • 9.5 병렬성: 더 높은 성능의 비결
  • 9.5.1 기능성 유닛
  • 9.5.2 프리페치 큐
  • 9.5.3 프리페치 큐의 성능을 저하시키는 조건
  • 9.5.4 파이프라이닝: 다중 명령어 중첩
  • 9.5.5 명령어 캐시: 다수의 메모리 경로 제공
  • 9.5.6 파이프라인 해저드
  • 9.5.7 슈퍼스칼라 연산: 병렬적 명령어 실행
  • 9.5.8 명령어의 비순차적 실행
  • 9.5.9 레지스터 이름 변경
  • 9.5.10 VLIW 아키텍처
  • 9.5.11 병렬 처리
  • 9.5.12 멀티프로세싱
  • 9.6 참고 자료

  • 10장. 명령어 집합 설계
  • 10.1 명령어 집합 설계의 중요성
  • 10.2 명령어 설계의 기본적인 목표
  • 10.2.1 opcode 길이 선택
  • 10.2.2 미래에 대한 대비
  • 10.2.3 명령어 선택
  • 10.2.4 명령어에 opcode 할당하기
  • 10.3 가상의 Y86 프로세서
  • 10.3.1 Y86 프로세서의 제한된 기능 소개
  • 10.3.2 Y86 명령어의 종류
  • 10.3.3 Y86의 피연산자 유형과 어드레스 모드
  • 10.3.4 Y86 명령어 인코딩
  • 10.3.5 Y86 명령어 인코딩 사례
  • 10.3.6 Y86 명령어 집합의 확장
  • 10.4 80x86 명령어 인코딩
  • 10.4.1 명령어 피연산자 인코딩
  • 10.4.2 add 명령어 인코딩
  • 10.4.3 x86 상수 피연산자 인코딩
  • 10.4.4 8비트, 16비트, 32비트 피연산자 인코딩
  • 10.4.5 64비트 피연산자 인코딩
  • 10.4.6 명령어의 대안으로서 인코딩
  • 10.5 명령어 집합 설계의 중요성
  • 10.6 참고 자료

  • 11장. 메모리 아키텍처 및 구성
  • 11.1 메모리 계층 구조
  • 11.2 메모리 계층의 작동 방식
  • 11.3 메모리 서브시스템의 성능 비교
  • 11.4 캐시 아키텍처
  • 11.4.1 직접 매핑 캐시
  • 11.4.2 완전 연관 캐시
  • 11.4.3 n-way 집합 연관 캐시
  • 11.4.4 캐시 라인 교체 방식
  • 11.4.5 캐시에서의 데이터 쓰기 방식
  • 11.4.6 캐시 활용 및 소프트웨어
  • 11.5 NUMA와 주변 장치
  • 11.6 가상 메모리, 메모리 보호, 페이징
  • 11.7 메모리 계층을 고려한 소프트웨어 개발
  • 11.8 런타임 시 메모리 구성
  • 11.8.1 정적 객체, 동적 객체, 바인딩, 생애주기
  • 11.8.2 코드 영역, 읽기 전용 영역, 상수 영역
  • 11.8.3 정적 변수 영역
  • 11.8.4 스토리지 변수 영역
  • 11.8.5 스택 영역
  • 11.8.6 힙 영역과 동적 메모리 할당
  • 11.9 참고 자료

  • 12장. 입력 및 출력 장치
  • 12.1 컴퓨터 외부로 CPU 연결하기
  • 12.2 시스템에 포트를 연결하는 다른 방법
  • 12.3 I/O 메커니즘
  • 12.3.1 메모리 맵 입출력 방식
  • 12.3.2 I/O 맵 입출력 방식
  • 12.3.3 DMA, 직접 메모리 접근 방식
  • 12.4 I/O 속도의 계층 구조
  • 12.5 시스템 버스와 데이터 전송 속도
  • 12.5.1 PCI 버스의 성능
  • 12.5.2 ISA 버스의 성능
  • 12.5.3 AGP 버스
  • 12.6 버퍼링
  • 12.7 핸드셰이킹
  • 12.8 I/O 포트의 타임아웃
  • 12.9 폴링 기반 I/O 및 인터럽트
  • 12.10 작업 보호 모드와 장치 드라이버
  • 12.10.1 장치 드라이버 모델
  • 12.10.2 장치 드라이버와의 통신
  • 12.11 참고 자료

  • 13장. 컴퓨터 주변 장치 버스
  • 13.1 소형 컴퓨터 시스템 인터페이스
  • 13.1.1 SCSI의 한계점
  • 13.1.2 SCSI의 성능 및 기능 개선
  • 13.1.3 SCSI 프로토콜
  • 13.1.4 SCSI의 장점
  • 13.2 IDE/ATA 인터페이스
  • 13.2.1 SATA 인터페이스
  • 13.2.2 파이버 채널
  • 13.3 USB, 유니버설 시리얼 버스
  • 13.3.1 USB의 설계
  • 13.3.2 USB의 성능
  • 13.3.3 USB의 데이터 전송 유형
  • 13.3.4 USB-C
  • 13.3.5 USB 장치 드라이버
  • 13.4 참고 자료

  • 14장. 대용량 저장 장치와 파일 시스템
  • 14.1 디스크 드라이브
  • 14.1.1 플로피 디스크 드라이브
  • 14.1.2 하드 드라이브
  • 14.1.3 RAID 시스템
  • 14.1.4 광학 드라이브
  • 14.1.5 CD, DVD, 블루레이 드라이브
  • 14.2 테이프 드라이브
  • 14.3 플래시 저장 장치
  • 14.4 RAM 디스크
  • 14.5 SSD
  • 14.6 하이브리드 드라이브
  • 14.7 대용량 저장 장치의 파일 시스템
  • 14.7.1 시퀀셜 파일 시스템
  • 14.7.2 효율적인 파일 할당 전략
  • 14.8 대용량 저장 장치의 데이터 활용 소프트웨어 개발
  • 14.8.1 파일 액세스 성능
  • 14.8.2 동기적 및 비동기적 I/O
  • 14.8.3 I/O 작업 유형별 성능
  • 14.8.4 메모리 맵 파일
  • 14.9 참고 자료

  • 15장. 기타 입출력 장치
  • 15.1 PC 주변 장치
  • 15.1.1 키보드
  • 15.1.2 표준 PC 병렬 포트
  • 15.1.3 시리얼 포트
  • 15.2 마우스, 트랙패드, 기타 포인팅 장치
  • 15.3 조이스틱, 게임 컨트롤러
  • 15.4 사운드 카드
  • 15.4.1 오디오 인터페이스 주변 장치가 음을 출력하는 방법
  • 15.4.2 오디오 파일 및 MIDI 파일 포맷
  • 15.4.3 오디오 장치 프로그래밍
  • 15.5 참고 자료
  • 후기: 로우레벨로 생각하고, 하이레벨로 코딩하라
  • 부록 A ASCII 문자셋

  • 『Great Code Vol.2 2/e』
  • 1장. 로우레벨로 생각하고 고급 언어로 코딩하기
  • 1.1 컴파일러 품질에 대한 오해
  • 1.2 어셈블리 언어를 배우는 것이 여전히 좋은 생각인 이유
  • 1.3 어셈블리 언어를 배우는 것이 절대적으로 필요하지 않은 이유
  • 1.4 로우레벨에 대한 고려
  • 1.4.1 받은 만큼만 돌려주는 컴파일러
  • 1.4.2 컴파일러가 더 좋은 기계어 코드를 생성하도록 돕는 방법
  • 1.4.3 어셈블리를 고려한 HLL 코딩 방법
  • 1.5 HLL 코딩
  • 1.6 언어 중립적 접근
  • 1.7 추가 팁
  • 1.8 참고 자료

  • 2장. 어셈블리 언어를 꼭 배워야 할까?
  • 2.1 어셈블리 언어 학습의 이점과 장애물
  • 2.2 이 책이 도움이 되는 방법
  • 2.3 해결책: 하이레벨 어셈블러
  • 2.4 고급 어셈블리 언어
  • 2.5 하이레벨로 생각하고 로우레벨로 코딩하기
  • 2.6 어셈블리 프로그래밍 패러다임(로우레벨로 생각하기)
  • 2.7 참고 자료

  • 3장. HLL 프로그래머를 위한 80X86 어셈블리
  • 3.1 배울수록 도움이 되는 어셈블리 언어
  • 3.2 80x86 어셈블리 문법
  • 3.2.1 기본 80x86 아키텍처
  • 3.2.2 레지스터
  • 3.2.3 80x86 32비트 범용 레지스터
  • 3.2.4 80x86 EFLAGS 레지스터
  • 3.3 리터럴 상수
  • 3.3.1 이진 리터럴 상수
  • 3.3.2 십진 리터럴 상수
  • 3.3.3 16진 리터럴 상수
  • 3.3.4 문자와 문자열 리터럴 상수
  • 3.3.5 실수 리터럴 상수
  • 3.4 어셈블리 언어에서의 선언(기호) 상수
  • 3.4.1 HLA의 선언 상수
  • 3.4.2 Gas의 선언 상수
  • 3.4.3 MASM의 선언 상수
  • 3.5 80x86 주소 지정 방식
  • 3.5.1 80x86 레지스터 주소 지정 방식
  • 3.5.2 즉시 주소 지정 방식
  • 3.5.3 직접 메모리 주소 지정 방식
  • 3.5.4 RIP 관련 주소 지정 방식
  • 3.5.5 레지스터 간접 주소 지정 방식
  • 3.5.6 인덱스 주소 지정 방식
  • 3.5.7 스케일 인덱스 주소 지정 방식
  • 3.6 어셈블리 언어에서 데이터 선언하기
  • 3.6.1 HLA에서의 데이터 선언
  • 3.6.2 MASM에서의 데이터 선언
  • 3.6.3 Gas에서의 데이터 선언
  • 3.7 어셈블리 언어에서 오퍼랜드 크기 지정
  • 3.7.1 HLA에서의 타입 지정
  • 3.7.2 MASM에서의 타입 지정
  • 3.7.3 Gas에서의 타입 지정
  • 3.8 참고 자료

  • 4장. 컴파일러 동작 및 코드 생성
  • 4.1 프로그래밍 언어가 사용하는 파일 유형
  • 4.2 소스 파일
  • 4.2.1 토큰화 소스 파일
  • 4.2.2 특화된 소스 파일
  • 4.3 컴퓨터 언어 프로세서의 유형
  • 4.3.1 순수 인터프리터
  • 4.3.2 인터프리터
  • 4.3.3 컴파일러
  • 4.3.4 증분 컴파일러
  • 4.4 변환 프로세스
  • 4.4.1 스캐닝(어휘 분석)
  • 4.4.2 파싱(구문 분석)
  • 4.4.3 중간 코드 생성
  • 4.4.4 최적화
  • 4.4.5 컴파일러 벤치마킹
  • 4.4.6 네이티브 코드 생성
  • 4.5 컴파일러 출력
  • 4.5.1 컴파일러 출력으로 HLL 코드 내보내기
  • 4.5.2 컴파일러 출력으로 어셈블리 언어 내보내기
  • 4.5.3 컴파일러 출력으로 오브젝트 파일 내보내기
  • 4.5.4 컴파일러 출력으로 실행 파일 내보내기
  • 4.6 오브젝트 파일 형식
  • 4.6.1 COFF 파일 헤더
  • 4.6.2 COFF 옵션 헤더
  • 4.6.3 COFF 섹션 헤더
  • 4.6.4 COFF 섹션
  • 4.6.5 재배치 섹션
  • 4.6.6 디버깅 및 심벌 정보
  • 4.7 실행 파일 형식
  • 4.7.1 페이지, 세그먼트, 파일 크기
  • 4.7.2 내부 단편화
  • 4.7.3 왜 공간 최적화를 하는가?
  • 4.8 오브젝트 파일의 데이터 및 코드 정렬
  • 4.8.1 섹션 정렬 크기 선택
  • 4.8.2 섹션 결합
  • 4.8.3 섹션 정렬 값 제어
  • 4.8.4 라이브러리 모듈 내 섹션 정렬
  • 4.9 링커가 코드에 미치는 영향
  • 4.10 참고 자료

  • 5장. 컴파일러 출력물을 분석하기 위한 툴
  • 5.1 배경지식
  • 5.2 컴파일러에서 어셈블리 코드를 출력하는 법
  • 5.2.1 GNU 컴파일러의 어셈블리 코드 결과물
  • 5.2.2 비주얼 C++의 어셈블리 코드 결과물
  • 5.2.3 어셈블리 코드 결과물 예제
  • 5.2.4 어셈블리 코드 결과물 분석
  • 5.3 오브젝트 코드 유틸리티를 사용해 컴파일러 출력 분석하기
  • 5.3.1 마이크로소프트의 dumpbinexe 유틸리티
  • 5.3.2 FSF/GNU objdump 유틸리티
  • 5.4 역어셈블러를 사용해 컴파일러 출력 분석하기
  • 5.5 자바 바이트코드 역어셈블러를 사용해 자바 출력 분석하기
  • 5.6 IL 역어셈블러를 사용해 마이크로소프트 C# 및 비주얼 베이직 코드 결과물 분석하기
  • 5.7 디버거를 사용해 컴파일러 출력 분석하기
  • 5.7.1 IDE에 내장된 디버거를 사용하는 방법
  • 5.7.2 독립된 디버거를 사용하는 방법
  • 5.8 두 컴파일의 출력 비교
  • 5.8.1 diff를 이용한 코드의 전과 후 비교
  • 5.9 참고 자료

  • 6장. 상수와 HLL
  • 6.1 리터럴 상수와 프로그램 효율성
  • 6.2 바인딩 시간
  • 6.3 리터럴 상수와 선언 상수
  • 6.4 상수식
  • 6.5 선언 상수와 읽기 전용 메모리 객체
  • 6.6 스위프트 let 문
  • 6.7 열거형
  • 6.8 부울 상수
  • 6.9 실수 상수
  • 6.10 문자열 상수
  • 6.11 복합 데이터 타입 상수
  • 6.12 상수는 변하지 않는다
  • 6.13 참고 자료

  • 7장. HLL의 변수
  • 7.1 런타임 메모리 구성
  • 7.1.1 코드, 상수, 읽기 전용 섹션
  • 7.1.2 정적 변수 섹션
  • 7.1.3 스토리지 변수 섹션
  • 7.1.4 스택 섹션
  • 7.1.5 힙 섹션과 동적 메모리 할당
  • 7.2 변수란?
  • 7.2.1 속성
  • 7.2.2 바인딩
  • 7.2.3 정적 객체
  • 7.2.4 동적 객체
  • 7.2.5 범위
  • 7.2.6 수명
  • 7.2.7 변수 정의
  • 7.3 변수 저장 공간
  • 7.3.1 정적 바인딩과 정적 변수
  • 7.3.2 의사 정적 바인딩과 자동 변수
  • 7.3.3 동적 바인딩 및 동적 변수
  • 7.4 공통 기본 데이터 타입
  • 7.4.1 정수 변수
  • 7.4.2 부동 소수점/실수 변수
  • 7.4.3 문자 변수
  • 7.4.4 부울 변수
  • 7.5 변수 주소와 HLL
  • 7.5.1 전역 변수와 정적 변수의 저장 공간 할당
  • 7.5.2 자동 변수를 사용해 오프셋 크기 줄이기
  • 7.5.3 중간 변수를 위한 저장 공간 할당
  • 7.5.4 동적 변수와 포인터를 위한 스토리지 할당
  • 7.5.5 레코드/구조체를 사용해 명령어 오프셋 크기 줄이기
  • 7.5.6 레지스터에 변수 저장
  • 7.6 메모리의 변수 정렬하기
  • 7.6.1 레코드와 정렬
  • 7.7 참고 자료

  • 8장. 배열 자료형
  • 8.1 배열
  • 8.1.1 배열 선언
  • 8.1.2 메모리에서의 배열 표현
  • 8.1.3 스위프트 배열 구현
  • 8.1.4 배열 원소에 접근하기
  • 8.1.5 패딩 vs 패킹
  • 8.1.6 다차원 배열
  • 8.1.7 동적 배열과 정적 배열
  • 8.2 참고 자료

  • 9장. 포인터 자료형
  • 9.1 포인터의 정의
  • 9.2 HLL에서의 포인터 구현
  • 9.3 포인터와 동적 메모리 할당
  • 9.4 포인터 연산과 포인터 산술
  • 9.4.1 포인터에 정수 더하기
  • 9.4.2 포인터에서 정수 빼기
  • 9.4.3 포인터에서 포인터 빼기
  • 9.4.4 포인터 비교
  • 9.4.5 포인터와 논리 AND/OR 연산
  • 9.4.6 포인터의 다른 연산
  • 9.5 단순 메모리 할당자 예제
  • 9.6 가비지 컬렉션
  • 9.7 운영체제와 메모리 할당
  • 9.8 힙 메모리 오버헤드
  • 9.9 일반적인 포인터 문제
  • 9.9.1 초기화되지 않은 포인터 사용
  • 9.9.2 잘못된 값을 포함하는 포인터 사용
  • 9.9.3 포인터 해제 후 스토리지 계속 사용
  • 9.9.4 프로그램을 사용한 후, 저장 공간 해제 실패
  • 9.9.5 잘못된 자료형을 사용해 간접 데이터 액세스
  • 9.9.6 포인터에 대한 잘못된 연산 수행
  • 9.10 현대 언어의 포인터
  • 9.11 관리 포인터
  • 9.12 참고 자료

  • 10장. 문자열 자료형
  • 10.1 문자열 형식
  • 10.1.1 0으로 끝나는 문자열
  • 10.1.2 길이 접두사 문자열
  • 10.1.3 7비트 문자열
  • 10.1.4 HLA 문자열
  • 10.1.5 설명자 기반 문자열
  • 10.2 정적, 가상 동적, 동적 문자열
  • 10.2.1 정적 문자열
  • 10.2.2 가상 동적 문자열
  • 10.2.3 동적 문자열
  • 10.3 문자열의 참조 카운트
  • 10.4 델파이 문자열
  • 10.5 HLL에서 문자열 사용
  • 10.6 문자열의 유니코드 문자 데이터
  • 10.6.1 유니코드 문자 집합
  • 10.6.2 유니코드 코드 포인트
  • 10.6.3 유니코드 코드 플레인
  • 10.6.4 서로게이트 코드 포인트
  • 10.6.5 글리프, 문자, 그래핌 클러스터
  • 10.6.6 유니코드 일반 및 정규 동등성
  • 10.6.7 유니코드 인코딩
  • 10.6.8 유니코드 조합 문자
  • 10.7 유니코드 문자열 함수 및 성능
  • 10.8 참고 자료

  • 11장. 레코드, 유니온, 클래스 자료형
  • 11.1 레코드
  • 11.1.1 다양한 언어에서의 레코드 선언
  • 11.1.2 레코드 인스턴스 생성
  • 11.1.3 컴파일 타임에 레코드 데이터 초기화하기
  • 11.1.4 메모리에 레코드 저장
  • 11.1.5 레코드를 사용해 메모리 성능 향상
  • 11.1.6 동적 레코드 타입과 데이터베이스
  • 11.2 판별자 유니온
  • 11.2.1 다양한 언어에서의 유니온 선언
  • 11.2.2 메모리에 유니온 저장
  • 11.2.3 다른 방법으로 유니온 사용
  • 11.3 가변형
  • 11.4 네임스페이스
  • 11.5 클래스와 객체
  • 11.5.1 클래스 vs 객체
  • 11.5.2 C++의 간단한 클래스 선언
  • 11.5.3 C#과 자바의 클래스 선언
  • 11.5.4 델파이(오브젝트 파스칼)의 클래스 선언
  • 11.5.5 HLA의 클래스 선언
  • 11.5.6 가상 메소드 테이블
  • 11.5.7 추상 메소드
  • 11.5.8 VMT 공유
  • 11.5.9 클래스의 상속
  • 11.5.10 클래스의 다형성
  • 11.5.11 다중 상속(C++)
  • 11.6 프로토콜과 인터페이스
  • 11.7 클래스, 객체, 성능
  • 11.8 참고 자료
  • 12장. 산술 연산과 논리 연산
  • 12.1 산술식과 컴퓨터 아키텍처
  • 12.1.1 스택 기반 컴퓨터
  • 12.1.2 누산기 기반 컴퓨터
  • 12.1.3 레지스터 기반 컴퓨터
  • 12.1.4 산술식의 일반 형식
  • 12.1.5 3-주소 아키텍처
  • 12.1.6 2-주소 아키텍처
  • 12.1.7 구조적 차이와 코드
  • 12.1.8 복잡한 표현식
  • 12.2 산술문 최적화
  • 12.2.1 상수 접기
  • 12.2.2 상수 전달
  • 12.2.3 죽은 코드 제거
  • 12.2.4 공통 부분식 제거
  • 12.2.5 연산 대체
  • 12.2.6 귀납
  • 12.2.7 루프 불변
  • 12.2.8 최적화와 프로그래머
  • 12.3 산술식의 부수 효과
  • 12.4 부수 효과 포함: 시퀀스 포인트
  • 12.5 부수 효과로 인한 문제 방지
  • 12.6 계산 순서 강제 지정
  • 12.7 단축 연산
  • 12.7.1 부울식으로 단축 연산 사용
  • 12.7.2 단축 연산이나 완전 부울 연산 강제하기
  • 12.7.3 단축 연산과 완전 연산 효율성 비교
  • 12.8 산술 연산의 상대 비용
  • 12.9 참고 자료

  • 13장. 제어 구조 및 프로그램 결정
  • 13.1 제어 구조가 프로그램의 효율성에 미치는 영향
  • 13.2 로우레벨 제어 구조 소개
  • 13.3 goto 문
  • 13.3.1 제한된 형식의 goto 문
  • 13.4 if 문
  • 13.4.1 특정 if/else 문의 효율성 향상
  • 13.4.2 if 문에서 완전 부울 연산 강제하기
  • 13.4.3 if 문에서 단축 연산 강제
  • 13.5 switch/case 문
  • 13.5.1 switch/case 문의 의미
  • 13.5.2 점프 테이블과 연속 비교
  • 13.5.3 switch/case 문의 기타 구현
  • 13.5.4 스위프트 switch 문
  • 13.5.5 switch 문에 대한 컴파일러 출력
  • 13.6 참고 자료

  • 14장. 반복 제어 구조
  • 14.1 while 루프
  • 14.1.1 while 루프에서 완전 부울 연산 강제하기
  • 14.1.2 while 루프에서 단축 부울 연산 강제하기
  • 14.2 repeatuntil (dountil/dowhile) 루프
  • 14.2.1 repeatuntil 루프에서 완전 부울 연산 강제하기
  • 14.2.2 repeatuntil 루프에서 단축 부울 연산 강제하기
  • 14.3 foreverendfor 루프
  • 14.3.1 forever 루프에서 완전 부울 연산 강제하기
  • 14.3.2 forever 루프에서 단축 부울 연산 강제하기
  • 14.4 유한 루프(for 루프)
  • 14.5 참고 자료

  • 15장. 함수와 프로시저
  • 15.1 간단한 함수와 프로시저 호출
  • 15.1.1 반환 주소 저장
  • 15.1.2 오버헤드의 다른 원인
  • 15.2 리프 함수와 프로시저
  • 15.3 매크로와 인라인 함수
  • 15.4 함수나 프로시저에 매개변수 전달
  • 15.5 활성화 레코드와 스택
  • 15.5.1 활성화 레코드 분석
  • 15.5.2 지역 변수에 오프셋 할당
  • 15.5.3 오프셋과 매개변수
  • 15.5.4 매개변수와 지역 변수에 액세스
  • 15.5.5 Rescue 레지스터
  • 15.5.6 자바 VM과 마이크로소프트 CLR 매개변수와 지역 변수
  • 15.6 매개변수 전달 메커니즘
  • 15.6.1 값에 의한 전달
  • 15.6.2 참조에 의한 전달
  • 15.7 함수 반환 값
  • 15.8 참고 자료

  • 『Great Code Vol.3』
  • 1부 퍼스널 소프트웨어 엔지니어링
  • 1장. 소프트웨어 개발에 대한 은유법
  • 1.1 소프트웨어란 무엇인가?
  • 1.1.1 소프트웨어는 대량 생산되는 공산품이 아니다
  • 1.1.2 소프트웨어는 아무리 써도 닳지 않는다
  • 1.1.3 대부분의 소프트웨어는 커스텀 제품이다
  • 1.1.4 소프트웨어는 쉽게 업그레이드할 수 있어야 한다
  • 1.1.5 소프트웨어는 독립적으로 존재하지 않는다
  • 1.2 다른 전문 영역과의 비교
  • 1.2.1 예술가의 프로그래머
  • 1.2.2 건축가로서의 프로그래머
  • 1.2.3 엔지니어로서의 프로그래머
  • 1.2.4 기술 장인으로서의 프로그래머
  • 1.2.5 여러분은 예술가, 건축가, 엔지니어, 기술 장인 중 어느 쪽에 가까운가?
  • 1.3 소프트웨어 엔지니어링
  • 1.3.1 소프트웨어 엔지니어링에 대한 공식적 정의
  • 1.3.2 프로젝트의 크기
  • 1.3.3 소프트웨어 엔지니어링은 어떻게 실패하는가?
  • 1.4 소프트웨어 장인 정신
  • 1.4.1 교육
  • 1.4.2 도제식 훈련
  • 1.4.3 소프트웨어 방랑객
  • 1.4.4 고수의 경지에 오른 기술 장인
  • 1.4.5 소프트웨어 장인 정신은 어떻게 실패하는가?
  • 1.5 위대한 코드를 작성하기 위한 방법
  • 1.6 참고 자료

  • 2장. 생산성
  • 2.1 생산성이란 무엇인가?
  • 2.2 프로그래머의 생산성과 팀의 생산성 비교
  • 2.3 인시와 실제 작업 시간
  • 2.4 프로젝트의 개념적 복잡성과 실질적 복잡성
  • 2.5 생산성 예측
  • 2.6 생산성 측정 지표와 그 필요성
  • 2.6.1 실행 파일 크기 측정 지표
  • 2.6.2 머신 인스트럭션 측정 지표
  • 2.6.3 코드 라인 측정 지표
  • 2.6.4 명령문 수 측정 지표
  • 2.6.5 기능 점수 분석법
  • 2.6.6 McCabe 순환 복잡성 측정 지표
  • 2.6.7 기타 측정 지표
  • 2.6.8 측정 지표가 지닌 문제점
  • 2.7 프로그래머가 하루에 열 줄의 코드를 작성한다는 조사 결과에 대해
  • 2.8 개발 기간 예측
  • 2.8.1 소규모 프로젝트 개발 기간 예측
  • 2.8.2 중규모 및 대규모 프로젝트 개발 기간 예측
  • 2.8.3 개발 기간 예측에 따른 문제점
  • 2.9 위기 상황에서의 프로젝트 관리
  • 2.10 생산성 향상의 비법
  • 2.10.1 소프트웨어 개발 도구의 신중한 선정
  • 2.10.2 오버헤드 관리
  • 2.10.3 명확한 목표와 마일스톤 설정
  • 2.10.4 스스로 동기 부여하기
  • 2.10.5 집중력 유지와 방해 요소 제거
  • 2.10.6 지겨움을 느낄 때는 다른 일을 해보자
  • 2.10.7 스스로 발전할 수 있는 분위기를 조성하라
  • 2.10.8 도움이 필요할 때는 요청하라
  • 2.10.9 느슨해진 팀 분위기 되살리기
  • 2.11 참고 자료

  • 3장 소프트웨어 개발 모델
  • 3.1 소프트웨어 개발 수명주기
  • 3.2 소프트웨어 개발 모델
  • 3.2.1 약식 모델
  • 3.2.2 워터폴 모델
  • 3.2.3 V 모델
  • 3.2.4 반복형 모델
  • 3.2.5 나선형 모델
  • 3.2.6 신속 애플리케이션 개발 모델
  • 3.2.7 점증형 모델
  • 3.3 소프트웨어 개발 방법론
  • 3.3.1 전통적 (예측적) 방법론
  • 3.3.2 적응형 방법론
  • 3.3.3 애자일 방법론
  • 3.3.4 익스트림 프로그래밍
  • 간소한 디자인을 위한 가이드
  • 3.3.5 스크럼
  • 3.3.6 목표 기능 주도형 개발
  • 3.4 위대한 프로그래머를 위한 소프트웨어 개발 모델 및 방법론
  • 3.5 참고 자료

  • 2부 UML

  • 4장 UML의 개요와 유스 케이스
  • 4.1 UML 표준
  • 4.2 UML 유스 케이스 모델
  • 4.2.1 유스 케이스 다이어그램 요소
  • 4.2.2 유스 케이스 패키지
  • 4.2.3 유스 케이스 인클루전
  • 4.2.4 유스 케이스 일반화
  • 4.2.5 유스 케이스 익스텐션
  • 4.2.6 유스 케이스 내러티브
  • 4.2.7 유스 케이스 시나리오
  • 4.3 UML 시스템 경계 다이어그램
  • 4.4 유스 케이스 이외의 영역
  • 4.5 참고 자료

  • 5장 UML 액티비티 다이어그램
  • 5.1 UML 액티비티 상태 기호
  • 5.1.1 시작 상태와 종료 상태
  • 5.1.2 액티비티
  • 5.1.3 상태
  • 5.1.4 전환
  • 5.1.5 조건식
  • 5.1.6 합병 지점
  • 5.1.7 이벤트와 트리거
  • 5.1.8 포크 및 조인 동기화
  • 5.1.9 호출 기호
  • 5.1.10 파티션
  • 5.1.11 주석과 주해
  • 5.1.12 커넥터
  • 5.1.13 기타 액티비티 다이어그램 기호
  • 5.2 UML 액티비티 다이어그램의 확장
  • 5.3 참고 자료

  • 6장 UML 클래스 다이어그램
  • 6.1 UML에서의 객체지향 분석 및 디자인
  • 6.2 클래스 다이어그램에서의 가시성
  • 6.2.1 퍼블릭 클래스의 가시성
  • 6.2.2 프라이빗 클래스의 가시성
  • 6.2.3 프로텍티드 클래스의 가시성
  • 6.2.4 패키지 클래스의 가시성
  • 6.2.5 가시성 타입 추가하기
  • 6.3 클래스 속성 요소
  • 6.3.1 속성의 가시성
  • 6.3.2 속성에서 파생된 값
  • 6.3.3 속성 이름
  • 6.3.4 속성의 데이터 타입
  • 6.3.5 연산 데이터 타입(반환값)
  • 6.3.6 속성의 다수성 표현
  • 6.3.7 기본 속성값
  • 6.3.8 프로퍼티 문자열
  • 6.3.9 속성 문법
  • 6.4 클래스 연산 요소
  • 6.5 UML 클래스의 관련성
  • 6.5.1 클래스 의존 관계
  • 6.5.2 클래스 연관 관계
  • 6.5.3 클래스 집합 관계
  • 6.5.4 클래스 구성 관계
  • 6.5.5 클래스 관련성의 특징
  • 6.5.6 클래스 상속 관계
  • 6.6 객체
  • 6.7 참고 자료

  • 7장 UML 인터랙션 다이어그램
  • 7.1 시퀀스 다이어그램
  • 7.1.1 라이프라인
  • 7.1.2 메시지 타입
  • 7.1.3 메시지 라벨
  • 7.1.4 메시지 번호
  • 7.1.5 보호 조건
  • 7.1.6 반복 시행
  • 7.1.7 롱 딜레이 및 시간 제약 조건
  • 7.1.8 외부 객체
  • 7.1.9 액티베이션 바
  • 7.1.10 브랜칭
  • 7.1.11 대체 흐름
  • 7.1.12 객체 생성 및 제거
  • 7.1.13 시퀀스 프래그먼트
  • 7.2 커뮤니케이션 다이어그램
  • 7.3 참고 자료

  • 8장 그 외 다양한 UML 다이어그램
  • 8.1 컴포넌트 다이어그램
  • 8.2 패키지 다이어그램
  • 8.3 배포 다이어그램
  • 8.4 결합 구조 다이어그램
  • 8.5 스테이트차트 다이어그램
  • 8.6 UML에 대한 관심의 확장
  • 8.7 참고 자료

  • 3부 문서화

  • 9장 시스템 문서화
  • 9.1 시스템 문서화 유형
  • 9.2 변경 이력 추적 기능
  • 9.2.1 개발자 문서에 추적 기능 적용하기
  • 9.2.2 태그 형식
  • 9.2.3 요구 사항 이력 추적 매트릭스
  • 9.3 검증, 검토, 확인
  • 9.4 문서화를 통한 개발 비용 절감
  • 9.4.1 사용자 니즈 검증을 통한 비용 절감
  • 9.4.2 요구 사항 부합 여부 검토를 통한 비용 절감
  • 9.5 참고 자료

  • 10장 요구 사항 문서화
  • 10.1 요구 사항의 근원과 추적 가능성
  • 10.1.1 요구 사항 형식 권장안
  • 10.1.2 우수한 요구 사항의 특징
  • 10.2 디자인 목표
  • 10.3 시스템 요구 사항 명세서
  • 10.4 소프트웨어 요구 사항 명세서
  • 10.4.1 서론
  • 10.4.2 전반적 설명
  • 10.4.3 세부적 요구 사항
  • 10.4.4 각종 지원 정보
  • 10.4.5 소프트웨어 요구 사항 명세서 예시
  • 10.5 요구 사항 작성하기
  • 10.6 유스 케이스
  • 10.6.1 디버그 모드 활성화/비활성화
  • 10.6.2 Ethernet 활성화/비활성화
  • 10.6.3 RS-232 활성화/비활성화
  • 10.6.4 테스트 모드 활성화/비활성화
  • 10.6.5 USB 활성화/비활성화
  • 10.6.6 DIP 스위치 읽기
  • 10.7 유스 케이스를 DAQ 소프트웨어 요구 사항으로 작성하기
  • 10.8 SRS에 기초한 DAQ 소프트웨어 요구 사항 작성
  • 10.9 요구 사항 정보를 이용한 RTM 업데이트
  • 10.9.1 리뷰에 의한 요구 사항 검증
  • 10.9.2 테스트에 의한 요구 사항 검증
  • 10.10 참고 자료

  • 11장 소프트웨어 디자인 명세서 문서화
  • 11.1 IEEE Std 1016-1998 vs IEEE Std 1016-2009
  • 11.2 IEEE 1016-2009 개념 모델
  • 11.2.1 디자인 고려 사항과 디자인 업무 참여자
  • 11.2.2 디자인 뷰포인트와 디자인 요소
  • 11.2.3 디자인 뷰, 디자인 오버레이, 디자인 래셔널
  • 11.2.4 IEEE Std 1016-2009 개념 모델
  • 11.3 SDD 필수 콘텐츠
  • 11.3.1 SDD 식별 정보
  • 11.3.2 디자인 작업 참여자와 디자인 고려 사항
  • 11.3.3 디자인 뷰, 뷰포인트, 오버레이, 래셔널
  • 11.4 SDD 추적 가능성 및 태그
  • 11.5 SDD 개요 제안
  • 11.6 SDD 작성 예시
  • 11.7 디자인 정보를 이용한 RTM 업데이트
  • 11.8 소프트웨어 디자인 문서의 작성
  • 11.9 참고 자료

  • 12장 소프트웨어 테스트 문서화
  • 12.1 Std 829 표준안의 소프트웨어 테스트 문서
  • 12.1.1 테스트 프로세스 지원
  • 12.1.2 중요도 레벨과 위험도 평가
  • 12.1.3 소프트웨어 개발 테스트 레벨
  • 12.2 테스트 계획
  • 12.2.1 마스터 테스트 계획
  • 12.2.2 레벨 테스트 계획
  • 12.2.3 레벨 테스트 디자인 문서화
  • 12.3 소프트웨어 리뷰 리스트 문서화
  • 12.3.1 SRL 문서 개요 작성 예시
  • 12.3.2 SRL 작성 예시
  • 12.3.3 RTM에 SRL 아이템 추가하기
  • 12.4 소프트웨어 테스트 케이스 문서화
  • 12.4.1 STC 문서의 서론부
  • 12.4.2 세부 사항
  • 12.4.3 범례
  • 12.4.4 소프트웨어 테스트 케이스 작성 예시
  • 12.4.5 STC 정보를 이용한 RTM 업데이트
  • 12.5 소프트웨어 테스트 프로시저 문서화
  • 12.5.1 IEEE Std 829-2009 소프트웨어 테스트 프로시저
  • 12.5.2 STP 문서 개요의 확장
  • 12.5.3 STP 문서의 서론부
  • 12.5.4 테스트 프로시저
  • 12.5.5 범례
  • 12.5.6 색인
  • 12.5.7 STP 작성 예시
  • 12.5.8 STP 정보로 RTM 업데이트하기
  • 12.6 레벨 테스트 로그
  • 12.6.1 레벨 테스트 로그 문서의 서론부
  • 12.6.2 세부 사항
  • 12.6.3 용어 설명
  • 12.6.4 테스트 로그에 대한 몇 가지 의견
  • 12.7 문제점 보고서
  • 12.7.1 문제점 보고서의 서론부
  • 12.7.2 세부 사항
  • 12.7.3 문제점 보고서에 대한 몇 가지 의견
  • 12.8 테스트 보고서
  • 12.8.1 마스터 테스트 보고서 개요
  • 12.8.2 레벨 테스트 보고서
  • 12.9 여러분에게 정말로 필요한 개발자 문서는 무엇인가?
  • 12.10 참고 자료

  • 후기: 위대한 코드 설계하기

도서 오류 신고

도서 오류 신고

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

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

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