파이썬 객체지향 프로그래밍 4/e [다각도로 살펴보는 OOP 시스템]
- 원서명Python Object-Oriented Programming: Build robust and maintainable object-oriented Python applications and libraries, 4th Edition (ISBN 9781801077262)
- 지은이스티븐 로트(Steven F. Lott), 더스티 필립스(Dusty Phillips)
- 옮긴이김우현
- ISBN : 9791161756547
- 43,000원
- 2022년 06월 30일 펴냄
- 페이퍼백 | 820쪽 | 188*235mm
- 시리즈 : 프로그래밍 언어
책 소개
소스 코드 파일은 여기에서 내려 받으실 수 있습니다.
https://github.com/AcornPublishing/python-oop-4e
요약
객체지향의 기본 개념부터 시작해 객체지향 디자인을 포괄적으로 다룬다. 타입 힌트를 사용하는 방법, 클래스들 간의 다양한 관계를 활용해야 할 시기와 방법, 추상화 및 파이썬 데이터 구조를 통해 디자인을 단순화할 수 있는 기법, 빠르고 효율적인 파이썬의 내장 컬렉션을 다루는 이터레이터 패턴, 그리고 12가지 고급 디자인 패턴으로 견고한 애플리케이션을 개발하는 방법 등을 훌륭한 예제로 배울 수 있다. 또한 파이썬 애플리케이션을 자동화된 단위 테스트 모듈과 모의 객체를 사용해 쉽게 테스트할 수 있는 고급 테스트 기법도 배울 수 있다. 마지막으로 객체지향 디자인을 활용해 동시성 프로그래밍 기술을 사용하는 방법을 보여준다.
이 책에서 다루는 내용
◆ 클래스 생성 및 메서드 정의를 통한 파이썬 객체 구현
◆ 상속을 사용한 클래스 기능 확장
◆ 예외를 사용한 비정상적인 상황 처리
◆ 객체지향 기능을 사용해야 할 때와 사용하지 말아야 할 때에 대한 이해
◆ 널리 사용되는 몇 가지 디자인 패턴과 구현
◆ 단위 및 통합 테스트의 단순성 발견 및 테스트의 중요성
◆ 동적 코드에 대한 정적 타입 체크 방법
◆ asyncio를 이용한 동시성 프로그래밍 및 프로그램 속도 향상 방법
이 책의 대상 독자
이 책은 파이썬의 객체지향 프로그래밍을 처음 접하는 독자를 대상으로 한다. 파이썬에 대한 기초 지식이 있다고 가정한다. 다른 객체지향 프로그래밍 언어에 대한 배경 지식이 있는 독자를 위해 파이썬의 접근 방식이 갖는 독특한 특징을 설명할 것이다.
데이터 과학 및 데이터 분석에서 파이썬을 많이 사용하기 때문에 관련 수학과 통계 개념도 다룬다. 이 분야의 지식은 개념을 보다 구체적으로 적용하는 데 도움이 될 수 있다.
이 책의 구성
이 책은 전체적으로 네 부분으로 구성돼 있다. 처음 여섯 개의 장은 객체지향 프로그래밍의 핵심 원리와 개념을 설명하며 파이썬에서 이 개념들이 어떻게 구현되는지를 설명한다. 다음 세 개의 장에서는 객체지향 프로그래밍의 렌즈를 통해 파이썬 내장 기능을 자세히 살펴본다. 10장, 11장, 12장에서는 여러 가지 디자인 패턴과 이것을 파이썬에서 처리하는 방법을 살펴본다. 마지막 부분에서는 테스트와 동시성을 다룬다.
1장 ‘객체지향 디자인’에서는 객체지향 디자인의 기초가 되는 핵심 개념을 소개한다. 상태와 동작, 속성과 메서드, 객체를 클래스로 그룹화하는 방법 등에 대한 아이디어를 통해 로드맵을 제공한다. 캡슐화, 상속 및 구성 관계도 살펴볼 것이다. 사례 연구에서는 k-최근접 이웃(k-NN, k-Nearest Neighbors) 분류기를 구현하는 머신러닝 문제를 소개한다.
2장 ‘파이썬의 객체’에서는 파이썬에서 클래스 정의가 어떻게 동작하는지 보여준다. 여기에는 타입 힌트(type hints)라고 불리는 타입 주석(type annotations), 클래스 정의, 모듈, 패키지 등이 포함된다. 클래스 정의 및 캡슐화에 대한 실무적인 고려사항을 알려준다. 사례 연구에서는 k-NN 분류기의 일부 클래스를 구현해본다.
3장 ‘객체가 유사한 경우’에서는 클래스들이 서로 어떻게 연관돼 있는지 설명한다. 여기에는 상속 및 다중 상속의 사용법이 포함된다. 클래스 계층 구조에서 클래스 간의 다형성 개념을 살펴볼 것이다. 사례 연구에서는 가장 가까운 이웃을 찾는 데 사용되는 거리 계산을 위한 몇 가지 디자인을 살펴볼 것이다.
4장, ‘예상치 못한 상황을 예상하기’에서는 파이썬의 예외와 예외 처리에 대해 자세히 살펴본다. 내장 예외의 계층 구조도 다룬다. 또한 고유한 문제 도메인이나 애플리케이션을 반영하기 위해 고유한 예외를 정의하는 방법도 살펴볼 것이다. 사례 연구에서는 데이터 유효성 검사에 예외를 적용한다.
5장 ‘객체지향 프로그래밍의 사용 시기’에서는 디자인 기법에 대해 더 깊이 있게 다룬다. 이 장에서는 파이썬에서 프로퍼티(property)를 사용해 속성(attribute)을 구현하는 방법을 살펴볼 것이다. 또한 객체들의 컬렉션을 다루기 위한 관리자 객체의 일반적인 개념을 살펴본다. 사례 연구에서는 이런 아이디어를 적용해 k-NN 분류기를 폭넓게 구현한다.
6장 ‘추상 기본 클래스와 연산자 오버로딩’에서는 추상화에 대한 개념과 파이썬이 추상 기본 클래스를 지원하는 방법에 대해 깊이 있게 다룬다. 여기에는 공식적인 Protocol 정의 메소드와 덕 타이핑(duck typing)을 비교하는 것이 포함된다. 또한 파이썬의 내장 연산자를 오버로드하는 기법도 포함된다. 메타클래스와 이를 사용해 클래스 구조를 수정하는 방법도 살펴볼 것이다. 사례 연구에서는 추상화를 조심스럽게 사용해 디자인을 단순화하는 방법을 보여주기 위해 기존 클래스 중 일부를 재정의할 것이다.
7장, ‘파이썬 데이터 구조’에서는 다양한 파이썬 내장 컬렉션을 살펴볼 것이다. 이 장에서는 튜플, 딕셔너리, 리스트, 집합 등을 다룬다. 또한 데이터클래스와 명명된 튜플이 클래스의 여러 공통 기능을 제공함으로써 어떻게 디자인을 단순화 할 수 있는지 살펴본다. 사례 연구에서는 이런 새로운 기술을 사용하기 위해 이전의 일부 클래스 정의를 수정할 것이다.
8장 ‘객체지향과 함수형 프로그래밍의 교차점’에서는 클래스 정의가 아닌 파이썬 구조체(construct)를 살펴본다. 파이썬의 모든 것이 객체지향적이지만 함수 정의를 사용하면 클래스 정의의 복잡성을 피해 호출 가능한 객체를 생성할 수 있다. 또한 파이썬의 컨텍스트 관리자 구조체와 with 문을 살펴볼 것이다. 사례 연구에서는 클래스 복잡성을 피하는 대안적인 디자인을 살펴볼 것이다.
9장 ‘문자열, 직렬화, 파일 경로’에서는 객체를 문자열로 직렬화하는 방법과 문자열을 파싱해 객체를 생성하는 방법을 다룬다. 여기서는 Pickle, JSON, CSV 등을 포함한 여러 형식을 살펴볼 것이다. 사례 연구에서는 k-NN 분류기가 샘플 데이터를 로드하고 처리하는 방법을 다시 살펴본다.
10장 ‘이터레이터 패턴’에서는 반복 처리에 대한 파이썬의 보편적인 개념을 설명한다. 모든 내장 컬렉션은 반복 가능하며, 이 디자인 패턴은 파이썬 동작에서 핵심을 차지한다. 파이썬의 컴프리헨션(comprehension)과 제너레이터(generator) 함수도 살펴볼 것이다. 사례 연구에서는 제너레이터 표현식과 리스트 컴프리헨션을 사용해 학습 및 테스트 샘플을 분할하는 이전 디자인을 다시 살펴본다.
11장 ‘일반 디자인 패턴’에서는 몇 가지 일반적인 객체지향 디자인을 살펴본다. 여기에는 데코레이터(Decorator), 옵저버(Observer), 전략(Strategy), 커맨드(Command), 상태(State), 싱글톤(Singleton) 디자인 패턴이 포함된다.
12장 ‘고급 디자인 패턴’에서는 좀 더 발전된 객체지향 디자인을 살펴본다. 여기에는 어댑터(Adapter), 퍼사드(Façade), 플라이웨이트(Flyweight), 추상 팩토리(Abstract Factory), 컴포짓(Composite), 템플릿(Template) 패턴이 포함된다.
13장 ‘객체지향 프로그램 테스트’에서는 unittest와 pytest를 사용해 파이썬 애플리케이션을 위한 자동화된 단위 테스트 스위트를 제공하는 방법을 보여준다. 이를 통해 모의 객체를 사용해 테스트할 때 단위를 분리하는 것과 같은 고급 테스트 기법을 살펴볼 수 있다. 사례 연구에서는 3장에서 다뤘던 거리 계산에 대해서 테스트 케이스를 작성하는 것을 보여준다.
14장 ‘동시성’에서는 멀티코어 및 멀티프로세서 컴퓨터 시스템을 사용해 신속하게 계산을 수행하고 외부 이벤트에 응답하는 소프트웨어를 작성하는 방법을 살펴본다. 스레드와 멀티프로세싱뿐만 아니라 파이썬의 asyncio 모듈도 살펴볼 것이다. 사례 연구에서는 k-NN 모델에서 하이퍼파라미터 튜닝을 수행하기 위해 이런 기술을 사용하는 방법을 보여줄 것이다.
목차
목차
- 01장 객체지향 디자인
- 객체지향 소개
- 객체와 클래스
- 속성과 동작 지정
- 객체 상태를 설명하는 데이터
- 동작은 행위이다
- 정보 은닉과 공용 인터페이스 생성
- 구성 관계
- 상속
- 추상화를 제공하는 상속
- 다중 상속
- 사례 연구
- 문제 개요
- 컨텍스트 뷰
- 논리 뷰
- 프로세스 뷰
- 개발 뷰
- 물리 뷰
- 결론
- 정리
- 연습
- 요약
- 02장 파이썬의 객체
- 타입 힌트 소개
- 타입 검사
- 파이썬 클래스 생성
- 속성 추가
- 동작 추가
- 객체 초기화
- 타입 힌트와 기본 인수
- 독스트링을 이용한 코드 설명
- 모듈과 패키지
- 모듈 조직화
- 모듈 내에서의 코드 조직화
- 데이터 액세스 제어
- 써드파티 라이브러리
- 사례 연구
- 논리 뷰
- 샘플과 그 상태
- 샘플의 상태 전환
- 클래스 책임
- TrainingData 클래스
- 정리
- 연습
- 요약
- 타입 힌트 소개
- 03장 객체가 유사한 경우
- 기본 상속
- 내장 클래스 확장
- 재정의와 super
- 다중 상속
- 다이아몬드 문제
- 다양한 인수 집합
- 다형성
- 사례 연구
- 논리 뷰
- 또 다른 거리 계산법
- 정리
- 연습
- 요약
- 기본 상속
- 04장 예상치 못한 상황을 예상하기
- 예외 발생
- 예외 발생시키기
- 예외의 영향
- 예외 처리
- 예외 계층
- 자체적인 예외 정의
- 예외는 예외적인 것이 아니다
- 사례 연구
- 컨텍스트 뷰
- 프로세스 뷰
- 무엇이 잘못될 수 있는가?
- 잘못된 동작
- CSV 파일로부터 샘플 만들기
- 열거형 값 검증
- CSV 파일 읽기
- 중복 배제
- 정리
- 연습
- 요약
- 예외 발생
- 05장 객체지향 프로그래밍의 사용 시기
- 객체를 객체로 다루기
- 프로퍼티로 클래스 데이터에 동작 추가
- 프로퍼티 자세히 보기
- 데코레이터 - 프로퍼티를 만드는 또 다른 방법
- 프로퍼티를 사용해야 할 때
- 관리자 객체
- 중복 코드 제거
- 실전
- 사례 연구
- 입력 데이터 검증
- 입력 데이터 분할
- Sample 클래스 계층
- purpose 열거
- 프로퍼티 세터
- 반복되는 if 문
- 정리
- 연습
- 요약
- 06장 추상 기본 클래스와 연산자 오버로딩
- 추상 기본 클래스 만들기
- collections의 ABC
- 추상 기본 클래스와 타입 힌트
- collections.abc 모듈
- 자체적인 추상 기본 클래스 만들기
- 마법 파헤치기
- 연산자 오버로딩
- 내장 컬렉션 확장
- 메타클래스
- 사례 연구
- 두 개의 하위 리스트로 리스트 클래스 확장
- 분할을 위한 셔플링 전략
- 분할을 위한 증분 전략
- 정리
- 연습
- 요약
- 추상 기본 클래스 만들기
- 07장 파이썬 데이터 구조
- 빈 객체
- 튜플과 명명된 튜플
- typing.NamedTuple을 사용한 명명된 튜플
- 데이터클래스
- 딕셔너리
- 딕셔너리 유스 케이스
- defaultdict 사용
- 리스트
- 리스트 정렬
- 집합
- 세 가지 타입의 큐
- 사례 연구
- 논리 모델
- 고정된 데이터클래스
- NamedTuple 클래스
- 결론
- 정리
- 연습
- 요약
- 08장 객체지향과 함수형 프로그래밍의 교차점
- 파이썬 내장 함수
- len() 함수
- reversed() 함수
- enumerate() 함수
- 메서드 오버로딩의 대안
- 매개변수의 기본값
- 가변 인수 리스트
- 인수 언패킹
- 함수도 객체다
- 함수 객체와 콜백
- 함수를 사용한 클래스 패치
- 호출 가능한 객체
- 파일 입출력
- 컨텍스트에 배치
- 사례 연구
- 프로세스 개요
- 데이터 분할
- 분류 재고찰
- partition() 함수
- 한 번에 분할하기
- 정리
- 연습
- 요약
- 파이썬 내장 함수
- 09장 문자열, 직렬화, 파일 경로
- 문자열
- 문자열 조작
- 문자열 포맷팅
- 문자열은 유니코드이다
- 정규표현식
- 패턴 매칭
- 정규표현식으로 정보 파싱
- 파일시스템 경로
- 객체 직렬화
- 사용자 정의 피클
- JSON을 사용한 객체 직렬화
- 사례 연구
- CSV 포맷 디자인
- CSV 딕셔너리 리더
- CSV 리스트 리더
- JSON 직렬화
- 줄바꿈으로 구분된 JSON
- JSON 유효성 검사
- 정리
- 연습
- 요약
- 문자열
- 10장 이터레이터 패턴
- 디자인 패턴이란
- 이터레이터
- 이터레이터 프로토콜
- 컴프리헨션
- 리스트 컴프리헨션
- 집합 및 딕셔너리 컴프리헨션
- 제너레이터 표현식
- 제너레이터 함수
- 다른 이터러블로부터 항목 산출
- 제너레이터 스택
- 사례 연구
- 집합 빌더에 대한 배경지식
- 다중 분할
- 테스트
- k-NN 필수 알고리듬
- bisect 모듈을 사용하는 k-NN
- heapq 모듈을 사용하는 k-NN
- 결론
- 정리
- 연습
- 요약
- 11장 일반 디자인 패턴
- 데코레이터 패턴
- 데코레이터 패턴 예제
- 파이썬의 데코레이터 패턴
- 옵저버 패턴
- 옵저버 패턴의 예
- 전략 패턴
- 전략 패턴의 예
- 파이썬의 전략 패턴
- 커맨드 패턴
- 커맨드 패턴의 예
- 상태 패턴
- 상태 패턴의 예
- 상태 패턴 대 전략 패턴
- 싱글톤 패턴
- 싱글톤 구현
- 사례 연구
- 정리
- 연습
- 요약
- 데코레이터 패턴
- 12장 고급 디자인 패턴
- 어댑터 패턴
- 어댑터 패턴의 예
- 퍼사드 패턴
- 퍼사드 패턴의 예
- 플라이웨이트 패턴
- 파이썬에서 플라이웨이트 패턴의 예
- 여러 메시지를 갖는 버퍼
- 파이썬의 slots 를 이용한 메모리 최적화
- 추상 팩토리 패턴
- 추상 팩토리 패턴의 예
- 파이썬의 추상 팩토리 패턴
- 컴포짓 패턴
- 컴포짓 패턴의 예
- 템플릿 패턴
- 템플릿 패턴의 예
- 사례 연구
- 정리
- 연습
- 요약
- 어댑터 패턴
- 13장 객체지향 프로그램 테스트
- 왜 테스트를 해야 하는가
- 테스트 주도 개발
- 테스트 목표
- 테스트 패턴
- unittest로 단위 테스트하기
- pytest로 단위 테스트하기
- pytest의 설정 및 해제 기능
- 설정 및 해제를 위한 pytest 픽스쳐
- 더 정교한 픽스쳐
- pytest에서 테스트 건너뛰기
- Mock을 사용한 객체 모방
- 추가 패치 기법
- 센티넬 객체
- 얼마나 해야 충분한 테스트인가?
- 테스트와 개발
- 사례 연구
- 거리 계산 알고리듬 단위 테스트
- Hyperparameter 클래스 단위 테스트
- 정리
- 연습
- 요약
- 왜 테스트를 해야 하는가
- 14장 동시성
- 동시 처리에 대한 배경지식
- 스레드
- 스레드의 많은 문제
- 멀티프로세싱
- 멀티프로세싱 풀
- 큐
- 멀티프로세싱의 문제점
- Futures
- AsyncIO
- AsyncIO 실전
- AsyncIO future 읽기
- 네트워킹을 위한 AsyncIO
- 로그 작성 데모
- AsyncIO 클라이언트
- 식사하는 철학자들 벤치마크
- 사례 연구
- 정리
- 연습
- 요약