← 강의 페이지 화학공학을 위한 AI 6 / 15

6장 생성 코드 읽기 II: AI 오답 채점과 교정

이번 주의 실습: 모의 시험1. 시험1(7주차)의 지필 리허설이다

다음 상황을 생각해 보자. 화공양론 과제를 검산하려고 AI에게 "25 °C, 1 atm에서 이상기체 1 mol의 부피를 리터로 구해 줘"라고 요청했다. 몇 초 만에 깔끔한 함수가 도착했고, 실행하니 "부피: 2.05 L"가 출력됐다. 에러는 한 줄도 없었다.

그런데 일반화학에서 외운 숫자가 마음에 걸린다. 0 °C, 1 atm에서 기체 1 mol은 약 22.4 L를 차지한다. 온도가 더 높아졌는데 부피가 10분의 1로 줄어들 수 있는가. 코드가 돌아갔다는 사실과 답이 맞다는 사실은 별개의 문제다. 이 장은 그 간극을 채점자의 눈으로 메우는 기술을 다룬다.

이 장에서 다루는 것

  • 오류의 세 유형(문법·런타임·의미 오류)과 각각이 드러나는 방식을 구분한다
  • 트레이스백을 아래에서 위로 읽어 오류의 병명과 위치를 찾는 절차를 익힌다
  • AI가 낸 틀린 화공 계산을 검증 루틴 3종으로 채점·교정하는 프로토콜을 연습한다
  • 가설 기반 디버깅 프롬프트 3패턴을 정리한다
  • 모의 시험1을 치르고 자가 진단표를 만든다

학습목표 이 장을 마치면 다음을 할 수 있다.

  1. 주어진 오류 사례를 문법 오류·런타임 오류·의미 오류로 분류할 수 있다.
  2. 트레이스백에서 예외 이름·발생 위치·호출 경로를 지목할 수 있다.
  3. AI가 낸 화공 계산 풀이를 검증 루틴 3종으로 채점하고 판정 근거를 쓸 수 있다.
  4. 틀린 코드에 대해 진단 프롬프트와 교정 프롬프트를 구분해 작성할 수 있다.
  5. 모의 시험 결과를 자가 진단표로 분류하고 시험1 대비 보완 계획을 세울 수 있다.

6.1 오류의 세 얼굴: 문법, 런타임, 의미

프로그램이 틀리는 방식은 크게 세 가지다. 셋은 드러나는 시점이 다르고, 파이썬이 도와주는 정도와 위험한 정도도 다르다. 채점의 첫 단계는 지금 눈앞의 오류가 셋 중 무엇인지 판별하는 일이다.

파이썬 문법 규칙을 어겨 실행이 아예 시작되지 못하는 오류를 문법 오류(syntax error)라 한다. 괄호 짝이 안 맞거나 if 뒤의 콜론을 빠뜨린 경우가 대표적이다. 파이썬은 프로그램을 시작하기 전에 멈춰 서서 위치를 알려 주므로, 셋 중 가장 값싸게 고칠 수 있다.

실행 도중 더 진행할 수 없는 상황을 만나 프로그램이 멈추는 오류를 런타임 오류(runtime error)라 한다. 0으로 나누거나, 정의한 적 없는 이름을 부르는 경우다. 이때 파이썬이 발생시키는 신호를 예외(exception)라 하며, 예외가 나면 파이썬은 무엇이 어디에서 잘못됐는지를 담은 보고서를 출력한다. 이 보고서를 읽는 법이 6.2절의 주제다.

프로그램이 끝까지 돌고 출력도 내놓지만, 의도한 것과 다른 일을 하는 오류를 의미 오류(semantic error)라 한다. 장 첫머리의 2.05 L가 정확히 이것이다. 파이썬은 오류를 알리지 않았다. 시킨 계산을 충실히 수행했을 뿐이고, 틀린 것은 계산의 설계였다.

표 6-1 오류의 세 유형
유형드러나는 시점파이썬이 알려주는가화공 계산에서의 예
문법 오류실행 시작 전알려준다 (위치 표시)괄호 누락으로 실행 불가
런타임 오류실행 도중알려준다 (트레이스백)몰분율 계산에서 총 몰수 0으로 나눔
의미 오류드러나지 않을 수 있음알려주지 않는다섭씨 온도를 절대온도 자리에 대입

