프로젝트에서 보기 →

파이썬 무료 강의 100분 완성 (1분 파이썬 모음)

태그
교육
시작일
종료일
수정일

https://www.youtube.com/watch?v=T6z-0dpXPvU

description: |-

1. 이건 꼭 알아야 한다[^1]

[? 질문] 짧은 시간(각 1분 단위 학습)으로도 파이썬의 전반을 익히게 하려면 어떤 구성으로 가르쳐야 하는가[^2]
[= 답] 각 주제마다 핵심 개념을 1분 내로 설명하고, 곧바로 **짧은 시험 문제를 제시(5초 노출 후 해설)**해 학습자가 멈춰 풀어보며 확인하도록 구성한다.[^11][^3]

[? 질문] 파이썬을 처음 시작하는 사람이 “환경 설정 → 문법 기초 → 자료구조 → 제어문 → 함수/클래스 → 예외/모듈/패키지”까지 끊김 없이 이해하려면 무엇을 어떤 순서로 알아야 하는가[^4]
[= 답] (1) 실행 환경 준비(설치/에디터/실행) → (2) 출력과 자료형/변수/형변환 → (3) 연산자/불리언/주석 → (4) 문자열(인덱싱·슬라이싱·메소드·포맷·이스케이프) → (5) 컬렉션(리스트·튜플·세트·딕셔너리)과 상호 변환 → (6) 조건문/반복문과 흐름 제어 → (7) 함수(전달값·반환값·기본값·키워드 인자·가변인자·스코프) → (8) 입력/파일 처리(with) → (9) 클래스(OOP)와 상속/오버라이딩 → (10) 예외 처리 → (11) 모듈/패키지 순으로 쌓아간다.[^5][^38]

[? 질문] “초보가 자주 틀리는 포인트(에러/자료형/들여쓰기/스코프/파일 닫기)”를 어떻게 예방시키는가[^6]
[= 답] 입력값은 기본이 문자열이라는 점(비교/연산 전 형변환 필요), 파이썬은 들여쓰기가 문단(블록)이라는 점, 함수 안/밖 변수 범위(지역/전역), 파일은 반드시 닫아야 하며 with가 이를 자동화한다는 점을 사례 기반으로 직접 에러를 보여주고 해결하게 한다.[^55][^54][^86]

2. 큰 그림[^1]

이 콘텐츠는 “기본 파이썬 강의가 길게 느껴지는 사람”을 위해, 짧은 단위(1분)로 핵심만 설명하고 곧바로 문제로 확인하는 방식으로 파이썬 전 범위를 훑게 만드는 입문~초중급 강의다.[^2][^11] 설치부터 시작해 자료형/문자열/컬렉션/조건·반복/함수/파일/클래스/예외/모듈·패키지까지 실제 코드를 기준으로 동작 원리와 흔한 실수를 함께 다룬다.[^1][^38]

  • 학습 설계(1분 설명 + 시험 문제): 각 주제 핵심을 짧게 설명하고, 문제를 잠깐 멈춰 스스로 풀게 만든 뒤 해설로 확인한다.[^11][^3]
  • 파이썬 기초 문법의 “왜”를 비유로 설명: 변수=봉투, 리스트=비닐봉투, 주석=사회자 대본의 메모, 인덱스=주차칸 번호 등 비유로 개념을 잡는다.[^13][^12][^36]
  • 실무에서 바로 마주치는 요소 포함: 사용자 입력(input), 파일 입출력(open, with), 예외처리(try/except), 재사용(모듈/패키지)까지 이어진다.[^88][^90][^99]

3. 하나씩 살펴보기[^1]

3.1 강의 목적과 진행 방식: “1분 파이썬 + 시험 문제”[^2]

📸 0:05

강의자는 “파이썬 기본 영상이 길어 부담스럽거나 바쁜 사람”을 위해 새로운 형식의 강의를 준비했다고 밝힌다.[^2] 콘텐츠 제목은 “1분 파이썬”으로, 짧은 1분 투자로 파이썬 전반을 배우고, 곧바로 시험 문제를 풀어 확인하는 방식이다.[^11] 파이썬은 문법이 간결하고 배우기 쉬우며 활용 분야가 넓어 전공자가 아니어도 추천된다고 소개한다.[^4]

시험 문제는 5초 동안 보여준 뒤 정답/해설이 공개되므로, 화면을 잠깐 멈춰 스스로 풀고 진행하라고 안내한다.[^3]

[!TIP] 학습법(강의자가 권하는 시청 방식) 문제 화면이 나오면 일시정지 → 직접 풀이 → 재생하여 해설 확인 흐름으로 따라가야 “1분 설명”의 압축을 보완할 수 있다.[^3]

3.2 개발 환경 설정: 파이썬 + VS Code + 첫 실행(Hello World)[^7]

📸 1:11

파이썬 학습을 위한 환경 설정을 먼저 진행한다.[^7] 에디터는 마이크로소프트 Visual Studio Code를 사용한다.[^7]

  1. 파이썬 설치: 구글에서 파이썬 검색 → 공식 홈페이지 방문 → 설치 파일 다운로드/실행, 설치 과정에서 경로/옵션을 지정한다.[^7]
  2. VS Code 설치: 구글에서 VS Code 검색 → 다운로드/설치 진행.[^7]
  3. 프로젝트 폴더/파일 생성: 폴더를 만들고 VS Code에서 Open Folder로 열고 새 파일을 만든다(확장자 .py).[^7]
  4. 파이썬 확장 설치: 우측 하단 팝업에서 Python Extension 설치.[^7]
  5. Hello World 실행: print('Hello World')를 작성하고 실행(삼각형 버튼)하여 출력이 보이면 환경 설정 완료.[^7]

이어서 print()의 의미를 “괄호 속 내용을 출력하는 함수”로 설명하며 다음 개념(자료형)으로 연결한다.[^8]

3.3 출력과 자료형: 문자열/숫자/불리언, 따옴표의 의미[^8]

📸 2:26

print('Hello World')에서 따옴표로 감싼 "Hello World"문자열 자료형이라고 설명한다.[^8] 프로그래밍에는 다양한 자료형이 있고, 회원가입 입력 예시로 자료형을 직관적으로 구분한다.[^8]

  • 문자열(str): 이름/주소처럼 글자 데이터. 작은따옴표 또는 큰따옴표로 감싼다.[^8]
  • 숫자형(int/float): 전화번호/생년월일 같은 숫자 데이터. 정수/실수로 구분되며 “있는 그대로” 쓴다.[^8]
  • 불리언(bool): 동의 여부처럼 참/거짓. True, False가 있으며 첫 글자 T/F는 대문자여야 한다고 주의한다.[^8]

또한 “숫자처럼 보이는 값도 따옴표로 감싸면 문자열이 된다”는 점을 주의사항으로 강조한다.[^8]

3.4 변수: 값 저장 공간, 봉투(세뱃돈) 비유 + 네이밍 규칙[^9]

📸 3:33

변수는 “어떤 값을 저장하는 공간”이라고 정의한다.[^9] 설날 세뱃돈 봉투 비유를 든다: 조카 3명에게 줄 돈을 봉투 1,2,3에 넣어두면, 봉투에 얼마가 들었는지 기억할 필요 없이 봉투(변수)만 전달하면 된다는 구조다.[^9]

  • 변수 선언/대입: 변수명 = 값 형태로 왼쪽에 이름, 오른쪽에 넣을 값을 쓴다.[^9]
  • 변수 출력: print(변수명)로 출력한다.[^9]

변수명 규칙도 함께 정리한다.[^10]

  • 첫 글자: 문자 또는 _로 시작.[^10]
  • 이후: 문자/숫자/_ 조합.[^10]
  • 공백/특수문자 불가.[^10]
  • 대소문자 구분: name, Name, NAME은 서로 다른 변수.[^10]
  • 예약어(키워드): True, False, for, while, if 등은 변수명으로 사용 불가.[^10]
  • 가독성 권장: 소문자 단어 또는 my_name_your_name처럼 밑줄로 구분하는 스타일 권장.[^10]

3.5 형 변환(type casting): int, float, str + 실패 사례 + 버림 규칙[^14]

📸 5:57

숫자와 문자의 덧셈이 불가능하다는 예로 “2 + '2'” 같은 상황을 든다.[^14] 숫자형 2와 문자형 '2'는 서로 다른 자료형이라 연산이 안 되며, 이때 형 변환을 사용한다고 설명한다.[^14]

핵심 변환 3가지를 제시한다.[^14]

  • int(x): 정수로 변환.[^14]
  • float(x): 실수로 변환.[^14]
  • str(x): 문자열로 변환.[^14]

변환 시 주의점:

  • 변환 대상은 “변환하려는 자료형이 이해 가능한 형태”여야 한다(예: 'A'int로 불가).[^15]
  • '2.5' 같은 문자열 실수는 바로 int로 못 바꾸며, float('2.5')int(...)로 바꿔야 한다.[^15]
  • 실수→정수 변환은 반올림이 아니라 버림이라 2.9도 2가 될 수 있다고 설명한다(예시 결과는 3이 아니라 2).[^16]

