프로그래밍 언어의 기본을 익힌 독자를 대상으로 하는 책으로, 소프트웨어의 품질을 결정짓는 여러 가지 기준과 그 기준에 부합하는 소프트웨어를 개발하는 방법을 예제 바탕으로 설명한다. 더 나아가, 품질 기준 사이에 필연적인 충돌이 있음을 이해하고, 이러한 기회비용을 어떻게 다뤄야 할지 생각해볼 기회를 제공한다.
Contents
1부. 먼저 알아야 할 것들
1장. 소프트웨어 품질과 앞으로 풀어야 할 문제
1.1 소프트웨어 품질
1.1.1 내적 품질과 외적 품질
1.1.2 기능적 품질과 비기능적 품질
1.2 외적 소프트웨어 품질에 가까운 기준들
1.2.1 정확성
1.2.2 견고성
1.2.3 사용성
1.2.4 효율성
1.3 내적 소프트웨어 품질에 가까운 기준들
1.3.1 가독성
1.3.3 테스트 용이성
1.3.4 유지보수성
1.4 소프트웨어 품질 기준 사이의 상호작용
1.5 특수한 품질
1.5.1 스레드 안전성
1.5.2 간결성
1.6 앞으로 살펴볼 예제: 수조 시스템
1.6.1 API
1.6.2 활용 사례
1.7 데이터 모델과 데이터 표현
1.7.1 물의 양 저장하기
1.7.2 연결 상태 저장하기
1.8 Hello containers! [Novice]
1.8.1 필드와 생성자
1.8.2 getAmount와 addWater 메서드
1.8.3 connectTo 메서드
요약
더 읽을거리
2장. 레퍼런스 구현
2.1 레퍼런스 코드 [Reference]
2.1.1 메모리 레이아웃 다이어그램
2.1.2 메서드
2.2 메모리 요구 사항
2.2.1 Reference의 메모리 요구량
2.3 시간 복잡도
2.3.1 Reference의 시간 복잡도
2.4 배운 내용 연습하기
요약
퀴즈와 연습 문제 정답
더 읽을거리
2부. 소프트웨어 품질
3장. 질주 본능: 시간 효율성
3.1 상수 시간에 물 넣기 [Speed1]
3.1.1 시간 복잡도
3.2 상수 시간에 연결 추가하기 [Speed2]
3.2.1 순환 리스트로 그룹 표현하기
3.3.2 갱신 지연
3.3 최적의 균형: 합집합 찾기 알고리즘 [Speed3]
3.3.1 그룹 대표 찾기
3.3.2 수조의 트리 연결하기
3.3.3 최악의 경우의 시간 복잡도
3.3.4 분할상환 시간 복잡도
3.3.5 크기가 변하는 배열을 이용할 경우의 분할상환 분석
3.4 구현 방식 비교하기
3.4.1 실험
3.4.2 이론 대 실제
3.5 전혀 새로운 문제에 적용해보기
3.5.1 빠른 삽입
3.5.2 빠른 조회
3.5.3 모든 것을 빠르게
3.6 실제 사례
3.7 배운 내용 적용해보기
요약
퀴즈와 연습문제 해답
더 읽을거리
4장. 소중한 메모리: 공간 효율성
4.1 검소한 버전 [Memory1]
4.1.1 공간 및 시간 복잡도
4.2 일반 배열 [Memory2]
4.2.1 공간 및 시간 복잡도
4.3 객체여, 안녕 [Memory3]
4.3.1 객체를 사용하지 않는 API
4.3.2 필드와 getAmount 메서드
4.3.3 팩토리 메서드로 수조 생성하기
4.3.4 ID로 수조 연결하기
4.3.5 공간 및 시간 복잡도
4.4 블랙홀 [Memory4]
4.4.1 공간 및 시간 복잡도
4.5 공간 - 시간 기회비용
4.6 전혀 새로운 문제에 적용해보기
4.6.1 중복이 적을 때
4.6.2 중복이 많을 때
4.7 실제 사례
4.8 배운 내용 적용해보기
요약
퀴즈와 연습문제 해답
더 읽을거리
5장. 모니터링을 이용한 신뢰성 향상
5.1 계약에 의한 설계
5.1.1 사전 조건과 사후 조건
5.1.2 불변 조건
5.1.3 정확성과 견고성
5.1.4 계약 검사
5.1.5 더 큰 그림
5.2 계약을 바탕으로 수조 설계하기
5.3 계약을 검사하는 수조 [Contracts]
5.3.1 addWater의 계약 검사하기
5.3.2 connectTo의 계약 검사하기
5.4 불변 조건을 검사하는 수조 [Invariants]
5.4.1 connectTo에서 불변 조건 검사하기
5.4.2 addWater 불변 조건 검사
5.5 전혀 새로운 문제에 적용해보기
5.5.1 계약
5.5.2 기본 구현
5.5.3 계약 검사
5.5.4 불변 조건 검사
5.6 실제 사례
5.7 배운 내용 적용해보기
요약
퀴즈와 연습문제 해답
더 읽을거리
6장. 나를 속여봐: 테스트를 이용한 신뢰성 향상
6.1 테스트의 기본적 개념
6.1.1 테스트 커버리지
6.1.2 테스트와 계약에 의한 설계
6.1.3 JUnit
6.2 수조 테스트하기 [UnitTests]
6.2.1 테스트 초기화하기
6.2.2 addWater 테스트하기
6.2.3 connectTo 테스트하기
6.2.4 테스트 수행
6.2.5 커버리지 측정
6.3 테스트 용이성 [Testable]
6.3.1 제어 가능성
6.3.2 관측 가능성
6.3.3 고립하기: 의존성 제공
6.4 전혀 새로운 문제에 적용해보기
6.4.1 테스트 용이성 개선
6.4.2 테스트 슈트
6.5 실제 사례
6.6 배운 내용 적용해보기
요약
퀴즈와 연습문제 해답
더 읽을거리
7장. 큰소리로 코딩하자: 가독성
7.1 가독성을 바라보는 관점
7.1.1 기업 코딩 스타일 가이드
7.1.2 가독성의 재료
7.2 구조적 가독성 특징
7.2.1 제어 흐름 구문
7.2.2 표현식과 지역 변수
7.3 외부적 가독성 특징
7.3.1 주석
7.3.2 이름 짓기
7.3.3 공백과 들여쓰기
7.4 가독성 높은 수조 [Readable]
7.4.1 자바독을 이용한 클래스 헤더 문서화
7.4.2 connectTo 정리하기
7.4.3 addWater 정리하기
7.5 가독성에 대한 마지막 고찰
7.6 전혀 새로운 문제에 적용해보기
7.7 실제 사례
7.8 배운 내용 적용해보기
요약
퀴즈와 연습문제 해답
더 읽을거리
8장. 스레드 안전성
8.1 스레드 안전성 달성의 어려움
8.1.1 동시성 레벨
8.1.2 수조 시스템의 동시성 정책
8.2 교착 상태 다루기
8.2.1 원자적 락 시퀀스
8.2.2 순서 있는 락 시퀀스
8.2.3 숨은 경합 조건
8.3 스레드 안전한 수조 [ThreadSafe]
8.3.1 connectTo 동기화
8.3.2 addWater와 getAmount 동기화
8.4 불변성 [Immutable]
8.4.1 API
8.4.2 구현
8.5 전혀 새로운 문제에 적용해보기
8.6 실제 사례
8.7 배운 내용 적용해보기
요약
퀴즈와 연습문제 해답
더 읽을거리
9장. 재활용합시다: 재사용성
9.1 경계 찾기
9.2 일반적인 프레임워크
9.2.1 속성 관리 API
9.2.2 가변 컬렉터
9.2.3 함수형 인터페이스를 컨테이너 속성에 적용하기
9.3 제네릭 컨테이너 구현
9.4 일반적인 고려사항
9.5 수조의 기능 재현하기 [Generic]
9.5.1 수정된 시나리오
9.5.2 구체적인 속성 설계
9.5.3 구체적인 수조 클래스 정의
9.6 소셜 네트워크 포스트
9.7 전혀 새로운 문제에 적용해보기
9.7.1 파라미터화된 함수를 표현하는 인터페이스
9.7.2 통신 방식 개선
9.8 실제 사례
9.9 배운 내용 적용해보기
요약
퀴즈와 연습문제 해답
더 읽을거리
부록 A. 코드 골프: 간결성
부록 B. 궁극의 수조 클래스
Author
마르코 파엘라,최광민
이탈리아 네이플스 페데리코 II 대학 조교수로 재임 중이다. 그의 연구 분야는 컴퓨터과학이지만 열정적인 강사이자 프로그래머이기도 하다. 지난 13년 동안 고급 프로그래밍 강의를 해왔고 자바 자격증 참고서를 출간했으며 자바 스트림 영상 강의도 만들었다.
이탈리아 네이플스 페데리코 II 대학 조교수로 재임 중이다. 그의 연구 분야는 컴퓨터과학이지만 열정적인 강사이자 프로그래머이기도 하다. 지난 13년 동안 고급 프로그래밍 강의를 해왔고 자바 자격증 참고서를 출간했으며 자바 스트림 영상 강의도 만들었다.