앞의 두 오류는 시끄럽다. 파이썬이 실행을 멈추고 오류를 알리므로 존재를 놓칠 수 없다. 의미 오류는 조용하다. 멀쩡해 보이는 숫자가 보고서와 설계 계산 속으로 흘러 들어간다. 셋 중 화학공학자에게 가장 위험한 것은 의미 오류다.

AI 생성 코드에서 이 균형은 의미 오류 쪽으로 더 쏠린다. AI는 방대한 코드로 훈련되어 문법적으로는 매끈한 코드를 내놓는다. 실행이 되니 맞아 보이고, 맞아 보이니 검증을 건너뛰게 된다. 프로그래밍 입문자가 AI 생성 코드를 정확히 이해한 비율이 32.5%에 그쳤다는 조사(arXiv 2504.19037)를 5장에서 보았다. 읽지 못한 코드 속의 의미 오류는 잡아내기 어렵다.

3장의 환각 문제와도 이어진다. AI가 날조한 물성값이나 존재하지 않는 함수가 코드에 들어오면, 어떤 것은 시끄러운 런타임 오류로, 어떤 것은 조용한 의미 오류로 나타난다. 다음 사례는 시끄러운 쪽이다. 그래서 오히려 다행인 경우다.

스스로 점검

  1. 코드가 끝까지 실행되고 그럴듯한 값을 출력했다. 이때 아직 배제되지 않은 오류 유형은 무엇인가?
  2. AI 생성 코드에서 문법 오류가 드문 이유를 한 문장으로 설명하라.

해답은 권말 부록에 있다.

6.2 트레이스백: 에러 메시지를 읽는 법

런타임 오류를 직접 만나 보자. 코드 6-1은 이상기체의 몰부피를 구하려는 함수인데, 안에 실수가 하나 심어져 있다.

코드 6-1 이름 오류가 심어진 몰부피 함수 (molar_volume.py)
R = 8.314  # J/(mol·K), 출처: NIST CODATA

def molar_volume(T, P):
    """이상기체 몰부피 [m^3/mol]. 입력: T[K], P[Pa]"""
    return R * T_kelvin / P

v = molar_volume(298.15, 101325.0)
print(v)

실행하면 계산 결과 대신 다음 보고서가 출력된다. 요약하지 않고 전문을 싣는다.

Traceback (most recent call last):
  File "molar_volume.py", line 7, in <module>
    v = molar_volume(298.15, 101325.0)
  File "molar_volume.py", line 5, in molar_volume
    return R * T_kelvin / P
NameError: name 'T_kelvin' is not defined

런타임 오류가 나면 파이썬은 예외의 이름, 문제가 일어난 줄, 그리고 그 줄에 도달하기까지의 함수 호출 경로를 담은 보고서를 출력한다. 이 보고서를 트레이스백(traceback)이라 한다. 첫 줄의 "most recent call last"가 읽기 방향을 알려 준다. 사고 현장인 가장 최근의 호출이 맨 아래에 있다.

그래서 트레이스백은 아래에서 위로 읽는다. 첫째, 마지막 줄을 본다. NameError가 병명이고, name 'T_kelvin' is not defined가 증상 설명이다. 둘째, 바로 위 블록에서 발병 위치를 확인한다. molar_volume.py의 5행, molar_volume 함수 안이다. 셋째, 더 위 블록으로 올라가면 그 함수를 누가 불렀는지가 나온다. 7행의 최상위 호출이다.

병명과 위치가 나왔으니 원인 진단은 짧다. 함수의 매개변수 이름은 T인데 본문에서는 T_kelvin이라는, 어디에서도 정의된 적 없는 이름을 썼다. T_kelvin을 T로 고치거나 매개변수 이름을 T_kelvin으로 바꾸면 해결된다. 파이썬 버전에 따라 문제 지점 아래에 ^ 기호가 추가로 표시되기도 하는데, 읽는 순서는 같다.

예외의 이름은 원인의 범주를 바로 좁혀 준다. 자주 만나는 여섯 가지를 표 6-2에 모았다. 시험1에서도, 앞으로의 모든 실습에서도 이 여섯이 마주칠 예외의 대부분을 차지한다.

