방송대 파이썬프로그래밍기초 4강: 순차 구조와 데이터 타입 변환
위에서 아래로 실행되는 짧은 프로그램도 입력값의 타입과 계산 순서가 어긋나면 멈추거나 틀린 답을 냅니다. 원뿔 계산 프로그램을 직접 추적하면서 순차 구조, input(), 타입 변환, 오류 구분과 print() 출력을 하나의 실행 흐름으로 연결합니다.
순서가 맞아도 데이터 타입이 틀리면 계산은 멈춘다
반지름과 높이를 입력받아 원뿔의 부피를 계산한다고 하자. 사람은 키보드로 3을 입력하면 숫자 3이라고 생각하지만, 파이썬의 input()은 입력을 문자열로 반환한다. 따라서 입력→변환→계산→출력의 순서에서 변환을 빠뜨리면 거듭제곱 계산 단계에서 실행 오류가 발생한다.
radius = input("반지름을 입력하세요: ")
height = input("높이를 입력하세요: ")
volume = 1 / 3 * 3.14 * radius ** 2 * height
이 코드는 문법적으로는 읽을 수 있지만 radius와 height가 문자열이므로 수치 계산에 바로 사용할 수 없다. 올바른 순차 프로그램은 명령문의 위치만 위에서 아래로 정렬하는 데서 끝나지 않고, 다음 명령이 요구하는 형태로 데이터의 상태를 준비해야 한다.
첫 진단 질문: 오류가 난 줄만 보지 말고 그 줄에 들어온 값이 어느 명령에서 만들어졌으며, 현재 타입이 다음 연산이 요구하는 타입과 일치하는지 거슬러 올라간다.
구조적 프로그래밍은 흐름을 세 가지 블록으로 제한한다
명령형 프로그래밍은 컴퓨터가 무엇을 해야 하는지 명령을 순서대로 지시하는 방식이다. 프로그램은 상태를 가지며, 각 명령은 할당 등을 통해 상태를 단계적으로 바꾼다. 초기 상태에서 명령을 실행하여 목표 상태로 진행하는 과정이 프로그램 실행이다.
goto를 무분별하게 사용하면 실행 위치가 여러 곳으로 튀어 흐름을 추적하기 어렵다. 구조적 프로그래밍은 이를 피하고 프로그램을 순차(sequence), 선택(selection), 반복(iteration)의 세 제어 구조 안에서 구성한다. 흐름을 블록 단위로 계층화하고 지역화하기 때문에 예측과 검증이 쉬워진다.
| 제어 구조 | 핵심 질문 | 실행 경로 | 대표 상황 |
|---|---|---|---|
| 순차 | 어떤 명령이 먼저 실행되는가? | 정해진 명령을 위에서 아래로 차례로 수행 | 입력→계산→출력 |
| 선택 | 조건에 따라 어느 길을 고르는가? | 여러 경로 중 조건에 맞는 한 경로 수행 | 합격·불합격 판정 |
| 반복 | 어떤 명령을 언제까지 되풀이하는가? | 조건이나 횟수에 따라 블록 재실행 | 여러 데이터의 누적 계산 |
이번 차시는 세 구조 가운데 순차 구조에 집중한다. 선택과 반복도 결국 각 블록 내부에서는 명령이 순서대로 실행되므로, 순차 구조는 이후 제어 구조를 이해하는 바탕이다.
순차 구조는 명령의 위치가 곧 실행 순서가 되는 구조다
순차 구조에서는 실행 흐름을 바꾸는 조건이나 반복이 없으므로 명령문을 위에서 아래로 한 번씩 수행한다. 제품 생산 공정에 비유하면 설계가 끝나야 생산할 수 있고, 생산이 끝나야 조립할 수 있는 것처럼 앞 단계의 결과가 다음 단계의 입력이 된다.
price = 12000
quantity = 3
total = price * quantity
print(total)
상태는 price=12000 → quantity=3 추가 → total=36000 추가 → 36000 출력으로 변한다. 만약 total = price * quantity를 quantity 할당보다 먼저 옮기면, 아직 만들어지지 않은 값을 참조하게 된다.
순차 추적법: 각 줄 옆에 “이 줄이 읽는 값”, “이 줄이 새로 만드는 값”, “실행 뒤 바뀐 상태”를 적는다. 한 줄의 입력이 준비되지 않았다면 위치가 잘못되었거나 변환 단계가 빠진 것이다.
input()은 안내 문구를 보여 주고 문자열 한 줄을 돌려준다
input()은 사용자로부터 키보드 입력을 받는 내장 함수다. 괄호 안의 문자열은 무엇을 입력해야 하는지 알리는 프롬프트이며, 사용자가 입력을 마치면 그 값을 문자열로 반환한다.
radius_text = input("반지름(m): ")
print(radius_text)
사용자가 3을 입력해도 radius_text에는 정수 3이 아니라 문자열 "3"이 저장된다. 화면에 같은 모양으로 보이기 때문에 초보자가 타입 차이를 놓치기 쉽다. 문자열끼리의 +는 이어 붙이기이고, 숫자끼리의 +는 덧셈이라는 차이도 여기서 생긴다.
| 입력 뒤 값 | 연산 | 결과 | 해석 |
|---|---|---|---|
"3", "4" | "3" + "4" | "34" | 문자열 연결 |
3, 4 | 3 + 4 | 7 | 정수 덧셈 |
3.0, 4.0 | 3.0 + 4.0 | 7.0 | 실수 덧셈 |
타입 변환은 다음 연산이 요구하는 데이터 형태를 준비한다
데이터 타입 변환은 한 타입의 값을 다른 타입으로 바꾸는 일이다. str()은 문자열, int()는 정수, float()는 실수로 변환한다. 입력과 동시에 변환하거나, 문자열을 받은 뒤 별도 줄에서 변환할 수 있다.
radius = int(input("반지름을 입력하세요: "))
height_text = input("높이를 입력하세요: ")
height = int(height_text)
두 방식 모두 사용자가 정수 형태를 입력했다면 같은 수치 타입을 만든다. 다만 int("3.5")처럼 정수로 바로 해석할 수 없는 문자열은 실행 오류를 일으킨다. 소수 입력을 허용하려면 요구사항에 맞춰 float()를 선택해야 한다.
변환 선택 기준: 개수처럼 소수점이 불필요하면 int(), 길이·무게처럼 소수 입력을 허용하면 float(), 출력 문장에 값을 붙이거나 문자 그대로 보존하려면 str()를 검토한다.
원뿔 계산은 입력·변환·중간값·결과를 분리하면 검산할 수 있다
원뿔의 반지름을 r, 높이를 h라 하면 부피는 (1/3)πr²h이고, 밑면을 포함한 겉넓이는 πr² + πr√(r²+h²)다. 빗면의 길이를 중간값으로 먼저 구하면 식의 의미와 오류 위치가 더 잘 보인다.
다음은 학습을 위해 반지름 3, 높이 4를 입력한다고 가정하고 π=3.14를 사용하는 완성 코드다.
radius = float(input("반지름을 입력하세요: "))
height = float(input("높이를 입력하세요: "))
pi = 3.14
slant_height = (radius ** 2 + height ** 2) ** 0.5
volume = 1 / 3 * pi * radius ** 2 * height
surface_area = pi * radius ** 2 + pi * radius * slant_height
print("원뿔의 부피는", volume, "입니다.")
print("원뿔의 겉넓이는", surface_area, "입니다.")
- 변환: 입력
"3"과"4"를 실수 3.0과 4.0으로 바꾼다. - 빗면:
√(3²+4²)=√25=5다. - 부피:
(1/3)×3.14×3²×4=37.68이다. - 겉넓이:
3.14×3² + 3.14×3×5 = 28.26+47.10=75.36이다.
검산할 때는 값이 양수인지 보는 데서 끝내지 않는다. 부피식에 1/3이 있는지, 겉넓이에 밑면과 옆면이 모두 포함되었는지, 거듭제곱이 곱셈보다 먼저 계산되는지를 확인한다.
오류는 발견 시점과 결과의 성격으로 세 갈래로 나눈다
프로그램 오류는 의도한 결과를 만들지 못하게 하는 설계 결함, 논리적 실수 또는 문법 문제다. 모두 “코드가 틀렸다”로 묶으면 고칠 위치를 찾기 어렵기 때문에 구문 오류, 실행 오류, 의미 오류로 구분한다.
| 오류 | 발견 시점 | 원뿔 프로그램의 예 | 교정 질문 |
|---|---|---|---|
| 구문 오류 | 실행 전에 인터프리터가 문법을 검사할 때 | 닫는 괄호 누락, 잘못된 명령문 형식 | 파이썬 문법 체계에 맞는가? |
| 실행 오류 | 실행 중 해당 명령을 처리할 때 | 문자열에 거듭제곱 연산, 변환할 수 없는 입력 | 현재 값과 연산이 호환되는가? |
| 의미 오류 | 프로그램은 끝나지만 결과를 검산할 때 | 부피식에서 1/3을 빠뜨림 | 코드가 문제의 의도와 공식을 구현했는가? |
가장 찾기 까다로운 것은 의미 오류다. 오류 메시지가 없고 그럴듯한 숫자가 출력되기 때문이다. 예를 들어 pi * radius ** 2 * height는 실행되지만 원뿔이 아니라 같은 밑면과 높이를 가진 원기둥의 부피에 해당한다. 따라서 계산 프로그램에는 손으로 구한 작은 사례를 넣어 결과를 비교하는 검산이 필요하다.
print()는 여러 값을 구분하고 줄 끝을 조절한다
print()에는 여러 데이터를 쉼표로 구분해 전달할 수 있다. 기본적으로 값 사이에는 공백이 들어가고 출력 끝에는 줄바꿈이 붙는다. sep는 값 사이 구분자, end는 출력 끝 문자열을 바꾼다.
volume = 37.68
surface_area = 75.36
print("부피", volume, sep=": ")
print("겉넓이", surface_area, sep=": ", end=" / ")
print("계산 완료")
첫 줄은 부피: 37.68을 출력하고 줄을 바꾼다. 두 번째 출력은 end=" / " 때문에 줄을 바꾸지 않으므로 마지막 출력과 이어져 겉넓이: 75.36 / 계산 완료가 된다. sep와 end는 계산값을 바꾸는 옵션이 아니라 출력 형식을 바꾸는 옵션이다.
순차 프로그램은 네 번의 점검으로 완성한다
- 의존 순서: 각 명령이 사용하는 값이 그보다 앞에서 만들어졌는지 확인한다.
- 타입 계약:
input()의 문자열을 다음 계산에 맞는int나float로 바꾼다. - 수식 검산: 작은 입력으로 중간값과 최종값을 손으로 계산해 코드 결과와 비교한다.
- 출력 설계: 레이블, 값 사이 구분자와 줄 끝 형식을 정해 결과의 의미가 드러나게 한다.
오류가 생기면 이 순서를 거꾸로 추적한다. 출력이 보이지 않으면 출력 위치와 실행 중단 여부를 보고, 계산이 틀리면 식과 중간값을 보고, 연산이 중단되면 타입을 보고, 값 자체가 없으면 할당과 입력의 순서를 확인한다.
자가 점검: 반지름 5, 높이 12를 넣었을 때 빗면이 13이 되는지 먼저 확인해 보자. 이 중간값이 맞으면 입력 변환과 제곱·제곱근 순서는 통과한 것이므로 부피와 겉넓이 식을 별도로 검산할 수 있다.
핵심 개념 정리
- 명령형 프로그래밍은 명령으로 프로그램 상태를 단계적으로 바꾸며 목표 상태로 진행한다.
- 구조적 프로그래밍은
goto에 의존하지 않고 순차·선택·반복의 제어 구조로 흐름을 조직한다. - 순차 구조에서는 명령의 위치가 실행 순서를 결정하고 앞 단계의 결과가 다음 단계의 입력이 된다.
input()은 키보드 입력을 문자열로 반환하므로 수치 계산 전 타입 변환이 필요하다.int(),float(),str()는 다음 연산이 요구하는 타입에 맞춰 선택한다.- 원뿔 계산은 입력→변환→빗면 계산→부피·겉넓이 계산→출력으로 나누면 추적과 검산이 쉽다.
- 구문 오류는 문법, 실행 오류는 실행 중 값·연산의 충돌, 의미 오류는 의도와 결과의 불일치다.
print()의sep는 값 사이,end는 출력 끝의 형식을 조절한다.
순차 구조 문제를 만나면 코드를 위에서 아래로 읽으며 각 줄이 요구하는 값을 표시한다. 입력값이 문자열이라는 사실을 확인해 알맞은 타입으로 변환하고, 계산은 의미 있는 중간값으로 나누어 손계산과 대조한다. 마지막으로 출력 형식을 확인한다. 프로그램이 멈추면 구문·실행 오류를, 끝났지만 답이 다르면 의미 오류를 의심하면 원인을 체계적으로 좁힐 수 있다.
예상문제 10선
1. 구조적 프로그래밍 패러다임의 핵심 설명으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
- ① 오답: 무분별한
goto가 만드는 흐름 추적 문제를 줄이려는 접근이다. - ② 오답: 명령형 프로그램의 상태 변화는 남아 있으며 흐름을 구조화한다.
- ③ 오답: 선택과 반복도 구조적 프로그래밍의 핵심 제어 구조다.
- ④ 정답: 세 제어 구조와 블록화를 통한 예측·검증 가능성을 모두 설명한다.
2. 순차 구조를 가장 잘 설명한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
- ① 오답: 조건에 따른 경로 선택은 선택 구조다.
- ② 정답: 별도 분기 없이 명령의 위치적 순서를 따르는 구조다.
- ③ 오답: 블록의 재실행은 반복 구조다.
- ④ 오답: 임의 이동은 순차 실행의 예측 가능성을 깨뜨린다.
3. 사용자가 input()에 25를 입력했을 때 반환되는 값은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
- ① 오답: 정수가 필요하면
int(input(...))처럼 변환해야 한다. - ② 오답: 실수가 필요하면
float()변환이 필요하다. - ③ 정답:
input()은 키보드 입력 한 줄을 문자열로 돌려준다. - ④ 오답: 입력 내용이 존재한다는 사실을 참·거짓으로 반환하는 함수가 아니다.
4. 원뿔 계산 순차 프로그램의 올바른 흐름은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
- ① 정답: 각 단계의 산출물이 다음 단계 입력으로 준비되는 의존 순서다.
- ② 오답: 계산에 사용할 입력이 공식 계산보다 먼저 있어야 한다.
- ③ 오답: 결과는 입력과 계산이 완료된 뒤 출력할 수 있다.
- ④ 오답: 변환할 원본 문자열은 먼저 입력받아야 한다.
5. 소수점이 있는 길이를 사용자에게 입력받아 계산하려 할 때 가장 적절한 코드는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
- ① 오답: 입력이 문자열로 남아 수치 연산에 바로 쓸 수 없다.
- ② 오답: 이미 문자열인 입력을 다시 문자열로 바꾸므로 계산 타입이 준비되지 않는다.
- ③ 정답: 소수점 입력을 허용하는 실수 타입으로 변환한다.
- ④ 오답:
int("3.5")처럼 소수 문자열은 정수로 직접 변환할 수 없다.
6. 다음 코드가 사용자 입력 뒤 거듭제곱 연산에서 멈췄다. 오류 유형은?
radius = input("반지름: ")
area = 3.14 * radius ** 2
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
- ① 오답: 의미 오류는 프로그램이 끝나도 의도와 다른 결과를 내는 경우다.
- ② 오답: 문법 자체는 해석 가능하므로 실행 전 구문 검사에서 막히는 문제가 아니다.
- ③ 오답:
print()형식이 아니라 문자열과 거듭제곱 연산의 충돌이다. - ④ 정답: 문자열 값에 지원되지 않는 수치 연산을 시도하여 실행 중 중단된다.
7. 반지름 3, 높이 4, π=3.14일 때 원뿔의 빗면 길이와 부피는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
- ① 오답: 높이를 빗면으로 사용하고 밑면 넓이를 부피로 혼동했다.
- ② 정답:
√(3²+4²)=5,(1/3)×3.14×9×4=37.68이다. - ③ 오답: 빗면을 3+4로 구하고 부피의
1/3을 빠뜨렸다. - ④ 오답: 제곱합 25에 제곱근을 적용하지 않았고 겉넓이를 부피로 혼동했다.
8. 실행은 끝났지만 원뿔 부피식에서 1/3을 빠뜨려 잘못된 값이 나왔다. 오류 유형은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
- ① 정답: 문법과 실행은 통과하지만 공식의 뜻을 잘못 구현했다.
- ② 오답: 수식은 파이썬 문법에 맞으므로 실행 전에 거부되지 않는다.
- ③ 오답: 프로그램이 중단되지 않고 숫자를 출력한다.
- ④ 오답: 사용자 입력을 기다리는 정상 상태가 아니라 계산 의도의 불일치다.
9. 다음 코드의 출력 결과는?
print("A", "B", sep="-", end="/")
print("C")
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
- ① 오답:
sep="-"와end="/"를 기본값처럼 처리했다. - ② 오답: 첫
print()는 줄바꿈 대신 슬래시로 끝난다. - ③ 오답:
sep는 A와 B 사이,end는 B 뒤에 적용된다. - ④ 정답: A와 B는 하이픈으로 구분되고 다음 출력은 슬래시 뒤 같은 줄에 이어진다.
10. 수치 입력 프로그램이 멈추지 않았지만 답이 예상과 다르다. 가장 적절한 첫 점검은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
- ① 오답: 임의 이동은 흐름을 더 복잡하게 만들고 계산 의도를 검증하지 못한다.
- ② 정답: 프로그램이 완료되었으므로 의미 오류를 의심하고 재현 가능한 값으로 수식을 검산한다.
- ③ 오답: 출력 표현과 계산 공식은 다른 단계이므로 레이블 삭제가 값을 고치지 않는다.
- ④ 오답: 의미 오류는 오류 메시지 없이 잘못된 결과를 낼 수 있다.
참고 자료와 작성 기준
이 글은 해당 차시 강의자료를 바탕으로 학습 목적에 맞게 재구성한 비공식 학습자료입니다. 실행 흐름, 수정한 코드 예제, 단계별 계산과 문제 해설은 학습자의 이해를 돕도록 구성하고 검토했습니다.
- 작성·편집: 올에이클래스 학습연구팀
- 주요 근거: 한국방송통신대학교 컴퓨터과학과 「파이썬프로그래밍기초」 강의록 4강 「구조적 프로그래밍」, 1~15쪽
- 범위 구분: 16쪽의 5강 「선택 구조」 예고는 본문에서 제외
- 보충 자료: 외부 자료를 사용하지 않음
- 편집 원칙: 올에이클래스 편집 정책
- 최종 내용 검토: 2026-09-07
댓글
댓글 쓰기