3.6 연산자: 산술/비교/논리/멤버십 연산자[^17]

📸 7:31

파이썬의 다양한 연산자를 네 묶음으로 설명한다.[^17]

  1. 산술 연산자: +, -, *(곱셈은 별표), /(나눗셈은 슬래시).[^17]

    • 나머지: % (예: 5 % 2 → 1).[^17]
    • 몫: // (예: 5 // 2 → 2, 나머지 버림).[^17]
    • 거듭제곱: ** (예: 5 ** 2 → 25).[^17]
  2. 비교 연산자: >, >=, <, <=는 결과가 불리언(True/False).[^18]

    • 같음: == (수학의 =와 다름).[^18]
    • 다름: !=.[^18]
  3. 논리 연산자: and, or, not.

    • and: 둘 다 참이면 참.[^19]
    • or: 하나라도 참이면 참.[^19]
    • not: 값을 반전.[^19]
  4. 멤버십 연산자: in, not in으로 포함 여부를 검사.[^20]

    • 예: 'C' in 'case'는 참, 'C' not in 'case'는 거짓이라는 식으로 설명한다.[^20]

3.7 bool() 형 변환: “값이 있으면 True, 없으면 False” + None[^21]

📸 10:03

불리언 값은 True/False 중 하나라고 재확인한 뒤, bool()로도 형 변환이 가능하다고 말한다.[^21] 핵심 규칙은 “값이 있으면 True, 없으면 False”다.[^21]

  • 문자열:
    • 'Hello'처럼 내용이 있으면 True.[^21]
    • ' '(공백 여러 개)도 “공백이라는 값이 있다”고 보아 True.[^21]
    • ''(빈 문자열)은 값이 없으므로 False.[^21]
  • 숫자:
    • 0이 아닌 모든 수는 True, 0은 False.[^21]
  • None: 값이 없음을 의미하는 키워드이며 bool(None)은 False.[^21]

3.8 주석(comment): 결혼식 사회자 대본 비유 + 한 줄/여러 줄 주석[^22]

📸 11:25

주석을 결혼식 사회자 대본의 “실제로 읽지 않지만 참고하는 메모”에 비유한다.[^22] 하객은 듣지 못하지만 사회자에게는 진행을 안정화하는 정보가 되는 것처럼, 코드에서도 실행되지 않지만 설명/메모 역할을 하는 부분이 주석이다.[^22]

파이썬 주석 처리 2가지:

  • 한 줄 주석: 줄 앞에 #.[^23]
  • 여러 줄 주석: """ ... """처럼 따옴표 3개로 감싼다.[^23]

주석 사용 목적:

  • 복잡한 코드 설명, 다른 개발자에게 메모, 테스트 목적의 임시 실행 중지 등.[^24]

3.9 문자열 인덱스/슬라이싱: 주차장 칸 번호 비유, 0부터 시작, 음수 인덱스[^25]

📸 12:50

인덱스를 “아무 표식 없는 주차장이라도 ‘몇 번째’ 정보로 위치를 공유한다”는 상황에 비유한다.[^25] 파이썬 문자열(그리고 리스트 등)에는 “몇 번째” 개념이 있으며, 시작이 1이 아니라 0이라는 점을 강조한다.[^25]

  • 인덱싱: lang[0]처럼 대괄호에 위치를 넣어 글자 하나를 얻는다.[^25]
  • 마지막 글자는 -1로도 접근 가능하며, -2, -3처럼 뒤에서 앞으로도 가능하다.[^25]

슬라이싱(slicing):

  • 문자열[시작:끝]에서 끝 인덱스는 “포함되지 않고 직전까지”이며, 설명에서는 “끝 인덱스에 1을 더한 값을 넣는다”는 방식으로 이해시키고 있다.[^26]
  • s[1:]처럼 끝을 생략하면 시작부터 끝까지.[^26]
  • s[:4]처럼 시작을 비우면 처음부터 4 직전까지.[^26]
  • s[:]는 처음부터 끝까지 전체.[^26]

3.10 문자열 더하기, += 같은 복합 대입, len(), 여러 줄 문자열[^27]

📸 14:58

“2(숫자) + '2'(문자)는 불가”였지만, 숫자를 문자로 바꾸면 문자열끼리 결합이 가능해진다는 흐름으로 문자열 합치기를 보여준다.[^27]

  • 문자열 결합: '꿀과 배' + '두 개'처럼 +로 붙인다.[^27]

  • += 축약: please += please 같은 식으로 “자기 자신에 더해 다시 저장”하는 표현을 소개한다.[^27]

  • 이 복합 대입은 문자열뿐 아니라 숫자에도 적용되며 -=, *=, /=도 가능하다고 이어서 설명한다.[^27]

  • 길이 구하기: len(문자열)로 몇 글자인지 확인.[^27]

  • 여러 줄 문자열: 문자열 앞뒤를 """ ... """로 감싸 여러 줄을 저장(여러 줄 주석 문법과 유사).[^27]

3.11 문자열 메소드(1): 대소문자 변환, split, count 등 “문자열.메소드()”[^28]

📸 16:37

메소드를 “클래스에 정의된 기능 묶음”으로 소개하되, 초반에는 “그냥 기능이라고 이해하면 된다”고 풀어 말한다.[^28] 사용법은 문자열.메소드이름() 형태다.[^28]

예시 메소드들:

  • lower(): 전체 소문자.[^28]
  • upper(): 전체 대문자.[^28]
  • capitalize(): 첫 글자만 대문자, 나머지 소문자.[^28]
  • title(): 단어별 첫 글자 대문자(기사 제목처럼).[^28]
  • swapcase(): 대↔소문자 뒤바꿈.[^28]
  • split(): 공백 기준 분리, 결과는 리스트 형태(리스트는 뒤에서 설명).[^28]
  • count('찾을문자'): 특정 글자의 등장 횟수.[^28]

3.12 문자열 메소드(2): startswith/endswith/strip/replace/find/center + 공식 문서 탐색법[^29]

📸 18:05

추가 문자열 메소드들을 연이어 소개한다.[^29]

  • startswith(x): x로 시작하는지, 불리언 반환.[^29]
  • endswith(x): x로 끝나는지.[^29]
  • strip(chars): 앞뒤 불필요 문자 제거. 인자를 비우면 공백 제거.[^29]
  • replace(a, b): a를 찾아 b로 치환(예: 고등학교→고교).[^29]
  • find(x): x의 위치를 인덱스로 반환(예: “학교” 위치가 4).[^29]
  • center(총길이, 채움문자): 문자열을 가운데 두고 양옆을 채움(예: 하이픈으로 감싸 총 길이 10).[^29]

메소드는 종류가 매우 많으므로, 구글에서 “파이썬 내장형”을 검색해 공식 홈페이지에서 문자열 메소드 목록을 찾아보라고 안내한다(컨트롤+F로 찾기).[^30]

3.13 출력 심화: print의 콤마, 문자열 포맷팅(format, 인덱스 지정, f-string)[^31]

📸 19:46

먼저 print에서 +로 문자열을 합쳐 출력하던 것을 상기시키고, print(a, b)처럼 콤마로 나열하면 자동으로 띄어쓰기까지 포함해 출력된다는 방법을 소개한다.[^31]

하지만 변수를 문장 속에 자연스럽게 끼워 넣을 때는 +와 따옴표가 많아 복잡해질 수 있으므로 “문자 포맷”을 제시한다.[^31]

문자열 포맷 3가지:

  1. {} + .format(...): 중괄호 위치에 format의 값이 순서대로 들어간다.[^31]
  2. {0}, {1}처럼 번호를 지정: 순서 재배치 가능(예: {1} {0}로 바꾸면 값 순서가 바뀜).[^31]
  3. f-string: 문자열 앞에 f를 붙이고 {변수}를 바로 넣는다(간편하다고 강조).[^31]

3.14 따옴표/이스케이프(탈출 문자): 따옴표 충돌 해결, 경로 백슬래시, 줄바꿈 \n[^32]

📸 21:30

따옴표가 포함된 문장을 출력할 때의 문제를 사례로 설명한다.[^32]

  • 문장 안에 큰따옴표가 있으면 바깥을 작은따옴표로 감싸면 된다.[^32]
  • 문장 안에 작은따옴표가 있으면 바깥을 큰따옴표로 감싸면 된다.[^32]
  • 그런데 작은/큰따옴표가 둘 다 들어 있으면 단순 감싸기로는 충돌이 나므로, **탈출 문자(이스케이프)**를 사용한다.[^32]