표 6-2 자주 만나는 예외 6종과 흔한 원인
예외 이름뜻흔한 원인
NameError정의되지 않은 이름을 사용변수명 오타, 정의 전에 사용
TypeError자료형이 연산과 맞지 않음문자열과 수를 연산, 인자 개수 잘못
ValueError형은 맞으나 값이 부적절float()에 숫자가 아닌 문자열 전달
IndexError인덱스가 범위를 벗어남리스트 길이 이상의 인덱스 접근
KeyError딕셔너리에 없는 키 조회물질명 오타, 등록 안 된 단위 기호
ZeroDivisionError0으로 나눔총량이 0인 입력으로 분율 계산

이 중 ValueError는 화공 데이터 처리에서 유난히 자주 만난다. 센서 로그나 CSV에서 읽은 값에는 단위 문자가 붙어 있는 경우가 많기 때문이다. 대화형 셸에서 직접 재현해 보자.

>>> float('25 C')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: '25 C'

'25 C'는 문자열로서는 멀쩡하지만 수로 변환될 수 없는 값이다. 형은 맞고 값이 문제이므로 TypeError가 아니라 ValueError다. 이 구분이 되면 교정 방향이 자동으로 나온다. 단위 문자를 떼어내는 전처리가 필요하다.

마지막 규칙 하나. 에러 메시지는 요약하거나 의역하지 말고 전문 그대로 다뤄라. 검색할 때도, AI에게 물을 때도, 위키에 기록할 때도 원문 문자열이 그대로 있어야 같은 오류를 겪은 다른 사람의 해법과 연결된다. 지면의 트레이스백을 전부 전문으로 싣는 이유가 이것이다.

스스로 점검

  1. 트레이스백에서 가장 먼저 읽어야 할 줄은 어디이고, 거기에서 무엇을 얻는가?
  2. float('3.5e2')와 float('350 K') 중 예외를 일으키는 쪽은 어느 것이며, 예외 이름은 무엇인가?

6.3 오답의 채점: 검증 루틴을 채점 기준으로 바꾼다

AI 협업 사이클. 이번 장은 ④ 생성 코드 읽기에서 ⑤ 테스트, ⑥ 화공 검증으로 무게를 옮긴다
  1. 문제 정의
  2. 분해
  3. 프롬프트
  4. 생성 코드 읽기
  5. 테스트
  6. 화공 검증

3주차에 도입한 검증 루틴 3종(단위 체크, 대조값, 극한값)은 지금까지 자신의 코드를 지키는 방패였다. 이번 절에서는 같은 루틴을 AI의 풀이를 채점하는 잣대로 돌려세운다. 방패가 채점 기준표가 되는 셈이다.

채점은 네 단계 절차로 고정한다. 첫째, 실행하기 전에 수식과 단위를 손으로 추적한다. 각 변수에 단위를 붙여 보고 등호 양변의 단위가 맞는지 본다. 둘째, 대조값 1점을 정한다. 교과서나 NIST에서 이미 아는 값 하나를 고른다. 셋째, 극한값을 머리로 대입해 본다. 0, 음수, 아주 큰 값에서 물리적으로 말이 되는 답이 나오는 구조인가. 넷째, 판정문을 쓴다. 틀린 줄 번호, 원인, 교정 방향을 완결 문장으로 적는다.

시험1의 문항 유형 ③ "AI가 낸 오답을 채점·교정하라"가 요구하는 것이 정확히 이 절차다. 지필 시험이므로 실행 단계가 없다. 컴퓨터 없이 ①~④를 해내는 훈련이 이 절의 목표다. 장 첫머리의 사건으로 돌아가 실제로 채점해 보자.

예제 6.3-1 AI가 낸 이상기체 부피 풀이를 채점하라

문제 아래 프롬프트에 대해 AI가 생성한 코드와 실행 결과가 주어져 있다. 이 풀이를 채점 4단 절차로 채점하고, 틀렸다면 원인과 교정 방향을 판정문으로 써라. 이상기체 상태방정식은 다음과 같다.

PV = nRT (6.1)

풀이 전략 시험1과 같은 조건(실행 없이 지필)으로 채점한다. 식 (6.1)에서 기체상수 R = 8.314 J/(mol·K)의 단위 분모에 K가 있으므로, 온도 자리에 들어가는 값의 단위부터 추적한다. 대조값으로는 일반화학의 상식을 쓴다. 0 °C, 1 atm(= 101.325 kPa)에서 이상기체 1 mol의 부피는 약 22.4 L다.

25 °C, 1 atm에서 이상기체 1 mol의 부피를 리터로 구하는 파이썬 코드를 짜 줘.

