파이썬 프로그래밍: 컴퓨터 과학 소개
이 책은 파이썬을 주요 프로그래밍 언어로 사용하여 컴퓨터 과학의 기본 원리를 가르치는 대학 수준의 입문 교재입니다. 문제 해결, 설계 및 프로그래밍을 스파이럴 커버리지 모델과 그래픽 중심 접근 방식을 통해 중심적으로 다룹니다.
강좌 개요
📚 콘텐츠 요약
이것은 파이썬을 주요 프로그래밍 언어로 사용하여 컴퓨터 과학의 기본 원리를 가르치는 대학 수준의 입문 교과서입니다. 문제 해결, 설계, 프로그래밍을 나선형 커버리지 모델과 그래픽 중심 접근 방식으로 다룹니다.
파이썬을 통한 컴퓨터 과학 예술에 대한 부드럽고 종합적인 소개.
저자: 존 M. 제일
감사의 말: 구도 반 로수엄 (서문), 지ม 레이시, 워터버그 칼리지 및 오웬 아스트라찬, 케이 호스트만, 넬 델 등 다양한 대학의 학문적 동료들.
🎯 학습 목표
- 하드웨어/소프트웨어와 알고리즘/프로그램을 구분할 수 있다.
- 파이썬 인터프리터가 고급 코드를 바이트코드를 통해 실행 가능한 명령어로 변환하는 방식을 설명할 수 있다.
- 매개변수와 인자를 사용하여 간단한 파이썬 함수를 정의하고 호출할 수 있다.
- 소프트웨어 개발 과정의 여섯 단계를 나열하고 설명할 수 있다.
- 파이썬 문법 규칙을 적용하여 유효한 식별자와 연산자 우선순위가 올바른 수학식을 만들 수 있다.
- "상자" 모델과 "스티커 노트" 변수 모델의 차이를 구분하고 평가 및 할당 과정을 설명할 수 있다.
int와float데이터 타입의 차이를 구분하며 명시적 형 변환을 적용할 수 있다.- 누산기 패턴을 활용하여 순열과 같은 수학 문제를 해결할 수 있다.
- 파이썬
math라이브러리를 사용하여 대수 방정식, 특히 이차방정식을 해결할 수 있다. - 객체 지향 프로그래밍의 핵심 개념: 객체, 메서드, 액세서, 머테이터, 별칭을 정의하고 적용할 수 있다.
🔹 수업 1: 컴퓨터 과학과 파이썬 기초 소개
개요: 본 수업에서는 컴퓨터 과학을 단순히 물리적 기계를 연구하는 것이 아니라 계산 가능한 과정을 연구하는 것으로 소개합니다. 학생들은 '보편적 기계' 개념을 탐구하며, 소프트웨어가 하드웨어를 상상할 수 있는 모든 도구로 전환할 수 있는 힘을 제공한다는 점을 이해합니다. 세션은 파이썬의 기본 사항에 대한 기술적 소개로 마무리되며, 인터프리터 기반 실행 방식, 함수 정의, 그리고 문법과 의미의 차이점을 다룹니다.
학습 결과:
- 하드웨어/소프트웨어와 알고리즘/프로그램을 구분할 수 있다.
- 파이썬 인터프리터가 고급 코드를 바이트코드를 통해 실행 가능한 명령어로 변환하는 방식을 설명할 수 있다.
- 매개변수와 인자를 사용하여 간단한 파이썬 함수를 정의하고 호출할 수 있다.
🔹 수업 2: 소프트웨어 개발 과정과 간단한 프로그램
개요: 본 수업에서는 여섯 단계로 구성된 체계적인 소프트웨어 개발 과정과 파이썬 프로그래밍의 기본 블록을 소개합니다. 학생들은 식별자, 표현식, 할당 등의 기본 문법을 탐구하며, '스티커 노트' 변수 모델과 전통적인 개념을 비교합니다. 수업은 range() 함수를 사용한 확정적 루프를 구현하여 반복 계산을 처리하는 것으로 마무리됩니다.
학습 결과:
- 소프트웨어 개발 과정의 여섯 단계를 나열하고 설명할 수 있다.
- 파이썬 문법 규칙을 적용하여 유효한 식별자와 연산자 우선순위가 올바른 수학식을 만들 수 있다.
- "상자" 모델과 "스티커 노트" 변수 모델의 차이를 구분하고 평가 및 할당 과정을 설명할 수 있다.
🔹 수업 3: 숫자 데이터 표현과 수학 라이브러리
개요: 본 수업에서는 컴퓨터가 숫자 데이터를 어떻게 표현하고 조작하는지 탐구하며, 이산적인 정수와 실수의 근사값(부동소수점)을 구분합니다. 학생들은 파이썬 내장 연산자와 math 라이브러리를 사용하여 복잡한 계산을 수행하며, 이진 표현과 정밀도의 한계를 이해하게 됩니다.
학습 결과:
int와float데이터 타입의 차이를 구분하고 명시적 형 변환을 적용할 수 있다.- 누산기 패턴을 활용하여 순열과 같은 수학 문제를 해결할 수 있다.
- 파이썬
math라이브러리를 사용하여 대수 방정식, 특히 이차방정식을 해결할 수 있다.
🔹 수업 4: 객체 지향 그래픽과 인터랙티브 GUI
개요: 본 수업에서는 텍스트 기반 프로그래밍에서 그래픽 사용자 인터페이스(GUI)로 전환하며 객체 지향(ОО) 접근 방식을 사용합니다. 학생들은 점, 선, 도형 등의 그래픽 객체를 조작하고 좌표 시스템을 관리하며, 마우스 클릭, 키보드 입력, 텍스트 입력에 반응하는 인터랙티브 프로그램을 만드는 방법을 배웁니다.
학습 결과:
- 객체 지향 프로그래밍의 핵심 개념: 객체, 메서드, 액세서, 머테이터, 별칭을 정의하고 적용할 수 있다.
- 점, 선, 원, 사각형, 타원, 다각형 등의 그래픽 객체를 생성하고 표시할 수 있다.
- 좌표 변환과 인터랙티브 요소(마우스/키보드/입력 상자)를 구현하여 기능적인 GUI를 만들 수 있다.
🔹 수업 5: 시퀀스: 문자열, 리스트 및 파일 입출력
개요: 본 수업에서는 컴퓨터 과학이 데이터 시퀀스를 어떻게 표현하고 조작하는지 탐구하며, 특히 문자열과 리스트에 초점을 맞춥니다. 학생들은 인덱싱과 슬라이싱의 메커니즘, 변경 가능(가변) 객체와 변경 불가능(불변) 객체의 중요한 차이점, 외부 데이터에 접근하기 위한 파일 처리 방법을 배웁니다. 또한 유니코드를 통한 데이터 인코딩과 기초 암호화 기법(예: 카이사르 암호, 치환 암호)의 기본 원리를 다룹니다.
학습 결과:
- 인덱싱, 슬라이싱, 내장 메서드(분할, 결합, 대문자, 소문자)를 사용하여 문자열과 리스트의 고급 조작을 수행할 수 있다.
- 기초 인코딩/디코딩 알고리즘과 암호화 기법(카이사르 암호, 치환 암호)을 설계하고 구현할 수 있다.
- 외부 데이터 파일을 열고 읽고 처리하며 닫는 배치 처리 프로그램을 개발할 수 있다.
🔹 수업 6: 함수 정의와 변수 범위
개요: 본 수업에서는 단일 스크립트 작성에서 함수를 사용한 모듈러 프로그래밍으로의 전환을 탐구합니다. 함수 정의 및 호출의 문법, 공식 매개변수와 실제 매개변수를 통한 정보 전달 메커니즘, 반환 값(다중 값 및 None 객체 포함)을 통한 함수 간 통신 방식을 다룹니다. 학생들은 지역 변수와 전역 변수의 차이를 이해하고, 함수가 가변 매개변수를 수정함으로써 프로그램 상태에 영향을 미칠 수 있다는 점을 배웁니다.
학습 결과:
- 코드 중복을 줄이고 프로그램 구조를 개선하기 위해 함수를 정의하고 호출하는 방법을 보여줄 수 있다.
- 공식 매개변수와 실제 매개변수의 차이를 구분하고 위치 기반 매개변수 매칭을 설명할 수 있다.
- 단일 값, 다중 값 또는
None객체를 기본값으로 반환하는 함수를 구현할 수 있다.
🔹 수업 7: 결정 구조와 예외 처리
개요: 본 수업에서는 특정 조건에 따라 다른 명령어 시퀀스를 실행할 수 있도록 해주는 결정 구조를 소개합니다. 학생들은 관계 연산자를 사용해 부울 표현식을 만들고, 단일 경로, 이중 경로, 다중 경로 결정을 구현하며, 복잡한 논리에 대해 중첩을 사용합니다. 또한 __name__ 변수를 통한 모듈식 실행과 try-except 패턴을 활용한 강력한 오류 관리 방법을 다룹니다.
학습 결과:
if,else,elif를 사용하여 단순, 이중, 다중 경로 결정 구조를 구현할 수 있다.- 관계 연산자와 문자열의 사전 순서를 사용하여 부울 표현식을 구성하고 평가할 수 있다.
try-except패턴을 적용하여 런타임 오류를 처리하고 프로그램 충돌을 방지할 수 있다.
🔹 수업 8: 무한 루프와 부울 논리
개요: 본 수업에서는 고정된 횟수의 '카운트' 루프에서 무한 루프(인덕티브 루프)로 전환합니다. 이는 고정된 시퀀스가 아닌 조건에 따라 실행되는 루프입니다. 학생들은 while 문을 마스터하고, 데이터 처리를 위한 다양한 설계 패턴(인터랙티브, 센티널, 파일 기반 루프)을 적용합니다. 또한 부울 논리(Boolean Logic)를 다루며, 코드 내에서 복잡한 결정 구조를 구성하고 단순화하기 위한 대수적 도구를 제공합니다.
학습 결과:
- 파이썬
while문을 사용하여 무한 루프를 설계하고 구현할 수 있다. - 인터랙티브 루프, 센티널 루프, 초기 읽기 패턴(프라임 리드 패턴)을 포함한 일반적인 루프 패턴을 적용할 수 있다.
- 부울 대수(Boolean Algebra)와 데모르간 법칙(DeMorgan’s Laws)을 사용하여 복잡한 논리 조건을 단순화할 수 있다.
🔹 수업 9: 시뮬레이션, 설계 및 단계적 정밀화
개요: 본 수업에서는 탑다운 설계(Top-Down Design)와 단계적 정밀화(Stepwise Refinement)를 통해 복잡한 컴퓨터 프로그램을 체계적으로 개발하는 과정을 탐구합니다. 학생들은 추상화와 모듈화를 통해 큰 문제를 다룰 수 있는 작은 "조각"으로 분해하는 방법을 배우며, 구조 차트(Structure Charts)를 통해 프로그램 계층 구조를 시각화하고, 몬테카를로(Monte Carlo) 기법을 사용한 시뮬레이션을 구현합니다. 또한 프로토타이핑과 스피럴 개발과 같은 반복 개발 전략, 그리고 단위 테스트(Unit Testing)와 같은 견고한 테스트 방법론을 다룹니다.
학습 결과:
- 탑다운 설계(Top-Down Design)를 사용하여 복잡한 문제를 더 작고 해결 가능한 하위 문제로 분해할 수 있다.
- 모듈 간 데이터 흐름(매개변수와 반환 값)을 보여주는 구조 차트(Structure Charts)를 구성하고 해석할 수 있다.
- 파이썬의
random라이브러리를 사용하여 확률적 사건을 모델링하기 위해 몬테카를로 시뮬레이션 기법을 적용할 수 있다.
🔹 수업 10: 클래스 정의와 이벤트 기반 프로그래밍
개요: 본 수업에서는 절차적, 함수 기반 설계에서 파이썬 클래스를 사용한 객체 기반 설계로 전환합니다. 학생들은 데이터(인스턴스 변수)와 행동(메서드)을 하나의 단위에 캡슐화하는 방법을 배우며, 인터랙티브 그래픽 사용자 인터페이스(GUI) 위젯을 생성하고, 이벤트 기반 프로그래밍과 동기화된 애니메이션 루프를 통해 프로그램 흐름을 관리하는 방법을 익힙니다.
학습 결과:
- 함수 기반 설계와 객체 기반 설계의 차이를 구분할 수 있다.
- 생성자(
__init__), 인스턴스 변수,self매개변수를 사용하여 사용자 정의 파이썬 클래스를 정의할 수 있다. - 문서화를 위한 도스트링을 사용하여 캡슐화와 문서화를 구현할 수 있다.
🔹 수업 11: 데이터 컬렉션: 고급 리스트와 사전
개요: 본 수업에서는 파이썬에서 고급 데이터 컬렉션 기술을 탐구하며, 리스트와 사전의 유연성에 초점을 맞춥니다. 학생들은 리스트와 전통적인 배열의 차이를 구분하고, 슬라이싱과 레코드 정렬과 같은 복잡한 리스트 작업을 수행하며, 사전을 통한 비순차적 매핑을 적용합니다. 모듈의 마지막에는 이러한 구조를 통계 분석과 에라토스테네스의 체와 같은 고전 알고리즘에 적용합니다.
학습 결과:
- 파이썬의 동적 리스트와 고정 크기, 동일한 타입의 배열을 비교할 수 있다.
- 슬라이싱, 선택적 삭제, 객체 레코드의 사용자 정의 정렬 등을 포함한 고급 리스트 조작을 수행할 수 있다.
- 평균, 중앙값, 표준 편차와 같은 통계 알고리즘과 컬렉션을 사용한 테이블 기반 설계를 구현할 수 있다.
🔹 수업 12: 객체 지향 설계(OOD) 원칙
개요: 본 수업에서는 탑다운 기능 설계에서 객체 지향 설계(OOD)로의 전환을 탐구합니다. 이는 시스템을 상호작용하는 "블랙 박스"(객체)의 집합으로 설명하는 데이터 중심 접근 방식입니다. 학생들은 문제 설명에서 후보 객체와 메서드를 식별하고, 데스크톱 배드민턴과 주사위 포커와 같은 다중 클래스 시뮬레이션을 구현하며, 객체 지향 프로그래밍의 세 가지 핵심 원칙: 캡슐화, 다형성, 상속을 적용합니다. 수업은 서브클래싱과 메서드 오버라이딩을 통해 복잡한 그래픽 사용자 인터페이스(GUI) 상호작용을 관리하는 것으로 마무리됩니다.
학습 결과:
- 문제 설명에서 명사와 동사를 분석하여 잠재적인 클래스와 메서드를 식별할 수 있다.
- 구조화된 클래스(예:
Player,Game,Stats)를 사용하여 복잡한 다객체 시뮬레이션을 구현할 수 있다. - 캡슐화, 다형성, 상속의 핵심 개념을 구분하고 적용할 수 있다.
🔹 수업 13: 알고리즘 설계, 재귀 및 효율성
개요: 본 수업에서는 계산 문제를 효율적으로 해결하는 데 사용되는 기본 기법을 탐구합니다. 검색 전략, 재귀적 문제 해결의 메커니즘(기저 사례와 재귀 단계), 그리고 선택 정렬과 병합 정렬과 같은 정렬 알고리즘의 비교를 통해 알고리즘 설계가 성능에 미치는 영향을 이해합니다.
학습 결과:
- 선형 탐색과 이진 탐색 전략을 비교하고 구현할 수 있다.
- 문자열 역순, 빠른 거듭제곱과 같은 문제를 기저 사례와 재귀 단계를 사용하여 재귀 함수를 설계할 수 있다.
- 재귀와 반복, 그리고 서로 다른 정렬 알고리즘(n^2 vs. n \log n) 사이의 성능 트레이드오프를 분석할 수 있다.