탈출 문자 개념: 역슬래시 \와 특정 문자 조합으로 “표현하기 어려운 문자/기능”을 표현한다.[^32]

  • 따옴표 표현: 문자열 안의 따옴표 앞에 \를 붙여 그대로 출력.[^32]
  • 역슬래시 자체 표현: 윈도우 경로처럼 \가 들어가면 이스케이프와 충돌하므로 \\로 두 번 쓴다.[^32]
  • 줄바꿈: \n을 넣어 줄바꿈(여러 줄 문자열을 """로 만드는 방법과 비교).[^32]

3.15 리스트(list): 비닐봉투 비유, 선언/중복/혼합/빈 리스트[^33]

📸 23:12

“여러 데이터를 한꺼번에 관리하는 내장 자료형” 중 하나로 리스트를 소개한다.[^33] 편의점에서 여러 물건을 손으로 들다가 비닐봉투에 넣어 한 번에 들고 가는 비유를 사용한다.[^33]

  • 변수는 하나의 값을 저장하지만 리스트는 여러 값을 저장한다.[^33]
  • 관련 있는 연속 데이터를 관리할 때 일반적으로 사용.[^33]
  • 선언: [...] 대괄호 안에 값을 콤마로 구분.[^33]
  • 중복 허용: 같은 값(초코파이 3개)을 여러 번 넣을 수 있다.[^33]
  • 자료형 혼합 가능: 숫자/문자/불리언 등 섞어서 저장 가능.[^33]
  • 빈 리스트: [].[^33]

3.16 리스트 활용: 인덱싱/슬라이싱/포함(in)/길이(len)/수정/추가/삭제/확장[^34]

📸 24:37

리스트는 순서가 보장되기 때문에 문자열처럼 인덱스로 접근 가능하다고 설명한다.[^34] “칸막이가 있는 특수 비닐봉투”라는 표현으로 순서성을 강조한다.[^34]

  • 인덱싱: my_list[0].[^34]
  • 슬라이싱: 부분 리스트 추출(문자열과 유사).[^34]
  • 포함 여부: x in my_list는 불리언.[^34]
  • 길이: len(my_list).[^34]
  • 수정: my_list[인덱스] = 새값.[^34]
  • 추가: append()로 맨 뒤에 추가.[^34]
  • 삭제: remove(값) 등으로 삭제.[^34]
  • 합치기: extend(다른리스트)로 확장.[^34]

추가로 더 많은 메소드가 있다고 언급하며 참고를 유도한다.[^34]

3.17 튜플(tuple): 읽기 전용, “계산 후 봉투 스티커” 비유, 리스트와 공통점/차이[^35]

📸 26:02

튜플은 리스트처럼 여러 데이터를 담지만 한 번 만들면 수정 불가라는 차이를 핵심으로 든다.[^35]

  • 선언: (...) 소괄호에 값들을 콤마로 구분.[^35]
  • 수정 불가 비유: 계산 후 비닐봉투에 “개봉 금지 스티커”를 붙이면 이후 추가 구매(초코파이 추가)도 못 하고, 꺼내서 환불도 못 하는 상황과 같다고 설명한다.[^35]
  • 읽기 전용 리스트로 이해해도 된다고 정리.[^35]
  • 중복 허용, 다양한 자료형 포함 가능.[^35]
  • 순서 보장, 인덱싱/슬라이싱/포함 여부/길이 확인은 가능.[^35]

3.18 튜플 패킹/언패킹 + 별(*) 언패킹 규칙(나머지는 리스트)[^36]

📸 27:24

튜플을 만들 때 오른쪽 값을 한 변수에 담는 것을 패킹이라 하고, 반대로 튜플의 값들을 여러 변수로 꺼내 담는 것을 언패킹이라 한다.[^36]

별(*)을 활용한 언패킹:

  • 예: 1~10 튜플에서 a, b, *rest처럼 하면 앞의 일부는 변수에, 나머지는 rest로 모인다.[^36]
  • 이때 rest튜플이 아니라 리스트가 된다는 점을 주의하라고 한다.[^36]
  • *의 위치는 앞/뒤로 바꿀 수 있으며, 어디를 “나머지 묶음”으로 받을지 조정 가능.[^36]

3.19 세트(set): 순서 없음 + 중복 불가, 교집합/합집합/차집합, add/remove/clear/del[^37]

📸 28:43

세트는 리스트/튜플처럼 여러 데이터를 저장하지만, 순서가 보장되지 않고 중복도 허용하지 않는다는 특징을 강조한다.[^37]

음식 취향 예시:

  • 친구 A의 좋아하는 음식, 친구 B의 좋아하는 음식이 있을 때,
  • 둘 다 좋아하는 메뉴(공통)는 교집합으로 찾을 수 있고, 예시에서는 제육덮밥이 공통으로 제시된다.[^37]
  • 두 친구가 좋아하는 모든 후보는 합집합으로 만든다.[^37]
  • 친구 A가 친구 B와 겹치는 것을 빼고 먹고 싶다면 차집합을 쓴다.[^37]

메소드:

  • 교집합: intersection().[^37]
  • 합집합: union().[^37]
  • 차집합: difference().[^37]

중요한 차이:

  • 순서가 없어서 인덱스로 접근 불가(리스트/튜플과 다른 핵심 차이).[^38]
  • 그러나 읽기 전용은 아니며 add()로 추가, remove()로 삭제 가능.[^38]
  • clear()는 비우기, del set변수는 세트 자체 삭제(이후 사용 불가)라고 설명한다.[^38]

3.20 딕셔너리(dict): 키-밸류 쌍, 키 중복 불가, 접근/추가/수정/get/update/pop/keys/values/items[^39]

📸 31:45

딕셔너리는 “사전(dictionary)” 비유로 설명한다: 단어(키)와 뜻(값)이 항상 쌍이며, 키는 중복이 허용되지 않는다.[^39]

  • 선언: {키: 값, 키2: 값2, ...} 형태, 키와 값은 :로 구분, 항목은 ,로 구분.[^39]
  • 보기 편하게 줄바꿈해도 된다.[^39]
  • 키는 문자열뿐 아니라 숫자 등도 가능(중복만 피하면 됨).[^39]
  • 값은 문자열/정수/불리언/리스트/튜플 등 다양한 자료형 가능.[^39]
  • 접근: dict[키]로 값 얻기.[^39]

사용법 상세:

  • 없는 키를 dict[키]로 접근하면 에러.[^40]
  • get(키)를 쓰면 키가 없어도 에러 없이 None이 나온다.[^40]
  • 추가/수정: dict[새키] = 값은 추가, 기존 키면 수정.[^40]
  • 여러 키 변경: update({키:새값, ...}).[^40]
  • 삭제: pop(키).[^40]
  • 전체 삭제: clear().[^40]
  • 키 목록: keys().[^40]
  • 값 목록: values().[^40]
  • 키-값 쌍: items().[^40]

3.21 자료형 비교 정리 + 언제 무엇을 쓰나[^41]

📸 34:47

네 가지 컬렉션의 특징을 비교한다.[^41]

  • 리스트: [], 순서 보장, 중복 허용, 인덱싱/슬라이싱 가능, 수정/추가/삭제 가능.[^41]
  • 튜플: (), 순서 보장, 중복 허용, 인덱싱/슬라이싱 가능, 수정/추가/삭제 불가(읽기 전용).[^41]
  • 세트: {}, 순서 보장 X, 중복 허용 X, 인덱싱 불가, 직접 수정 불가, 대신 추가/삭제는 가능.[^41]
  • 딕셔너리: {}, 키-값 쌍, (파이썬 3.7부터) 입력 순서 보장, 키 중복 불가, 인덱스가 아니라 키로 접근, 값 변경/추가/삭제 가능.[^41]

언제 쓰나:

  • 순서대로 여러 값 관리: 리스트.[^41]
  • 바뀌면 안 되는 값(실수로 변경 방지): 튜플.[^41]
  • 존재 여부가 중요 + 중복 제거: 세트.[^41]
  • 키로 효율적 관리: 딕셔너리.[^41]

3.22 자료형 변환 응용: 튜플 수정 “우회”, 리스트 중복 제거(세트 vs dict.fromkeys)[^42]

📸 36:42

튜플은 읽기 전용이지만 “사실 수정하는 방법이 있다”면서, 튜플→리스트→수정→튜플 흐름을 보여준다.[^42]

  • list(my_tuple)로 리스트로 바꾸고 append()로 추가 후 tuple(my_list)로 다시 튜플화.[^42]

리스트 중복 제거:

  • 방법 1) set(리스트)로 중복 제거 후 다시 list(set(...))로 변환 가능.[^42]
    • 단, 세트는 순서가 없으므로 결과 순서가 섞일 수 있다는 단점을 강조한다.[^42]
  • 방법 2) 순서 유지 중복 제거: dict.fromkeys(my_list)를 사용하면 리스트 요소가 키가 되는 딕셔너리가 만들어지고(값은 1로 들어간다고 언급), 이를 다시 list(...)로 감싸 키만 뽑아 리스트로 만들 수 있다.[^42]

3.23 조건문 if/else/elif: “일요일이면 게임 후 공부” 예시 + 흐름도 + 중첩 if[^43]

📸 38:34

지금까지 코드는 위에서 아래로 모두 실행됐지만, 실제로는 조건에 따라 어떤 코드는 실행되고 어떤 코드는 건너뛰어야 하므로 조건문이 필요하다고 말한다.[^43]

  • if 조건: 다음 줄은 들여쓰기 필수.[^43]
  • 예시: today가 일요일이면 “게임 한 판”을 하고 공부, 아니면 바로 공부.[^43]

else:

  • if ... else ...로 조건이 참/거짓일 때 각각 다른 문장을 실행.[^43]

elif:

  • 첫 조건이 거짓일 때 다른 조건을 연쇄로 검사하기 위해 elif를 여러 개 둘 수 있다.[^44]
  • else는 선택이며 생략 가능하다고 설명한다.[^44]
  • 흐름도를 그려 “if 참이면 실행 후 탈출, 거짓이면 elif 검사, 모두 거짓이면 else” 구조를 설명한다.[^44]

중첩 if: 옐로카드 누적 로직 예시[^45]

“파울이면 옐로카드 +1”을 한 뒤, 옐로카드가 2장인지 다시 검사해 퇴장 여부를 결정하는 예를 든다.[^45]

  • 바깥 if: 파울 여부.[^45]
  • 안쪽 if: 옐로카드가 2장인지.[^45]
  • 안쪽 else: 아직 2장이 아니면 “조심” 출력.[^45]
  • 바깥 else: 파울이 아니면 “주의” 출력.[^45] 들여쓰기 레벨이 중첩 구조를 결정한다는 점을 함께 강조한다.[^45]

3.24 반복문 for/range: “8번뛰기 10회” 비유 + range(start, stop, step)[^46]

📸 45:15

반복 출력이 많아지면 복붙이 불가능하므로 반복문이 필요하다고 설명한다.[^46]

  • for 변수 in 반복범위/대상: 형태, 콜론 뒤 들여쓰기 블록이 반복 수행된다.[^46]
  • range(10)은 “총 10번 반복”의 의미로도 쓰이며, 실제 생성 숫자는 0~9라고 설명한다.[^46]
  • 반복 변수 x는 임의 이름이며 자유롭게 정할 수 있다.[^46]

range 상세:

  • range(stop)는 0 이상 stop 미만.[^47]
  • range(start, stop)는 start 이상 stop 미만(실생활 1부터 세는 경우를 예로 듦).[^47]
  • range(start, stop, step)에서 step으로 증가 폭을 지정:
    • range(1, 10, 2) → 1,3,5,7,9(홀수).[^47]
    • start를 2로 하면 짝수.[^47]
    • range(3, 10, 3) → 3의 배수(3,6,9).[^47]

3.25 for의 “반복 대상 순회”: 리스트/튜플/딕셔너리(keys/values/items)/문자열[^48]

📸 48:30

range 외에도 컬렉션을 직접 순회할 수 있다고 설명한다.[^48]

  • 리스트: for x in my_list:로 요소가 순서대로 x에 들어가 출력.[^48]
  • 튜플: 리스트와 동일하게 순회 가능.[^48]
  • 딕셔너리:
    • values()를 순회하면 값만 출력.[^48]
    • keys()를 순회하면 키만 출력.[^48]
    • items()를 순회하면 (키, 값) 쌍이 나오므로 for k, v in person.items():처럼 두 변수를 사용해야 한다.[^48]
  • 문자열도 순회 대상이 될 수 있어 'apple'을 순회하면 글자가 하나씩 나온다.[^48]

3.26 while: “25kg 이하로 짐 넣기” 예시 + 조건이 참인 동안 반복[^49]

📸 49:58

whilefor와 성격이 다르다고 설명한다:

  • for: 정해진 범위/데이터를 순회.[^49]
  • while: 조건이 참인 동안 계속 반복.[^49]

예시(여행 캐리어):

  • 최대 허용 무게 25kg, 짐 1개 3kg.[^49]
  • while weight + item <= max: 조건으로 더 넣을 수 있을 때까지 반복.[^49]
  • 반복마다 weight 증가, “짐 추가” 출력.[^49]
  • 조건이 거짓이 되면 while을 빠져나와 총 무게 출력.[^49] 결과로 최대 8개 추가, 총 24kg이 된다는 실행 결과를 확인한다.[^49]

3.27 break/continue: 비상정지 버튼 비유 + 시즌3 중단/건너뛰기[^50]

📸 51:43

반복문에서 즉시 멈추는 장치를 러닝머신의 비상정지 버튼에 비유하며 break를 소개한다.[^50]

  • 드라마 시즌 1~5를 순서대로 보는데 시즌3부터 재미없다 → 시즌3을 만나면 메시지 출력 후 break로 반복문 탈출, 시즌1~2만 본다.[^50]

이어서 continue는 “이번 회차만 건너뛰고 다음 반복으로” 넘어가는 동작이라고 설명한다.[^51]

  • 시즌3만 재미없다 → 시즌3일 때 continue로 아래 시청 출력문을 건너뛰고 시즌4로 넘어감.[^51]
  • 결과는 시즌1,2 시청 → 시즌3 건너뜀 → 시즌4,5 시청.[^51]

3.28 들여쓰기(indentation): 파이썬에서 블록을 결정하는 핵심 문법[^52]

📸 54:26

글쓰기의 문단 들여쓰기 예시를 들어, 파이썬은 다른 언어와 달리 들여쓰기가 실행 블록을 결정하는 매우 중요한 요소라고 강조한다.[^52]

  • 동일한 들여쓰기 간격의 문장들은 하나의 문단(블록)으로 함께 실행된다.[^52]
  • if/for/while/함수/예외처리/클래스 등 콜론으로 끝나는 문법은 다음 줄에 반드시 들여쓰기를 넣어야 한다.[^52]
  • 중첩 구조에서는 들여쓰기를 한 단계 더 추가한다.[^52]
  • 관례적으로 스페이스 4칸 사용.[^52]

3.29 리스트 컴프리헨션: for+if로 필터링/변환을 “한 줄”로[^53]

📸 55:34

리콜 대상 제품이 “siro(실로)”로 시작하는 제품들만 골라 새 리스트를 만드는 예시를 든다.[^53]

  • 전통 방식: 빈 리스트를 만들고 for product in products:로 순회하면서 if product.startswith('siro'):append.[^53]
  • 같은 일을 한 줄로: 리스트 컴프리헨션을 사용.[^53]

일반 문법 구조를 “복잡해 보이지만 예시로 이해”시키며, 핵심은 다음 두 가지 기능이라고 말한다.[^53]

  1. 필터링: 조건을 만족하는 요소만 새 리스트에 포함.[^53]
  2. 변환: 새 리스트의 요소를 x, x+1, x*3, str(x)+'번째'처럼 가공해 넣을 수 있다.[^53]

예: [x for x in my_list if x > 3]는 3보다 큰 값만 가져와 새 리스트를 만든다는 식으로 해석해 준다.[^53] 제품 리콜 예시도 컴프리헨션으로 동일 결과가 출력됨을 확인한다.[^53]

3.30 함수(function) 도입: “가격 인상 때 코드 전체 수정” 문제를 해결[^54]

📸 58:23

미용실 커트만 하는 키오스크 프로그램 예시로 “같은 코드가 여러 곳에 반복되면 변경이 매우 번거롭다”는 문제를 만든다.[^54]

  • 손님1/손님2/손님3 각각에게 가격 출력 코드를 반복 작성.[^54]
  • 가격을 1만원→15000원으로 바꾸면 모든 위치를 찾아 수정해야 함.[^54]
  • 서비스 이름도 바꾸려면 또 모든 위치 수정.[^54]

이 반복을 해결하는 것이 함수라고 소개한다: “특정 동작을 수행하는 코드 묶음”이며, 여러 곳에서 반복되는 코드를 함수로 만들면 편리하다고 강조한다.[^54]

  • 정의: def 함수명(): 다음 줄 들여쓰기 블록에 수행문.[^54]
  • 호출: 함수명()을 실행 위치에서 호출해야 실제로 동작.[^54]

show_price() 같은 함수를 만들고, 기존 코드에서 반복되던 가격 안내를 함수 호출로 대체하여 “수정은 함수 내부 한 곳만” 하게 만든다.[^54] 또한 함수 호출 시 코드 흐름이 “함수로 이동→실행→원래 위치로 복귀”한다는 실행 순서를 설명한다.[^54]

3.31 함수 전달값(파라미터): 고객 이름을 함수로 넘기기 + 전달값 스코프[^55]

📸 1:00:57

가격만 함수화했더니 여전히 “OO 고객님” 출력이 여러 곳에 남아 수정이 번거로울 수 있다는 문제를 추가한다.[^55] 이를 함수에 **전달값(파라미터)**을 넣어 해결한다.[^55]

단계적으로 바꾼다:

  1. 함수 내부에 고객 이름을 출력하는 print 추가.[^55]
  2. 함수 정의부 괄호에 customer 같은 매개변수 추가.[^55]
  3. 기존의 고객 출력 코드는 삭제.[^55]
  4. 호출부에서 show_price(customer1)처럼 고객 이름을 전달.[^55]

이렇게 하면 “사랑하는” 같은 문구를 추가해도 함수 안 한 곳만 수정하면 된다.[^55]

또한 전달값의 중요한 특징: 함수 안에서만 사용 가능, 함수 밖에서는 쓸 수 없다고 못 박는다.[^55]

3.32 반환값(return): 가격을 반환받아 변수에 저장 + VIP 조건 분기 + return의 즉시 종료[^56]

📸 1:02:34

함수가 결과를 “호출한 쪽으로 돌려줄 수 있다”는 개념으로 반환값을 설명한다.[^56]

  • return 값을 쓰면 호출부에서 그 값을 받아 사용할 수 있다.[^56]

예시:

  • get_price()15000return한다.[^56]
  • 호출부에서 price = get_price()로 받아 출력하면, 마치 price = 15000과 동일 동작이라고 연결한다.[^56]

단골(VIP) 할인 정책:

  • is_vip(불리언 전달값)을 받아 VIP면 10000, 아니면 15000 반환하도록 if로 분기.[^56]
  • 호출 시 get_price(True)면 단골 가격, get_price(False)면 일반 가격.[^56]

추가로:

  • 반환값은 보통 1개지만 튜플 형태로 여러 개 반환도 가능하다고 언급.[^56]
  • return을 실행하면 즉시 함수 탈출, 아래 문장은 실행되지 않는다고 강조한다.[^56]

3.33 기본값(default parameter): 일반 손님이 많을 때 호출을 간단히[^57]

📸 1:04:31

일반 손님이 훨씬 많아 False를 계속 넘기는 것이 번거롭다는 문제를 제기한다.[^57] 이를 해결하는 것이 기본값이다.[^57]

짜장면집 비유:

  • “2인분이요”라고만 말해도 기본 메뉴(짜장면)가 암묵적으로 선택되는 것처럼, 함수에서도 전달값에 기본을 둘 수 있다.[^57]

적용:

  • is_vip=False로 기본값을 두면 일반 손님은 get_price()처럼 괄호를 비워 호출해도 자동으로 False가 들어간다.[^57]
  • 단골만 get_price(True)로 명시하면 된다.[^57]

3.34 키워드 인자(keyword arguments): 필요한 옵션만 지정해서 호출[^58]

📸 1:05:57

할인 조건이 많아지면 전달값이 늘어 호출이 복잡해질 수 있다고 말한다(생일/멤버십/카드/리뷰/신규 등).[^58] 기본값으로 대부분 False로 두되, 특정 조건만 True로 바꾸고 싶을 때 키워드 인자를 쓰라고 제안한다.[^58]

  • 호출 시 review=True처럼 “대상을 지정해 값 전달”.[^58]
  • 여러 개면 review=True, birthday=True처럼 콤마로 추가.[^58]
  • 키워드 인자의 순서는 함수 정의 순서와 달라도 상관없다고 안내한다.[^58]

3.35 가변 인자(*args): 고객 수가 매일 바뀌는 방문 이력 기록[^59]

📸 1:07:27

방문 이력을 남기는 visit(date, customers...) 같은 함수를 만들 때, 고객 수가 매일 달라 전달값 개수를 고정하기 어렵다는 문제를 제기한다.[^59] 해결책이 가변 인자다.[^59]

  • 정의: 전달값 앞에 *를 붙여 *customers처럼 만든다.[^59]
  • 이렇게 하면 고객이 1명이든 3명이든 같은 함수 호출로 처리 가능하며, 함수 내부에서는 customers튜플 형태로 들어온다고 설명한다.[^59]
  • 함수 내부에서 날짜 출력 후 반복문으로 모든 고객 이름을 출력하는 형태로 구성한다.[^59]

주의사항:

  • 가변 인자는 전달값 목록에서 마지막에 딱 한 번만 사용할 수 있다.[^59]
  • 여러 개 *b, *c처럼 두 번 쓰면 어디까지를 b/c에 넣을지 모호해져 불가능하다는 이유를 든다.[^59]

3.36 변수 스코프: 지역변수/전역변수, global로 수정하기[^60]

📸 1:09:23

“시크릿 함수” 예시로 함수 내부 message 변수를 만들고, 함수 밖에서 출력하려 하면 에러가 난다고 보여준다.[^60]

  • 이유: 함수 내 변수는 지역 변수이며 함수 내에서만 접근 가능.[^60]
  • 다른 함수에서 같은 이름 message를 써도, 서로 다른 지역 변수로 독립이며 “서로 만날 수 없다”고 표현한다.[^60]

전역 변수:

  • 함수 밖에서 만든 변수는 전역 변수로 어디서든 사용 가능.[^61]
  • 하지만 함수 안에서 같은 이름으로 값을 할당하면 전역 수정이 아니라 새 지역 변수 생성이 되어 출력이 달라질 수 있다고 경고한다.[^61]
  • 함수 안에서 전역 변수를 수정하려면 global message로 선언해야 한다.[^61]
  • global은 전역에 변수가 없으면 새로 만들기도 한다고 설명한다.[^61]

3.37 사용자 입력 input: 입력은 문자열, 숫자 비교하려면 int로 감싸기[^62]

📸 1:11:51

프로그램이 일방향 방송처럼 흘러가는 것이 아니라 사용자와 소통하려면 입력이 필요하다고 말하며 input()을 소개한다.[^62]

버거 식당 예약 예시:

  • 직원이 “성함이?”를 묻는 문장을 input('...')으로 띄우면 사용자가 입력할 때까지 기다렸다가 입력값이 변수에 저장된다.[^62]
  • 저장된 값을 print로 확인한다.[^62]

인원수 입력과 자료형 문제:

  • 한 팀 최대 4명 제한을 if num > 4로 검사하려 했더니 에러가 난다.[^63]
  • 이유: input() 결과는 **항상 문자열(str)**이라 '8' 같은 값과 정수 4의 비교가 불가능하다는 에러가 발생한다.[^63]
  • 해결: num = int(input(...))처럼 int()로 감싸 숫자로 변환하면 비교가 가능해진다.[^63]

3.38 파일 입출력 open: 쓰기(w)/읽기(r), write/read, close, 줄 단위 반복과 end 옵션[^64]

📸 1:13:41

군대에서 매일 쓴 “수양록”을 디지털로 옮겼다는 개인 경험을 언급하며 파일 예제로 들어간다.[^64] 파이썬은 몇 줄로 파일에 쓰고 읽을 수 있다고 하며 open()을 소개한다.[^64]

open(파일명, 모드, encoding=...):

  • 모드는 크게 3가지 정도 기억하라고 하고, 예시에서는 쓰기/읽기 중심으로 진행한다.[^64]

파일 쓰기 모드(w)[^64]

  • f = open('list.txt', 'w', encoding='utf8')처럼 연다.[^64]
  • 파일이 있으면 덮어쓰고, 없으면 새로 만든다고 설명한다.[^64]
  • f.write('문장\n')로 텍스트를 쓰며 줄바꿈은 \n을 붙인다.[^64]
  • 작업 후 f.close()로 파일을 닫아야 한다고 강조한다.[^64]
  • 실행하면 파일이 생성되고 내용이 들어감을 확인한다.[^64]

파일 읽기 모드(r)[^64]

  • f = open('list.txt', 'r', encoding='utf8')로 연다.[^64]
  • contents = f.read()로 전체 읽기 후 출력 가능.[^64]
  • 역시 f.close() 필요.[^64]

줄 단위 처리[^64]

  • for line in f:로 한 줄씩 읽어 처리할 수 있다.[^64]
  • 이때 print는 기본적으로 줄바꿈이 있어 파일의 \n과 겹쳐 “불필요한 빈 줄”이 생길 수 있으니 print(..., end='') 같은 end 옵션을 활용하라고 안내한다.[^64]

3.39 with: 파일 자동 닫기(실수 방지), 권장 습관[^65]

📸 1:15:47

요리 후 불 끄기/손 씻고 수도 잠그기 비유로, 파일도 열었으면 닫아야 하는데 작업하다 보면 close()를 깜빡할 수 있다고 말한다.[^65]

해결이 with:

  • with open(...) as f: 형태로 쓰면, with 블록을 벗어날 때 파일을 자동으로 닫아 close() 호출이 필요 없다고 설명한다.[^65]
  • 쓰기/읽기 모두 동일 패턴으로 적용 가능하다.[^65]
  • “가급적 with를 사용하는 습관”을 권장한다.[^65]

3.40 클래스(OOP) 도입: 블랙박스 예시, 클래스=설계도+설명서, 객체/인스턴스[^66]

📸 1:17:12

블랙박스 정보를 변수(이름/해상도/가격/색상) 4개로 관리하니, 모델이 늘 때마다 변수도 계속 늘어 비효율적이라는 문제를 제시한다.[^66] 딕셔너리도 가능하지만, “충격 감지 시 이벤트 폴더 관리” 같은 기능까지 포함하려면 딕셔너리만으로는 무리가 있어 보인다며 클래스로 넘어간다.[^66]

클래스 핵심 개념:

  • 클래스는 “설계도와 설명서를 합친 것”으로 이해하라고 제안한다.[^66]
  • 설계도 하나로 여러 제품(객체)을 만들 수 있다(종이학 접기 책 비유).[^66]
  • 클래스로 만들어진 제품을 객체(object), 각 객체는 클래스의 **인스턴스(instance)**라고 설명한다.[^66]

3.41 클래스 정의/객체 생성/멤버변수: class, pass, 점(.) 접근, isinstance[^67]

📸 1:19:21

클래스 정의:

  • class ClassName: 형태, 다음 줄 들여쓰기 블록에 내용을 작성한다.[^67]
  • 클래스명은 보통 단어 조합에서 각 단어를 대문자로 시작하는 스타일을 쓴다고 설명(BlackBox).[^67]
  • pass는 “나중에 구현할 테니 일단 비워둔다”는 의미로, 약속은 잡았지만 뭘 할지 정하지 않은 것에 비유한다.[^67]

객체 생성:

  • b1 = BlackBox()처럼 클래스명을 함수 호출하듯 괄호를 붙여 생성.[^67]

멤버변수 부여:

  • b1.name = '까망이'처럼 점으로 변수 추가/대입 가능.[^67]
  • 출력: print(b1.name).[^67]

인스턴스 확인:

  • isinstance(b1, BlackBox)가 True면 b1은 BlackBox 인스턴스라고 설명한다.[^67]

3.42 __init__(생성자)로 초기화: 객체 만들 때 자동 실행, B2 에러 문제 해결[^68]

📸 1:21:55

b1에서만 name을 만들면, b2를 만들고 b2.name을 출력할 때는 name이 없어 에러가 난다고 문제를 제시한다.[^68] 이를 해결하기 위해 __init__을 도입한다.[^68]

  • def __init__(self, name, price):처럼 제품에 필요한 값을 매개변수로 받는다.[^68]
  • 내부에서 self.name = name, self.price = price로 멤버변수 초기화.[^68]
  • 객체 생성 시 b1 = BlackBox('까망이', 200000)처럼 값을 넣어 만들면, 생성과 동시에 멤버변수가 채워진다.[^68]
  • __init__은 객체가 생성될 때 자동으로 실행된다는 점을 기억하라고 한다.[^68]

3.43 멤버변수의 독립성 + 객체에만 변수 추가 가능[^69]

📸 1:23:23

__init__에서 정의한 name, price멤버 변수라고 부르며, 객체마다 서로 다른 값을 가질 수 있고 서로 독립적이라고 설명한다.[^69] 같은 디자인의 책상도 사람마다 용도가 다른 비유로 “같은 클래스에서 만들어져도 멤버 변수 값은 달라질 수 있다”고 말한다.[^69]

또한 특정 객체에만 추가 변수를 붙일 수 있다:

  • 예: b1.nickname = '1호'처럼 b1에만 변수 추가 가능.[^69]
  • 이 변수는 클래스에 정의되지 않았으므로 b2는 모른다고 설명한다.[^69]

3.44 메소드(method): 클래스 안의 함수, travel mode 기능, 전달값/self 의미[^70]

📸 1:24:16

클래스 안에 정의되는 함수는 메소드라고 부른다고 설명한다.[^70] 블랙박스의 “여행 모드” 기능(특정 시점부터 영상을 별도 폴더에 저장)을 메소드로 만든다.[^70]

  • 메소드 정의: def set_travel_mode(self):처럼 첫 인자는 self.[^70]
  • 호출: b1.set_travel_mode()처럼 객체를 통해 호출하면 “여행 모드 온” 출력.[^70]

전달값이 있는 메소드:

  • def set_travel_mode(self, minutes):처럼 만들고 b1.set_travel_mode(20)으로 “20분 동안 여행 모드” 같은 출력이 되게 한다.[^70]

self의 의미:

  • self는 “객체 자기 자신”.[^71]
  • 메소드 정의에는 self 포함이지만, 호출 시에는 self를 제외한 나머지 값만 전달하는 이유를 설명한다.[^71]
  • 클래스명을 직접 써서 BlackBox.set_travel_mode(b1, 20)처럼 호출하면, b1이 self로 들어가고 20이 minutes로 들어가는 구조가 되어 1)객체.메소드 호출과 2)클래스.메소드(객체, ...) 호출이 동일하다는 것을 보여준다.[^71]
  • 헷갈리면 “메소드 첫 인자는 self”와 “self.멤버변수로 접근” 두 가지만 기억하라고 정리한다.[^71]

3.45 상속(inheritance): 중복 코드 제거, 부모/자식 클래스, 기능 확장[^72]

📸 1:27:59

기본 블랙박스와 여행 모드 지원 블랙박스를 분리해 팔려는데, 두 클래스에 중복 코드(__init__ 등)가 많아 비효율적이라고 말한다.[^72]

상속 개념:

  • 부모의 코드를 물려받아 그대로 쓰고 필요한 것만 확장하는 것.[^72]
  • class TravelBlackBox(BlackBox):처럼 괄호에 부모 클래스를 넣으면 BlackBox의 모든 것을 상속받는다.[^72]
  • 부모 클래스(기본 블랙박스) / 자식 클래스(여행모드 지원) 용어를 소개한다.[^72]
  • 객체 생성/사용은 동일하며, 자식 객체는 부모의 __init__으로 초기화되고 자식이 추가한 메소드도 사용할 수 있다.[^72]

3.46 자식 클래스에서 __init__ 확장: SD카드 용량 추가 + 부모 생성자 호출(직접 호출 vs super())[^73]

📸 1:30:08

여행 모드 지원 모델에 저장공간(SD 64GB/128GB) 옵션이 추가되며, 자식 클래스에 sd 멤버 변수가 필요해져 __init__을 다시 정의한다.[^73]

여기서 중요한 포인트는 “상속을 했는데 __init__이 다시 생겼다”가 아니라, 부모의 초기화(name/price)는 재사용하고 자식에서 sd만 추가하면 된다는 구조다.[^73]

  • 부모 생성자 직접 호출: BlackBox.__init__(self, name, price)로 name/price 초기화를 부모에게 맡김.[^73]
  • super() 사용: 부모를 “누구누구 님”처럼 부르기보다 “부모”로 부르는 느낌으로, super().__init__(name, price) 형태를 소개하며 super()는 괄호가 필요하고 self 전달이 필요 없다는 주의점을 준다.[^73]

3.47 다중 상속(multiple inheritance): VideoMaker/ MailSender 기능 가져오기[^74]

📸 1:32:12

여행 영상 편집 기능이 다른 제품(360도 카메라)에 이미 구현되어 있고, 클래스를 상속받으면 쓸 수 있다고 하며 VideoMaker를 예로 든다.[^74] 하지만 TravelBlackBox는 이미 BlackBox를 상속 중이어서 “어떡하죠?”를 던지고, 해결이 다중 상속이라고 설명한다.[^74]

  • class TravelBlackBox(BlackBox, VideoMaker):처럼 콤마로 여러 부모 클래스를 나열하면 된다.[^74]
  • 객체를 만든 뒤 b1.make()를 호출하면 VideoMaker로부터 상속받은 기능이 실행된다고 설명한다.[^74]

이어서 메일 전송 기능 MailSender도 추가해 class TravelBlackBox(BlackBox, VideoMaker, MailSender):로 확장하고, make()send()로 메일 발송까지 하게 한다.[^74]

3.48 메소드 오버라이딩(overriding): 자식에서 같은 메소드 재정의해 동작 확장[^75]

📸 1:33:56

“개선 버전”으로 여행 모드가 끝나면 자동으로 영상 제작과 메일 발송까지 하고 싶다는 요구를 만든다.[^75] 이를 위해 AdvancedTravelBlackBox를 만들고 TravelBlackBox를 상속받은 뒤, set_travel_mode를 자식 클래스에서 다시 정의한다.[^75]

  • 같은 이름의 메소드를 자식이 정의하면 부모 메소드를 “덮어쓴다”.[^75]
  • TravelBlackBox 객체로 호출하면 원래 동작만, AdvancedTravelBlackBox 객체로 호출하면 오버라이딩된 동작(영상 제작+메일 발송 포함)이 실행된다고 비교한다.[^75]
  • 이 개념을 메소드 오버라이딩이라고 명명한다.[^75]

3.49 pass: “나중에 구현”용, 클래스/함수/조건/반복 어디서나 가능[^76]

📸 1:35:36

pass를 “나중에 할 테니 일단 넘어두라”는 의미로 재설명한다.[^76] 클래스 설계 시 필요한 메소드들을 먼저 나열해 뼈대를 만들고, 아직 구현 못 한 곳에 pass를 두면 호출해도 에러가 안 나 “우선 완성된 형태”로 둘 수 있다고 한다.[^76] 또한 pass는 클래스/메소드뿐 아니라 반복문, 조건문, 함수 등에도 쓸 수 있다고 확장한다.[^76]

3.50 예외 처리(try/except/else/finally): 에러가 나도 프로그램을 멈추지 않게[^77]

📸 1:36:26

실생활의 예상치 못한 상황(교통카드 잔액 부족, 캠핑 재료 누락, 배터리 부족) 비유로, 프로그램도 0으로 나누기/형변환 실패/없는 인덱스 접근 같은 에러가 발생할 수 있다고 말한다.[^77] 에러를 처리하지 않으면 프로그램이 멈추므로, 이를 다루는 것이 예외 처리라고 정의한다.[^77]

기본 구조:

  • try: 블록에 실행할 코드.[^77]
  • except: 에러가 나면 실행할 코드.[^77]
  • else: try가 문제 없이 끝났을 때 실행할 코드.[^77]
  • finally: 에러 여부와 무관하게 항상 마지막에 실행할 코드.[^77]

나누기 예시:

  • num1=3, num2=0이면 나누기에서 에러 발생 → except 실행 → finally 실행.[^78]
  • num2=3이면 try 성공 → else 실행 → finally 실행.[^78]

예외 처리 조합 4가지도 정리한다:

  • try-except, try-finally, try-except-else, try-except-else-finally.[^78]
  • try는 except 또는 finally와 반드시 짝이어야 한다고 설명한다.[^78]

3.51 에러 메시지 확인 + 특정 예외별 처리: Exception as err, ZeroDivisionError, TypeError[^79]

📸 1:39:24

도서관 대출이 “안 된다”만 들으면 답답하듯, 에러도 “에러 발생”만 알면 원인 파악이 어렵다고 비유한다.[^79] 그래서 에러 내용을 확인해야 한다고 말한다.[^79]

  • except Exception as err:로 에러 객체를 받고 print(err)로 에러 메시지를 출력하면 “무슨 에러인지/왜인지”를 확인할 수 있다고 설명한다.[^80]
  • Exception은 모든 에러의 기본 클래스라 포괄적으로 잡을 수 있지만, 상황별로 다른 처리가 필요하면 예외 종류를 구체적으로 나눌 수 있다고 한다.[^80]
    • 0으로 나누기: except ZeroDivisionError:로 처리.[^80]
    • 타입이 맞지 않을 때: except TypeError:로 처리.[^80]
  • 여러 except를 나열하고 마지막에 except Exception as err:로 기타 예외를 처리하는 구조도 가능하다고 설명한다.[^80]

또한 구글에서 파이썬 예외 종류를 찾아보면 다양한 에러 설명을 볼 수 있다고 안내한다.[^80]

3.52 모듈(module): 다른 파일의 코드 재사용, import vs from-import[^81]

📸 1:42:03

지난번에 만든 코드가 다른 작업에서도 필요할 수 있는데, 같은 파일이면 함수로 묶으면 되지만 “다른 파일이면?”이라는 질문으로 모듈을 소개한다.[^81]

  • 모듈: 코드가 작성된 하나의 파이썬 파일(.py)이며 변수/함수/클래스가 들어있을 수 있다.[^81]

예시:

  • goodjob.py 파일에 say() 함수를 만든다.[^81]
  • 다른 파일에서 사용:
    1. import goodjobgoodjob.say()로 사용.[^81]
    2. from goodjob import saysay()로 바로 사용.[^81]

차이:

  • import 모듈: 모듈 전체를 가져와 모듈 내 기능을 다 쓸 수 있게 함.[^81]
  • from 모듈 import 대상: 필요한 것만 가져옴.[^81]

내장 모듈 예:

  • random 모듈을 import하고, 가위바위보 리스트에서 random.choice()로 랜덤 선택.[^82]
  • 파이썬 표준 라이브러리 목록(설치 시 자동 제공)을 검색해 확인할 수 있다고 안내한다.[^82]

3.53 패키지(package): 여러 모듈의 묶음(폴더), 패키지.모듈 형태의 import[^83]

📸 1:44:34

여러 모듈이 모이면 패키지라고 설명하며, 패키지는 “하나의 폴더”라고 정의한다.[^83]

예시 구조:

  • nadocoding/ 폴더(패키지) 안에 goodjob.py, goodbye.py 모듈이 있고, 같은 레벨에 practice.py가 있다.[^83]

사용법:

  • import nadocoding.goodjobnadocoding.goodjob.say()로 호출.[^84]
  • from nadocoding import goodbyegoodbye.bye()로 호출.[^84]
  • 여러 모듈 동시 import: from nadocoding import goodjob, goodbye 후 각 모듈 함수 사용.[^84]

4. 핵심 통찰[^1]

  1. [h “개념→즉시 확인” 구조가 초보 학습의 핵심이다] 1분 설명은 압축이 강하므로, 문제를 멈춰 풀고 해설로 검증하는 루프가 이해를 완성한다.[^11][^3]
  2. [h 파이썬의 많은 개념은 ‘자료형’과 ‘블록(들여쓰기)’로 귀결된다] 문자열/리스트/딕트 순회, 입력값의 형변환, 조건/반복/함수/클래스 블록이 모두 여기에서 실수가 난다.[^52][^63]
  3. [h “왜 필요한가”를 비유로 잡으면 문법이 외워지지 않고 이해된다] 변수=봉투, 리스트=비닐봉투, 주석=대본 메모, 인덱스=주차칸 번호 같은 비유로 추상 개념을 현실 문제로 치환한다.[^9][^33][^22][^25]
  4. [h 재사용의 단계가 있다: 함수 → 모듈 → 패키지] 같은 로직이 반복되면 함수로, 파일이 달라지면 모듈로, 모듈이 많아지면 패키지로 관리한다는 흐름으로 정리된다.[^54][^81][^83]
  5. [h 안전한 프로그램의 기본은 예외처리와 자원관리(with)다] 에러를 메시지까지 확인하고, 파일은 with로 자동 닫기를 습관화하라는 권고가 실제 개발 습관으로 연결된다.[^65][^80]
  6. [h 객체지향은 “데이터+기능”을 한 덩어리로 관리하려는 실용적 이유에서 시작된다] 블랙박스 예시에서 변수/딕셔너리의 한계를 기능(메소드)으로 넘어가며 클래스 필요성이 생긴다.[^66][^70]
  • 실행 시사점(콘텐츠 흐름대로 따라 하기)
    • input() 결과는 문자열이므로 숫자 비교/연산 전 int() 변환을 습관화한다.[^63]
    • 파일은 open/close보다 with open(...) as f: 패턴을 기본으로 쓴다.[^65]
    • 리스트 중복 제거가 필요하면 “순서가 중요하면 dict.fromkeys, 중요하지 않으면 set”을 선택한다.[^42]

5. 헷갈리는 용어 정리[^1]

자료형: 값의 종류(문자열/숫자/불리언 등)로, 연산 가능 여부와 표현 방식이 달라진다.[^8]
형 변환: int/float/str/bool로 값의 자료형을 바꾸는 것.[^14][^21]
인덱스/인덱싱: 0부터 시작하는 “몇 번째” 위치, s[0]처럼 접근.[^25]
슬라이싱: s[시작:끝]으로 범위를 잘라 부분을 얻는 것(끝은 포함 X).[^26]
메소드: 문자열.lower()처럼 “객체가 가진 기능”을 호출하는 함수(클래스 내 함수).[^28][^70]
리스트/튜플/세트/딕셔너리: 여러 값을 관리하는 내장 자료형 4종(순서/중복/수정 가능 여부가 다름).[^41]
리스트 컴프리헨션: for/if를 한 줄로 써서 새 리스트를 만드는 문법.[^53]
전달값(파라미터): 함수 호출 시 함수에 넘겨주는 값(함수 안에서만 사용).[^55]
반환값(return): 함수가 계산 결과를 호출한 쪽으로 돌려주는 값(리턴 즉시 함수 종료).[^56]
가변 인자: *args로 개수가 바뀌는 전달값을 받는 방식(튜플로 받음, 마지막에 1번만 가능).[^59]
지역변수/전역변수: 함수 내부에서만 유효한 변수 vs 어디서든 접근 가능한 변수.[^60][^61]
클래스/객체/인스턴스: 클래스=설계도+설명서, 객체=제품, 인스턴스=특정 클래스에서 만들어진 객체.[^66]
멤버 변수: 클래스 객체가 가지는 변수(객체마다 값이 다를 수 있음).[^69]
상속: 부모 클래스의 코드를 물려받아 재사용+확장.[^72]
다중 상속: 여러 부모 클래스로부터 동시에 상속.[^74]
오버라이딩: 자식 클래스가 부모와 같은 이름의 메소드를 다시 정의해 동작을 바꿈.[^75]
예외 처리: try/except 등으로 에러 상황에서도 프로그램이 멈추지 않게 처리.[^77]
모듈/패키지: 모듈=파이썬 파일 1개, 패키지=여러 모듈의 폴더 묶음.[^81][^83]


참고(콘텐츠 정보)[^1]

  • 제목: 파이썬 무료 강의 100분 완성 (1분 파이썬 모음)[^1]
  • 채널: 나도코딩[^1]
  • 길이: 106분 25초[^1]
  • 링크: https://www.youtube.com/watch?v=T6z-0dpXPvU[^1]

[^1]: 제공된 콘텐츠 메타데이터(제목/채널/길이/링크 및 전체 스크립트). [^2]: @[00:05] “기본표 영상이 너무 길어서… 새로운 강의를 준비” [^3]: @[00:49] “시험 문제는 5초 동안 보여주고… 화면을 잠깐 멈추신 다음…” [^4]: @[00:11]~@[00:33] “1분… 전반적으로… 파이썬… 배우기 쉬우면서도… 다양한 분야… 추천” [^5]: @[01:11] 이후 커리큘럼 전개(환경설정→문법→자료형→제어→함수/클래스→예외→모듈/패키지) [^6]: @[01:12:58]~@[01:13:26], @[54:26]~@[55:22], @[01:09:23]~@[01:11:18], @[01:15:47]~@[01:16:41] [^7]: @[01:11]~@[02:21] 파이썬/VSCode 설치, 폴더/파일 생성, 확장 설치, Hello World 실행 [^8]: @[02:26]~@[03:19] print 의미, 자료형(문자/숫자/불리언), 따옴표 주의, True/False 대문자 [^9]: @[03:33]~@[04:43] 변수 정의, 세뱃돈 봉투 비유, 선언/출력 [^10]: @[04:46]~@[05:54] 변수명 규칙, 예약어, 권장 네이밍 [^11]: @[00:11]~@[00:49] “1분 투자… 핵심… 시험 문제” [^12]: @[11:25]~@[12:47] 결혼식 사회자 대본 비유로 주석 설명 [^13]: @[12:50]~@[13:10] 인덱스 도입(주차장 비유) [^14]: @[05:57]~@[06:53] 형변환 개념, int/float/str 소개 [^15]: @[06:53]~@[07:11] 형변환 가능 형태/불가 사례(문자 ‘A’, ‘2.5’ 처리) [^16]: @[07:15] “실수를 정수로… 반올림 아닌 버림… 3이 아닌 2” [^17]: @[07:31]~@[08:11] 산술 연산자, %, //, ** [^18]: @[08:16]~@[08:46] 비교 연산자, ==, != [^19]: @[08:46]~@[09:13] 논리 연산자 and/or/not 예시 [^20]: @[09:22]~@[09:46] in / not in 멤버십 연산자 예시 [^21]: @[10:03]~@[11:20] bool 형변환, 빈 문자열/0/None 규칙 [^22]: @[11:25]~@[12:03] 주석 정의(부연 설명/메모) [^23]: @[12:06]~@[12:20] 주석 방법(#, """ """) [^24]: @[12:24]~@[12:47] 주석 사용 목적 [^25]: @[12:50]~@[13:48] 인덱스 0 시작, -1 접근 [^26]: @[13:48]~@[14:57] 슬라이싱 문법, 생략 규칙 [^27]: @[14:58]~@[16:20] 문자열 결합/+=, 숫자 복합대입, len, 여러줄 문자열 [^28]: @[16:37]~@[17:49] 문자열 메소드(lower/upper/capitalize/title/swapcase/split/count) [^29]: @[18:05]~@[19:12] startswith/endswith/strip/replace/find/center [^30]: @[19:14]~@[19:44] 공식 문서에서 문자열 메소드 찾기 안내 [^31]: @[19:46]~@[21:13] print 콤마, format, 인덱스 format, f-string [^32]: @[21:30]~@[23:10] 따옴표 충돌, 탈출문자, \ 경로, \n 줄바꿈 [^33]: @[23:12]~@[24:21] 리스트 비유(비닐봉투), 선언/중복/혼합/빈 리스트 [^34]: @[24:37]~@[25:47] 리스트 인덱싱/순서/len/in, 수정, append/remove/extend 등 [^35]: @[26:02]~@[27:11] 튜플(읽기 전용) 비유, 특징/사용 [^36]: @[27:24]~@[28:41] 패킹/언패킹, * 언패킹, 나머지 리스트 주의 [^37]: @[28:43]~@[30:10] 세트 특징, 교/합/차집합 메소드 [^38]: @[30:30]~@[31:25] 세트 인덱스 접근 불가, add/remove/clear/del [^39]: @[31:45]~@[33:14] 딕셔너리 정의, 선언, 키/밸류, 접근 [^40]: @[33:18]~@[34:31] get/update/pop/clear/keys/values/items [^41]: @[34:47]~@[36:39] 4가지 자료형 비교 및 사용처 정리(3.7부터 dict 순서보장 포함) [^42]: @[36:42]~@[38:17] 튜플↔리스트 변환, set로 중복 제거(순서 깨짐), dict.fromkeys로 순서 유지 중복 제거 [^43]: @[38:34]~@[40:34] if 기본/else, 들여쓰기, 일요일 예시 [^44]: @[40:52]~@[42:22] elif, else 생략 가능, 흐름 설명 [^45]: @[42:39]~@[45:12] if 중첩, 옐로카드 누적/퇴장 예시 [^46]: @[45:15]~@[46:41] for 문법, range(10), 0~9, 변수명 임의 [^47]: @[46:58]~@[48:09] range(start, stop, step) 상세 예시(홀수/짝수/배수) [^48]: @[48:30]~@[49:40] 리스트/튜플/딕셔너리/문자열 순회 [^49]: @[49:58]~@[51:26] while, 캐리어 무게 예시, 24kg/8개 결과 [^50]: @[51:43]~@[52:54] break 비유, 시즌3부터 중단 예시 [^51]: @[53:13]~@[54:07] continue, 시즌3 건너뛰기 예시 [^52]: @[54:26]~@[55:22] 들여쓰기 블록, 콜론 문법, 스페이스 4칸 관례 [^53]: @[55:34]~@[58:06] 리스트 컴프리헨션, 리콜 제품 예시, x 변환/조건 [^54]: @[58:23]~@[01:00:54] 함수 필요성(미용실 예시), def/호출/흐름 [^55]: @[01:00:57]~@[01:02:20] 전달값(파라미터) 적용, “함수 안에서만 사용” [^56]: @[01:02:34]~@[01:04:15] 반환값, VIP 분기, return 즉시 탈출 [^57]: @[01:04:31]~@[01:05:40] 기본값, 짜장면 비유, 기본값 False [^58]: @[01:05:57]~@[01:07:08] 키워드 인자, 필요한 할인만 지정, 순서 무관 [^59]: @[01:07:27]~@[01:09:19] 가변 인자(*customers), 튜플로 받음, 마지막 1회 규칙 [^60]: @[01:09:23]~@[01:10:09] 지역변수, 함수 밖 접근 불가, 동일 이름이라도 다른 지역변수 [^61]: @[01:10:28]~@[01:11:18] 전역변수, 함수 내 같은 이름 할당 시 지역, global로 수정 [^62]: @[01:11:51]~@[01:12:35] input으로 이름 받기 [^63]: @[01:12:37]~@[01:13:26] input은 문자열, int로 감싸 숫자 비교 가능 [^64]: @[01:13:41]~@[01:15:45] open으로 파일 쓰기/읽기, write/read/close, 줄 단위 읽기와 end [^65]: @[01:15:47]~@[01:17:10] with로 자동 close, 권장 습관 [^66]: @[01:17:12]~@[01:19:03] 클래스 필요성(블랙박스), 클래스/객체/인스턴스 비유 [^67]: @[01:19:21]~@[01:21:20] class 정의, pass, 객체 생성, 점 접근, isinstance [^68]: @[01:21:55]~@[01:23:04] __init__로 초기화, 객체 생성 시 자동 실행 [^69]: @[01:23:23]~@[01:24:14] 멤버변수, 객체별 독립, 객체에만 변수 추가 가능 [^70]: @[01:24:16]~@[01:25:52] 메소드 정의/호출, 전달값(minutes) [^71]: @[01:26:09]~@[01:27:43] self 의미, 클래스명으로 직접 호출 vs 객체 호출 동일성 [^72]: @[01:27:59]~@[01:30:06] 상속, 중복 제거, 부모/자식 클래스 [^73]: @[01:30:08]~@[01:31:56] 자식 init 확장(sd), 부모 호출, super() [^74]: @[01:32:12]~@[01:33:40] 다중 상속(VideoMaker, MailSender), make/send 사용 [^75]: @[01:33:56]~@[01:35:16] 오버라이딩(AdvancedTravelBlackBox), 동작 확장 비교 [^76]: @[01:35:36]~@[01:36:09] pass의 용도, 여러 문법에서 사용 가능 [^77]: @[01:36:26]~@[01:37:32] 예외 처리 정의, try/except/else/finally 구조 [^78]: @[01:37:38]~@[01:39:04] 나누기 예시, 실행 결과, 예외 처리 유형 4가지 [^79]: @[01:39:24]~@[01:39:56] 도서관 비유로 에러 원인/종류 안내 필요성 [^80]: @[01:40:03]~@[01:41:28] Exception as err, ZeroDivisionError/TypeError 별 처리, 다중 except [^81]: @[01:42:03]~@[01:43:35] 모듈 정의, import vs from-import, goodjob 예시 [^82]: @[01:43:41]~@[01:44:19] random 모듈, choice, 표준 모듈 목록 안내 [^83]: @[01:44:34]~@[01:45:13] 패키지 정의(폴더), 예시 구조 설명 [^84]: @[01:45:18]~@[01:46:07] 패키지 import 방법들, 다중 모듈 import

← 프로젝트에서 보기