코드 6-2 AI가 생성한 풀이 (검증 전)
def ideal_gas_volume(n, T, P):
    """이상기체 부피를 계산한다."""
    R = 8.314  # 기체상수
    V = n * R * T / P
    return V

# 25 °C, 1 atm에서 1 mol
volume = ideal_gas_volume(1.0, 25, 101325)
print(f"부피: {volume * 1000:.2f} L")

✔ 실행 결과: 부피: 2.05 L. 식의 형태는 (6.1)과 일치하고 압력은 Pa로 옳게 들어갔다. 그러나 8행에서 T 자리에 섭씨 값 25를 그대로 넘겼고, 함수 안 어디에도 절대온도 변환이 없다. 주석에 단위가 하나도 없다는 점이 이 실수를 숨겼다.

  • 단위: R = 8.314 J/(mol·K)의 분모는 K인데 대입된 25는 °C다. 단위가 일치하지 않는다. 온도 변환식 T[K] = T[°C] + 273.15 (6.2) 가 코드에 없다.
  • 대조값: 0 °C, 1 atm에서 약 22.4 L(일반화학 상식, 식 (6.1)로 재계산해도 8.314 × 273.15 / 101325 ≈ 0.0224 m³). 그보다 더운 25 °C에서 2.05 L는 10배 이상 어긋난다.
  • 극한값: 이 코드에 T = 0(섭씨 0도)을 넣으면 부피가 정확히 0, 음수 섭씨를 넣으면 음수 부피가 나온다. 절대온도 미변환의 전형적 신호다.

분석 판정문: "8행에서 섭씨 25를 절대온도 변환 없이 식 (6.1)의 T에 대입했다. 식 (6.2)로 298.15 K를 만들어 대입해야 하며, 올바른 결과는 약 24.5 L다." 이 오답은 문법 오류도 런타임 오류도 아닌 순수한 의미 오류였고, 검증 루틴 세 개 모두에 걸렸다. 하나만 성실히 돌렸어도 잡혔다는 뜻이다. 이 예제에서 얻을 교훈은 두 가지다. 프롬프트에 단위를 썼다고 AI가 단위를 지키는 것은 아니라는 것, 그리고 극한값 체크는 실행 없이 머리로도 돌릴 수 있다는 것이다. 교정 코드를 받은 뒤 T에 −10 °C를 넣어 재실행해 보라. 교정 전 코드라면 음수 부피가 나왔을 입력이다.

채점이 끝났으면 교정을 요구할 차례다. 원인을 이미 알고 있으므로 교정 프롬프트는 구체적으로 쓸 수 있다. "고쳐줘" 대신 무엇을 어떻게 고칠지를 지정한다.

이 코드는 섭씨 온도를 절대온도로 변환하지 않고 기체상수 8.314 J/(mol·K)와 곱하고 있어. 함수가 섭씨를 입력받아 내부에서 273.15를 더해 켈빈으로 바꾸도록 고치고, 모든 변수에 단위 주석을 달아 줘. 절대온도가 0 이하가 되는 입력은 예외를 던지게 해.

코드 6-3 교정된 풀이
R = 8.314  # 기체상수 [J/(mol·K)], 출처: NIST CODATA

def ideal_gas_volume(n, T_celsius, P_pa):
    """이상기체 부피 [m^3]. 입력: n[mol], T[°C], P[Pa]"""
    T_kelvin = T_celsius + 273.15  # 절대온도 변환 [K]
    if T_kelvin <= 0:
        raise ValueError("절대온도는 0 K보다 커야 한다")
    return n * R * T_kelvin / P_pa

v = ideal_gas_volume(1.0, 25.0, 101325.0)  # 25 °C, 1 atm
print(f"부피: {v * 1000:.1f} L")

✔ 실행 결과: 부피: 24.5 L. 대조값을 재확인하면, 같은 함수에 0 °C를 넣으면 22.4 L가 나와 일반화학 상식과 일치한다. 극한값을 재확인하면, −300 °C를 넣으면 ValueError가 나며 음수 부피는 더 이상 만들어지지 않는다. 매개변수 이름 자체(T_celsius, P_pa)에 단위가 들어가 다음 사람의 실수도 막는다.

생각해보기 이번 오답은 대조값과 10배 이상 어긋나서 쉽게 걸렸다. 만약 틀린 값이 그럴듯한 범위 안에 있다면(예: 참값 24.5 L에 대해 26 L) 무엇으로 잡을 수 있는가? 방법을 두 가지 제안하라.

6.4 디버깅 프롬프트 전략: 가설이 먼저다

채점으로 원인을 찾았다면 다음은 고치는 일이다. 이 일을 디버깅(debugging)이라 한다. 검증된 프로그래밍 교재들은 디버깅을 네 가지 활동으로 정리한다. 읽기(코드를 다시 읽고 의도와 대조), 실행(바꿔 가며 돌려 보기), 숙고(증상에서 원인을 추리), 후퇴(최근 변경을 되돌려 작동하던 버전으로 복귀)이다. 초보자의 흔한 함정은 이 중 하나에만 매달리는 것이다.

디버깅은 실험 과학처럼 진행해야 한다. 원인에 대한 가설을 최소 하나 세우고, 가설이 맞다면/틀리다면 무엇이 관찰될지를 정한 뒤, 그것을 확인하는 실험(실행)을 설계한다. 가설 없이 코드를 무작위로 바꿔 가며 되기를 비는 방식을 무작위 행보 프로그래밍(random walk programming)이라 부르는데, 오래 걸리기로 악명이 높다.

AI 시대의 무작위 행보는 "고쳐줘"의 무한 반복이다. AI는 매번 그럴듯한 수정본을 내놓기 때문에 진전처럼 느껴지지만, 원인 진단이 없으므로 수렴이 보장되지 않고 코드는 반복 수정으로 점점 읽기 어려워진다. 나쁜 예부터 지면에 올린다.

안 돼. 아직도 값이 이상해. 그냥 고쳐줘.

(AI가 함수 구조를 통째로 바꾼 수정본을 제시. 무엇이 왜 바뀌었는지 설명 없음, 발췌 생략)

✔ 게재 이유: 이렇게 하지 말라는 견본이다. 증상 정보가 0이므로 AI는 추측으로 고칠 수밖에 없고, 진단 없는 수정은 검증할 기준도 없다. 어디가 바뀌었는지 모르는 코드는 채점 절차를 처음부터 다시 돌아야 한다.

좋은 디버깅 프롬프트는 세 패턴으로 요약된다. 패턴 1은 진단 요구다. 에러 메시지 전문과 코드를 주되, 수리를 시키지 않고 진단만 시킨다. "고치지 말고, 원인 후보 3개와 각각을 확인할 방법을 말하라." 후보를 받으면 확인 실험은 직접 한다. 원인을 확정하는 주체가 자신이어야 다음 단계의 교정 프롬프트를 구체적으로 쓸 수 있다.

패턴 2는 기대–실제 병기다. 의미 오류에는 에러 메시지가 없으므로 증상을 수치로 만들어 줘야 한다. "기대값은 약 24.5 L(근거: 0 °C에서 22.4 L), 실제 출력은 2.05 L로 약 12배 작다. 이 배율 차이를 만들 수 있는 원인부터 짚어라." 기대와 실제의 차이 크기 자체가 강력한 진단 단서다.

패턴 3은 역할 전환이다. 문제를 남에게 소리 내어 설명하다가 스스로 답을 찾는 기법을 고무 오리 디버깅(rubber duck debugging)이라 한다. AI와 함께라면 방향을 뒤집을 수 있다. "이 코드를 한 줄씩, 각 줄에서 변수의 단위가 무엇인지와 함께 설명하라." 설명을 읽는 쪽이 되면 자신이 쓴 프롬프트의 가정과 코드의 실제 동작 사이의 틈이 보인다. 예제 6.3-1의 코드에 이 프롬프트를 걸면 "T에 25가 들어온다"는 설명 줄에서 단위가 비어 있음이 드러난다.

세 패턴 모두에 통하는 보조 기술이 하나 있다. 문제를 일으키는 가장 작은 코드와 입력으로 줄여서 묻는 것이다. 이렇게 줄인 사례를 최소 재현 예제(minimal reproducible example)라 한다. 500행짜리 파일 전체 대신 예외를 일으키는 함수 하나와 입력 한 줄로 줄이면, 줄이는 과정에서 원인이 먼저 드러나는 일도 흔하다.

마지막으로 경계할 것은, AI의 교정이 원인 제거가 아니라 증상 은폐일 수 있다는 점이다. 교정 코드를 받으면 반드시 차이를 읽고 "원인을 없앴는가, 신호를 껐는가"를 물어야 한다.

스스로 점검

  1. "고쳐줘" 반복이 무작위 행보 프로그래밍과 같은 이유를 한 문장으로 설명하라.
  2. 의미 오류를 AI에게 보고할 때 에러 메시지 대신 무엇을 제공해야 하는가?

6.5 시험1 안내: AI 없이 남는 것을 잰다

다음 주 시험1은 20점, 오프라인 지필이며 AI는 전면 금지다. 범위는 1~6주 누적이다. 최종 시험이 AI를 필수로 쓰는 실기인데 왜 첫 시험은 정반대인가. 최종 시험에서 AI를 전면 사용하기 때문이다. AI 없이 남는 개인의 두뇌, 곧 코드 읽기·검증·의사코드 설계 능력은 반대 조건에서만 따로 잴 수 있다. 이 수업의 AI 활용 규칙(시험1 금지, 시험2·최종 시험 필수)은 이 논리 위에 서 있다.

문항 유형은 네 가지다. ① 생성 코드 출력 예측 ② EiPE(제시된 AI 생성 코드를 한국어로 목적·동작 설명) ③ "AI가 낸 오답을 채점·교정하라"(단위 오류·날조 물성 포함) ④ 화공 계산문제의 의사코드 설계이다. 각 유형은 이미 이 책 어딘가에서 훈련했다. 표 6-3이 그 지도다.

표 6-3 시험1 문항 유형과 훈련 위치
문항 유형훈련한 곳이번 주 점검 방법
① 생성 코드 출력 예측5장 코드 해부, 각 장 스스로 점검모의 시험 문항 1
② EiPE 설명5장 EiPE, 5주차부터 구술모의 시험 문항 2
③ 오답 채점·교정이 장 §6.3 채점 4단모의 시험 문항 3
④ 의사코드 설계2장 문제 분해, 예제의 풀이 전략 단모의 시험 문항 4

대비 전략은 별것이 아니다. 이번 주 실습의 모의 시험을 실전 조건 그대로 치르고, 틀린 문항의 원인을 분류해 남은 일주일의 복습 우선순위를 정하는 것이다. 그 절차가 아래 실습이다.

실습 6: 모의 시험1 지필 리허설과 오답 리뷰 (무채점)

예상 소요: 모의 시험 60분 + 자가 채점·오답 리뷰 45분 + 위키 기록 15분. 타이머를 사용한다. 결과는 채점되지 않는다. 이 실습의 산출물은 점수가 아니라 자가 진단표다. 진단표가 정직할수록 남은 일주일의 복습 계획이 정확해진다.

준비물

필기구와 답안지(A4). 시험 단계에서는 노트북을 덮는다. 시험1과 동일하게 AI는 전면 금지다. 문항지는 실습 시작 시 배포한다(아래 견본과 같은 형식, 유형 ①~④ 각 1문항). 오답 리뷰 단계부터는 노트북과 AI를 다시 연다. 5장까지의 본인 위키가 최신 상태인지 확인해 두면 리뷰가 빨라진다.

과제

  1. 실습 6.1. 60분 타이머를 걸고 4문항을 지필로 풀어라. (완료 기준: 4문항 모두 답안 작성. 모르는 문항도 아는 데까지 쓴다)
  2. 실습 6.2. 권말 해답과 대조해 스스로 채점하라. (완료 기준: 문항별 정오 표시와 부분 점수 메모)
  3. 실습 6.3. 틀린 문항마다 원인을 세 갈래 중 하나로 분류해 자가 진단표를 작성하라: ⑴ 지식 공백(개념을 몰랐다) ⑵ 코드 읽기 실수(알지만 잘못 읽었다) ⑶ 검증 생략(확인 절차를 건너뛰었다). (완료 기준: 표에 빈칸 없음)
  4. 실습 6.4. 틀린 문항 1개를 골라 §6.4의 패턴 1 또는 3으로 AI와 재분석하라. 이 단계부터 AI를 허용한다. (완료 기준: 진단 프롬프트와 AI 응답을 저장)
  5. 실습 6.5. 자가 진단표와 재분석 로그를 repo에 커밋하라. (완료 기준: 커밋 메시지에 "모의시험1" 포함)

견본 문항 (유형 ①~④, 실제 문항지는 이 형식을 따른다)

문항 1 (출력 예측). 다음 코드의 출력을 예측하라.

T = 25.0            # °C
T += 273.15         # K로 변환
print(int(T))

문항 2 (EiPE). 다음 생성 코드의 목적과 동작을 한국어 2~3문장으로 설명하라.

def filter_temps(temps, t_min, t_max):
    ok = []
    for t in temps:
        if t_min <= t <= t_max:
            ok.append(t)
    return ok

문항 3 (오답 채점·교정). AI가 "kPa 압력을 Pa로 바꾸는 함수"로 아래를 제시했다. 채점 4단 절차로 채점하고 판정문을 써라.

def kpa_to_pa(p_kpa):
    return p_kpa / 1000

문항 4 (의사코드 설계). 물질명과 온도를 입력받아, 그 물질의 정상 끓는점을 조회한 뒤 주어진 온도에서 액체인지 기체인지 판정하는 프로그램의 의사코드를 6줄 이내로 써라. (물성 조회는 5주차 도구④의 함수를 쓴다고 가정)

완성 기준

  • 4문항 답안 작성 완료 (60분 내, 지필)
  • 자가 진단표 완성. 틀린 문항 전부에 원인 분류 ⑴~⑶ 기입
  • AI 재분석 로그 1건 (진단 프롬프트 + 응답 + 본인 결론 1문장)
  • repo 커밋 1건 이상

통과하지 못한 항목은 다음 실습 전까지 재도전한다.

막혔는가?

아래 힌트는 전부 오답 리뷰 단계(AI 허용) 전용이다. 시험 단계에서는 쓸 수 없다.

  1. 채점 근거가 안 써지면 이렇게 물어라. "이 코드의 각 줄에 변수의 단위를 주석으로 달아 줘. 등호 양변의 단위가 안 맞는 줄이 있으면 지목해 줘."
  2. 원인 분류가 애매하면 스스로에게 물어라. 시험장에서 그 개념의 정의를 쓸 수 있었는가(아니면 ⑴), 코드를 손으로 한 줄씩 따라가 봤는가(안 했으면 ⑵), 답을 쓰고 나서 말이 되는지 확인했는가(안 했으면 ⑶).
  3. 재분석이 막히면 이렇게 물어라. "고치지 말고, 내 답이 틀린 원인 후보 3개와 각각을 확인할 방법을 말해 줘. 내 답은 [본인 답], 정답은 [해답]이야."

퇴실 전 기록 오늘의 자가 진단표에서 가장 아픈 오답 1건을 위키에 기록하고 커밋해야 퇴실한다. 문항, 본인의 오답, 원인 분류, 그리고 "시험1에서 같은 유형을 만나면 무엇을 먼저 할 것인가" 한 문장을 담는다.

요약

  • S 6-1 (트레이스백 읽기 순서) 아래에서 위로: 마지막 줄에서 예외 이름과 메시지(병명) → 바로 위 블록에서 파일·줄 번호(위치) → 더 위에서 호출 경로.
  • S 6-2 (채점 4단 절차) ① 단위 손 추적 → ② 대조값 1점 → ③ 극한값 대입 → ④ 판정문(틀린 줄·원인·교정 방향).
  • S 6-3 (디버깅 프롬프트 3패턴) 진단 요구("고치지 말고 원인 후보 3개") · 기대–실제 병기 · 역할 전환(한 줄씩 단위와 함께 설명시키기).
  • 식 (6.1) PV = nRT, 식 (6.2) T[K] = T[°C] + 273.15. 이 장의 오답 채점에 쓴 두 식이다.
표 6-4 오류 유형별 탐지 수단 종합
오류 유형파이썬이 잡는가사람의 탐지 도구시험1 연결
문법 오류실행 전에 잡는다에러 위치 표시 읽기—
런타임 오류실행 중에 잡는다트레이스백 (S 6-1)유형 ①·③
의미 오류잡지 못한다검증 루틴 3종 = 채점 4단 (S 6-2)유형 ③

5장이 AI 협업 사이클의 ④ 생성 코드 읽기를 열었다면, 이 장은 ⑤ 테스트와 ⑥ 화공 검증을 채점자의 수준으로 끌어올렸다. 방패였던 검증 루틴이 채점 기준표가 됐고, 에러 메시지는 두려움의 대상에서 진단 보고서로 바뀌었다. 도구 사다리는 잠시 멈춰 있지만 헛도는 주가 아니다. 시험1을 통과한 읽기·검증 능력이 8주차부터의 화공 도구 제작 전체를 떠받친다.

용어 정리

문법 오류 (syntax error)
파이썬 문법 규칙 위반으로 실행이 시작되지 못하는 오류.
런타임 오류 (runtime error)
실행 도중 더 진행할 수 없어 프로그램이 멈추는 오류.
의미 오류 (semantic error)
프로그램이 끝까지 돌지만 의도와 다른 일을 하는 오류. 파이썬이 잡아 주지 않는다.
예외 (exception)
런타임 오류 발생 시 파이썬이 일으키는 신호. 이름(NameError 등)이 원인의 범주를 알려 준다.
트레이스백 (traceback)
예외 발생 시 출력되는 보고서. 예외 이름, 발생 위치, 호출 경로를 담으며 아래에서 위로 읽는다.
고무 오리 디버깅 (rubber duck debugging)
문제를 소리 내어 설명하는 과정에서 스스로 원인을 찾는 기법. AI에게는 역할을 뒤집어 코드를 설명시킨다.
최소 재현 예제 (minimal reproducible example)
문제를 일으키는 가장 작은 코드와 입력으로 줄인 사례. 질문의 기본 단위.

연습문제

Q군: 개념·읽기 (AI 없이 풀어라. 시험1 대비)

  1. Q6.1 다음 코드의 출력을 예측하라. 예측 후에만 실행해 확인하라.
    p_atm = 2.0                # atm
    p_kpa = p_atm * 101.325    # kPa
    print(int(p_kpa))
  2. Q6.2 다음 트레이스백을 읽고 (a) 예외 이름 (b) 발생 파일과 줄 번호 (c) 원인 1문장 (d) 교정 방향 1문장을 써라.
    Traceback (most recent call last):
      File "mole_frac.py", line 9, in <module>
        y = mole_fraction(0.0, 0.0)
      File "mole_frac.py", line 5, in mole_fraction
        return n_a / (n_a + n_b)
    ZeroDivisionError: float division by zero
  3. Q6.3 AI가 "g/cm³ 밀도를 kg/m³로 바꾸는 함수"로 아래를 제시했다. 채점 4단 절차로 채점하라. 대조값으로 물(1.0 g/cm³ = 1000 kg/m³)을 써라.
    def density_si(rho_gcm3):
        """g/cm^3 -> kg/m^3"""
        return rho_gcm3 / 1000

P군: 제작·계산 (AI 사용 전제. 시험2·최종 시험 대비)

  1. P6.1 다음 코드를 실행해 트레이스백 전문을 확보한 뒤, §6.4 패턴 1(진단 요구)로 AI에게 원인 후보 3개를 받아라. 후보 각각을 직접 실험으로 확인하고, 확정 원인과 교정 코드를 README에 기록하라.
    temps = ['25.0', '30.0', '35.0']   # °C, CSV에서 읽은 문자열
    avg = sum(temps) / len(temps)
    print(avg + 273.15)
  2. P6.2 예제 6.3-1의 교정 코드(코드 6-3)를 확장하라. 음수 압력 입력을 ValueError로 막고, 0 °C·25 °C·100 °C 세 점의 결과를 검증 루틴 3종과 함께 README에 기록하라. 커밋 2회 이상으로 나눠 제출하라.
  3. P6.3 (도전·메타인지) 검증 루틴 3종(단위 체크, 대조값 1점, 극한값)을 모두 통과하면서도 여전히 틀린 계산 코드를 일부러 설계할 수 있는가? 시도해 보고, 성공했다면 그 오답을 잡아낼 네 번째 검증을 제안하라. 실패했다면 왜 어려운지를 3종 루틴의 역할 분담으로 설명하라.

이번 주 위키 기록 과제 ① 이 장 핵심 1페이지 정리(#seed): 오류 3유형 표와 채점 4단 절차를 자신의 말로. ② "내가 틀렸던 것" 1건: 모의 시험 오답 1건을 원인 분류와 함께(실습 6의 기록을 다듬어도 된다). ③ 타 과목 연결 1건: 화공양론 과제 검산에서 단위 손 추적을 적용한 사례. 이번 주 의미 커밋 1건 이상이 채점 지표다.

7장은 1~6장의 요약 지도와 시험1이다. 이번 주 자가 진단표가 7장 복습의 출발점 입력이 된다. 시험이 끝나면 8장에서 도구 사다리가 재시동한다. Antoine 식으로 증기압 계산기를 만들면서, 이 장의 채점 눈으로 AI가 날조한 상수를 잡게 될 것이다.