방송대 프로그래밍언어론 12강: 대입문의 상태 변화와 제어문의 실행 흐름
같은 코드라도 어떤 문장은 이름을 준비하고, 어떤 문장은 값을 바꾸며, 또 다른 문장은 다음에 실행할 위치를 고릅니다. 이 글은 문장을 선언문과 실행문으로 구분한 뒤, 대입문에서는 값의 상태를, 제어문에서는 실행 경로를 추적하는 방법을 익히도록 구성했습니다. 연속 대입과 타입 변환의 계산 순서를 복원하고, if·switch·for·while·do-while·goto 가운데 목적에 맞는 문장을 판단할 수 있습니다.
코드를 읽을 때는 상태 장부와 흐름 장부를 나눈다
프로그램은 데이터를 처리하는 문장(statement)의 나열로 이루어집니다. 그러나 모든 문장이 같은 일을 하지는 않습니다. 아래의 짧은 C 코드에서도 첫 두 줄은 이름을 준비하고, 셋째 줄은 값을 저장하며, 넷째 줄은 조건에 따라 실행 경로를 나눕니다.
int y;
int add(int, int);
y = add(3, 4);
if (y > 5) y = 10; else y = 0;
int y;는 변수명과 타입을 바인딩하고, int add(int, int);는 서브프로그램을 호출하는 데 필요한 프로토콜을 알립니다. 이 두 선언문은 이후 문장이 이름을 올바르게 사용할 수 있도록 준비합니다. 반면 셋째 줄부터는 실제 값을 계산하고 실행 순서를 결정하는 실행문입니다.
| 읽을 질문 | 확인할 대상 | 대표 문장 |
|---|---|---|
| 어떤 이름을 어떤 성질로 사용할 수 있는가? | 이름·타입·서브프로그램 프로토콜의 바인딩 | 선언문 |
| 실행 뒤 어느 변수의 값이 달라지는가? | 대입 전후의 데이터 상태 | 대입문 |
| 어느 문장이 다음에 실행되는가? | 조건·반복·분기에 따른 실행 경로 | 제어문 |
판단 핵심: 이름을 사용할 수 있게 준비하면 선언문, 실제 데이터를 처리하면 실행문입니다. 실행문 안에서도 값을 바꾸는 일과 실행 순서를 바꾸는 일을 분리해 보아야 합니다.
선언문은 이름을 만들고 실행문은 그 이름을 사용한다
변수 선언문은 변수명과 타입 같은 속성을 연결합니다. 서브프로그램 선언문은 매개변수와 반환값을 포함한 호출 규약, 즉 프로토콜을 명시합니다. 선언이 필요한 이유는 실행문이 이름을 만났을 때 그 이름의 의미와 허용되는 연산을 판단할 근거가 있어야 하기 때문입니다.
실행문은 이미 준비된 변수, 연산자, 서브프로그램을 이용해 데이터를 처리합니다. 이번 강의에서는 실행문을 크게 대입문과 제어문으로 나눕니다. 대입문은 변수의 값을 변경하고, 제어문은 프로그램의 수행 흐름을 조건문과 반복문 등으로 조절합니다.
11강과의 연결: 수식은 값을 만들어 내고 문장은 처리를 나타냅니다. 따라서 A = 5가 대입한 값 5를 갖는 수식이 될 수 있는 C·C++·Java에서도, 끝에 쌍반점이 붙은 A = 5;는 하나의 대입문이 됩니다.
초보자가 자주 하는 실수는 선언문을 “아무 일도 하지 않는 줄”로 보는 것입니다. 선언문은 값을 변경하는 실행문과 역할이 다를 뿐, 이후의 이름 해석과 타입 검사를 가능하게 하는 준비 단계입니다. 반대로 선언만으로 데이터 처리가 끝났다고 생각해서도 안 됩니다. 역할을 판단할 때는 “이 줄이 이름의 사용 조건을 정하는가, 실제 상태나 흐름을 바꾸는가?”라고 물으면 됩니다.
대입문은 오른쪽 값을 만든 뒤 왼쪽 상태를 갱신한다
대입문(assignment statement)은 변수의 값을 변경하는 문장입니다. 기본 순서는 오른쪽 부분 평가 → 필요한 타입 변환 → 왼쪽 변수에 저장입니다. 수학의 등호처럼 양쪽이 같다고 주장하는 문장이 아니라, 오른쪽에서 얻은 값을 왼쪽 저장 장소에 넣는 처리입니다.
대입 표기는 언어에 따라 다릅니다. C·C++·Java·Python 등은 =, Algol·Pascal·Ada 등은 :=, COBOL은 MOVE 5 TO A와 같은 형태를 사용합니다. 표기가 달라도 오른쪽에서 값을 구해 변수의 상태를 바꾼다는 핵심은 같습니다.
연속 대입은 우결합을 괄호로 복원한다
C·C++·Java의 대입 연산자는 우결합이며, 대입한 값이 다시 수식의 값이 됩니다. 따라서 다음 문장은 오른쪽부터 묶어 읽습니다.
C = B = A = 5;
A = 5가 실행되어 A가 5가 되고, 이 대입 수식의 값도 5가 됩니다.- 그 값으로
B = 5가 실행되어 B가 5가 됩니다. - 마지막으로
C = 5가 실행되어 세 변수의 값이 모두 5가 됩니다.
“문장이 왼쪽에서 오른쪽으로 적혔으니 C부터 바뀐다”는 해석은 결합방향과 실행 순서를 혼동한 것입니다. 숨은 괄호를 C = (B = (A = 5))로 복원하면 오류를 줄일 수 있습니다.
조건에 따라 저장할 변수를 고를 수도 있다
C++에서는 두 피연산자가 대입 가능한 변수인 조건식에서 다음과 같이 값이 저장될 대상을 선택할 수 있습니다.
(cond ? t : f) = 5;
cond가 참이면 t에, 거짓이면 f에 5가 저장됩니다. 이는 결과값만 선택하는 일반적인 조건식과 달리 대입될 변수를 선택하는 예입니다. 이 문법은 강의에서 C++의 사례로 제시되므로 다른 언어에도 그대로 허용된다고 일반화하면 안 됩니다.
복합·증감 대입은 짧은 표기 안의 변화를 펼쳐 읽는다
복합 대입 연산자는 산술 또는 비트 연산과 대입을 결합합니다. +=, -=, *=, /=, %=는 각각 현재 값에 더하기, 빼기, 곱하기, 나누기, 나머지 연산을 한 결과를 다시 저장합니다. >>=와 <<=는 비트 이동 결과를 저장합니다.
| 짧은 표기 | 학습을 위한 펼친 의미 | 추적할 변화 |
|---|---|---|
total += 4; | total = total + 4; | 기존 total을 읽고 4를 더한 뒤 다시 저장 |
mask <<= 1; | mask = mask << 1; | 비트를 왼쪽으로 이동한 결과를 저장 |
a++; | a += 1;과 같은 상태 변화 | a의 값이 1 증가 |
--b; | b -= 1;과 같은 상태 변화 | b의 값이 1 감소 |
증감 연산자를 독립된 문장으로 사용하면 a++;, a += 1;, a = a + 1;은 모두 a를 1 증가시키는 상태 변화를 만듭니다. 다만 증감 연산자가 더 큰 수식 안에 들어가면 전위와 후위가 수식에 제공하는 값의 시점을 달리합니다. 11강에서 다룬 전위·후위 평가 규칙을 함께 적용해야 하며, “항상 완전히 같은 수식”이라고 확대 해석해서는 안 됩니다.
타입 변환은 저장 직전 값의 표현 범위를 맞춘다
오른쪽 값의 타입과 왼쪽 변수의 타입이 다르면 타입 변환이 필요합니다. 묵시적 타입 변환은 언어가 값의 타입을 변수의 타입에 맞추고, 명시적 타입 변환은 프로그래머가 변환할 타입을 코드에 적습니다.
강의의 기준에서 C와 C++은 묵시적인 확대변환과 축소변환을 모두 허용할 수 있지만, Java의 묵시적 대입은 확대변환만 허용합니다. 명시적 타입 변환은 확대와 축소에 모두 사용할 수 있습니다. 여기서 확대는 일반적으로 표현 범위가 넓은 타입으로, 축소는 표현 범위가 좁은 타입으로 옮기는 상황을 가리킵니다.
다음 C 예제를 단계별로 계산해 보겠습니다.
double pi = 3.14, radius = 1.5;
int area;
area = (int)(radius * radius * pi);
radius * radius는 1.5 × 1.5이므로 2.25입니다.- 2.25 × 3.14의 결과는 7.065입니다.
(int)가 실수 7.065를 정수 7로 명시적으로 변환합니다.- 정수 변수 area에 7이 저장됩니다.
판단 핵심: 타입 변환 문제에서는 먼저 오른쪽 수식을 원래 타입으로 끝까지 계산하고, 변환이 일어나는 정확한 위치를 찾은 뒤, 변환된 값을 왼쪽 변수의 타입과 대조합니다.
“캐스트를 쓰면 원래 값이 더 정확해진다”는 생각은 잘못입니다. 축소변환은 저장 가능한 표현을 맞추는 대신 정보 일부를 잃을 수 있습니다. 위 예제에서 소수부 0.065는 정수로 변환하는 순간 사라지며, 나중에 area를 다시 실수형으로 바꾸어도 되살아나지 않습니다.
조건문은 가능한 경로 가운데 실행할 길을 고른다
제어문(control statement)은 프로그램의 수행 흐름을 제어합니다. 조건문은 조건에 따라 서로 다른 처리를 선택하고, 반복문은 원하는 문장을 되풀이합니다. 상태 장부가 “값이 무엇으로 바뀌었는가?”를 기록한다면 흐름 장부는 “어느 문장이 실행되었고 다음은 어디인가?”를 기록합니다.
if문은 참·거짓에 따라 두 경로를 가른다
if문은 조건이 참일 때 then에 해당하는 문장을 실행합니다. else가 있으면 조건이 거짓일 때 else 경로를 실행합니다. C와 Python은 표현 형식이 다르지만 조건에 따라 경로를 고른다는 의미는 같습니다.
y = 7
if y > 5:
y = 10
print(y)
else:
y = 0
print("zero")
조건 y > 5가 참이므로 첫 경로만 실행되어 y는 10이 되고 10이 출력됩니다. else 경로는 이 실행에서 지나가지 않습니다.
switch문은 하나의 값을 여러 후보와 대조한다
switch문은 조건의 값에 따라 여러 갈래로 흐름을 나눌 때 적합합니다. 강의의 C 예제에서는 n이 0, 1, 2, 7인지에 따라 서로 다른 메시지를 출력하고, 어느 case에도 맞지 않으면 default 경로를 선택합니다. 각 case 뒤의 break는 선택한 처리를 마친 뒤 switch 바깥으로 흐름을 옮깁니다.
선택 기준: 참·거짓이나 서로 다른 조건식을 순서대로 검사하면 if가 자연스럽고, 하나의 값이 여러 명시된 경우 중 어디에 해당하는지 나누면 switch가 읽기 쉽습니다. 문법 지원 범위와 세부 동작은 언어별로 확인해야 합니다.
반복문은 횟수와 최초 조건 검사의 위치로 고른다
for문, while문, do-while문은 모두 문장을 반복하지만 반복을 조직하는 방식이 다릅니다. 이름만 외우기보다 반복 횟수를 어떻게 알 수 있는지, 본문을 실행하기 전에 조건을 검사하는지를 확인해야 합니다.
| 반복문 | 판단 기준 | 최소 실행 횟수 |
|---|---|---|
| for | 제어변수의 초깃값·종료 조건·증가분으로 반복을 조직하기 좋음 | 조건이 처음부터 거짓이면 0회 |
| while | 본문에 들어가기 전에 조건을 검사하며, 조건이 참인 동안 반복 | 0회 |
| do-while | 본문을 먼저 한 번 실행한 뒤 조건을 검사 | 1회 |
직접 만든 예제로 상태와 흐름을 함께 추적한다
다음은 반복 구조를 확인하기 위해 직접 구성한 C 학습 예제입니다. 1부터 4까지 더하되, 각 반복이 끝날 때 i와 total의 상태를 기록합니다.
int total = 0;
for (int i = 1; i <= 4; i++) {
total += i;
}
| 본문 실행 차례 | i | 계산 | total | 다음 판단 |
|---|---|---|---|---|
| 첫 번째 | 1 | 0 + 1 | 1 | i를 2로 바꾸고 계속 |
| 두 번째 | 2 | 1 + 2 | 3 | i를 3으로 바꾸고 계속 |
| 세 번째 | 3 | 3 + 3 | 6 | i를 4로 바꾸고 계속 |
| 네 번째 | 4 | 6 + 4 | 10 | i가 5가 되어 조건이 거짓 |
이 추적표는 대입문과 제어문이 따로 움직이지 않는다는 점을 보여 줍니다. total += i는 상태를 바꾸고, i <= 4는 다음 반복으로 갈지를 결정합니다. 최종값 10만 암기하지 말고 매 단계의 상태 변화와 경로 판단을 한 쌍으로 기록해야 합니다.
경계 사례도 확인해 봅시다. 시작할 때 max == min이면 while (max > min)의 본문은 0회 실행됩니다. 같은 조건을 do-while 뒤에 두면 본문을 먼저 실행하므로 1회는 실행됩니다. 두 반복문이 “조건이 참인 동안 반복한다”는 설명만으로 같다고 판단하면 최초 검사 위치를 놓치게 됩니다.
대입을 조건으로 쓰면 값 변화와 종료 판단이 한 줄에 겹친다
강의의 문자열 복사 예시는 대입 수식의 값과 while 조건이 결합되는 경우를 보여 줍니다.
char *loop(char *b, char *a) {
char *s = b;
while (*b++ = *a++)
;
return s;
}
조건 부분의 *b++ = *a++는 a가 가리키는 문자를 b가 가리키는 위치에 대입한 뒤 두 포인터를 다음 위치로 옮깁니다. 대입된 문자가 널 문자 \0가 아니면 대입 수식의 값이 참으로 해석되어 빈 반복문이 계속됩니다. 널 문자까지 복사되면 그 값이 거짓으로 해석되어 반복이 끝나고, 처음 목적지 주소를 보관한 s가 반환됩니다.
- 상태 장부: 어떤 문자가 복사되었고 a와 b가 어느 위치로 이동했는지 기록합니다.
- 흐름 장부: 방금 대입된 값이 널 문자인지에 따라 다음 반복 여부를 결정합니다.
오류 방지: 조건 안의 =를 수학적 동등 비교나 비교 연산자로 읽으면 안 됩니다. 이 예에서는 실제 대입이 먼저 일어나며, 그 대입 수식의 값이 반복 조건으로 사용됩니다.
goto는 목적지로 즉시 옮기지만 구조 파악 비용을 키운다
무조건 분기문은 조건 없이 지정한 위치로 흐름을 옮깁니다. goto문은 기계어와 어셈블리어에서 유래한 명령으로, 레이블을 목적지로 삼아 즉시 분기합니다. 강의의 예에서는 정수 i를 출력하고 증가시킨 뒤, i가 11이면 종료하고 그렇지 않으면 goto L0로 되돌아가 1부터 10까지 출력합니다.
문제는 목적지를 코드의 여러 위치로 지정할 수 있다는 데 있습니다. 흐름이 순차·선택·반복이라는 눈에 보이는 블록을 벗어나면, 독자는 “어디서 이 위치로 왔고 다음에는 어디로 가는가?”를 추적하기 어려워집니다. 이것이 goto를 언어에 포함할지를 둘러싼 논란의 핵심입니다. 강의에서는 Modula-2, CLU, Java, Rust 등을 goto를 제외한 언어의 예로 듭니다.
goto가 무조건 분기한다는 사실과 goto를 사용한 모든 프로그램이 무조건 틀렸다는 평가는 같은 말이 아닙니다. 강의의 초점은 임의 목적지 분기가 프로그램 구조 파악을 어렵게 만들 수 있다는 설계상의 비용에 있습니다.
문장 선택은 준비·상태·경로의 순서로 결정한다
새 코드 조각을 만나면 문법 이름부터 떠올리기보다 다음 순서로 판단하면 됩니다.
- 준비인가? 변수명·타입·서브프로그램 프로토콜을 바인딩한다면 선언문으로 분류합니다.
- 상태가 바뀌는가? 오른쪽 값을 계산해 변수에 저장한다면 대입문입니다. 결합방향과 타입 변환 위치를 표시합니다.
- 경로가 갈리는가? 참·거짓이면 if, 하나의 값을 여러 경우와 대조하면 switch를 우선 검토합니다.
- 반복 조건은 언제 검사하는가? 제어변수 중심이면 for, 진입 전에 검사하면 while, 한 번 실행한 뒤 검사해야 하면 do-while이 적합합니다.
- 비구조적 이동이 필요한가? goto라면 목적지와 유입 경로를 모두 추적하고 구조 파악 비용을 점검합니다.
짧은 자가 점검으로 다음 코드를 말로 설명해 보세요. “i를 선언한다”처럼 문법명만 붙이지 말고, 각 줄 뒤에 어떤 값이 남고 어느 경로로 이동하는지를 설명해야 합니다.
int i = 0;
do {
i += 2;
} while (i < 0);
i는 0으로 준비되고, do 본문이 먼저 실행되어 2가 됩니다. 그 뒤 i < 0은 거짓이므로 반복은 종료됩니다. 처음 조건이 거짓이어도 본문이 한 번 실행된다는 do-while의 경계 조건이 드러납니다.
핵심 개념 정리
- 선언문은 이름과 타입 또는 서브프로그램 프로토콜을 바인딩해 이후 사용을 준비하고, 실행문은 실제 데이터를 처리합니다.
- 대입문은 오른쪽 평가, 타입 변환, 왼쪽 저장의 순서로 상태를 바꿉니다. 연속 대입은 우결합을 복원해 오른쪽부터 추적합니다.
- 복합·증감 대입은 짧은 표기 안의 연산과 저장을 펼쳐 읽고, 타입 변환에서는 정보가 사라지는 지점을 확인합니다.
- if와 switch는 조건에 따라 경로를 선택하고, for·while·do-while은 반복 조건과 검사 위치에 따라 구분합니다.
- while은 0회 실행될 수 있지만 do-while은 본문을 먼저 실행하므로 최소 1회 실행됩니다.
- goto는 지정한 위치로 무조건 분기하지만 임의의 흐름 연결이 프로그램 구조 파악을 어렵게 할 수 있습니다.
문장 문제를 풀 때는 먼저 이름을 준비하는가, 다음으로 어느 값이 어떻게 바뀌는가, 마지막으로 다음 실행 위치가 어디인가를 묻습니다. 대입과 제어가 한 표현에 겹치면 상태 장부와 흐름 장부를 따로 작성한 뒤 시간 순서대로 합치세요. 이 절차를 따르면 연속 대입, 조건 속 대입, 반복문의 경계 사례처럼 짧지만 까다로운 코드도 재현 가능한 방식으로 설명할 수 있습니다.
예상문제
1. 선언문과 실행문을 구분한 설명으로 가장 적절한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
- ① 오답: 값 변경은 대입문 같은 실행문의 역할이며, 선언문은 이름과 타입 등의 바인딩을 준비합니다.
- ② 정답: 변수나 서브프로그램의 이름을 이후에 쓸 수 있게 하는 준비와, 그 이름을 이용한 실제 처리를 정확히 구분합니다.
- ③ 오답: 변수 선언은 대표적인 선언문이고, 함수 호출은 이미 준비된 서브프로그램을 사용하는 실행의 일부가 될 수 있습니다.
- ④ 오답: 여러 언어에서 두 종류 모두 쌍반점을 쓸 수 있으므로 구두점이 아니라 문장의 역할로 판단해야 합니다.
2. 강의에서 제시한 언어와 대입 표기의 연결로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
- ① 오답:
MOVE 5 TO A는 강의에서 COBOL의 대입 표기로 제시되었습니다. - ② 오답:
:=는 Algol·Pascal·Ada 등의 사례이며 COBOL 사례와 바뀌었습니다. - ③ 오답: Pascal의 강의 예시는 등호가 아니라
:=를 사용합니다. - ④ 정답: 강의의 언어별 예시를 올바르게 연결했으며, 표기는 달라도 변수 상태를 갱신한다는 의미는 같습니다.
3. C에서 C = B = A = 5;를 실행할 때의 해석으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
- ① 정답: 대입 연산자의 우결합과 대입한 값이 수식의 값이 되는 성질을 차례로 적용한 결과입니다.
- ② 오답: 안쪽 대입 결과가 바깥 대입으로 전달되므로 B와 A도 갱신됩니다.
- ③ 오답: 문자 배치가 아니라 우결합에 따라
C = (B = (A = 5))로 괄호를 복원해야 합니다. - ④ 오답: 강의에서 C·C++·Java의 대입한 값이 수식의 값이 되는 성질을 연속 대입의 근거로 설명합니다.
4. C에서 area = (int)(1.5 * 1.5 * 3.14);를 실행한 뒤 정수형 area의 값은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
- ① 오답: 1.5 × 1.5는 2.25이고 여기에 3.14를 곱하면 6이 아니라 7.065입니다.
- ② 오답: 변환 전 실수 계산값이지만, 명시적 정수 변환과 저장을 거친 area의 값은 아닙니다.
- ③ 정답: 실수 계산값 7.065가
(int)에 의해 정수 7로 변환된 뒤 저장됩니다. - ④ 오답: 이 정수 변환을 반올림으로 해석한 값입니다. 예제의 변환에서는 소수부가 제거됩니다.
5. 하나의 정수 n이 0, 1, 2, 7 중 어느 값인지에 따라 각각 다른 메시지를 출력하려 한다. 강의의 판단 기준에 가장 맞는 문장은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
- ① 오답: 선언문은 이름과 타입을 준비할 뿐 하나의 값을 여러 경우와 대조해 경로를 나누지 않습니다.
- ② 오답: do-while은 본문을 최소 한 번 반복하려는 목적에 맞는 문장입니다.
- ③ 정답: 하나의 조건값을 여러 명시된 case와 대조해 다중 경로를 선택하는 상황입니다.
- ④ 오답: 연속 대입은 하나의 값을 여러 변수에 저장하며 실행 경로를 여러 갈래로 나누지 않습니다.
6. while문과 do-while문의 결정적 차이를 올바르게 설명한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
- ① 정답: 조건 검사 위치가 달라 while은 0회, do-while은 최소 1회 실행될 수 있다는 차이가 생깁니다.
- ② 오답: 최소 실행 횟수를 반대로 설명했습니다.
- ③ 오답: 두 문장 모두 프로그램의 반복 흐름을 제어하는 실행문입니다.
- ④ 오답: do-while도 본문 뒤에서 조건을 검사해 반복 여부를 결정합니다.
7. 본문의 for문 예제에서 i가 1부터 4까지 증가하며 total += i;를 실행한다. total의 최종값은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
- ① 오답: 마지막 제어변수 값만 결과로 선택해 누적 대입의 상태 변화를 반영하지 않았습니다.
- ② 오답: 1+2+3까지만 더하고 i가 4일 때의 네 번째 본문 실행을 빠뜨린 값입니다.
- ③ 오답: 각 단계의 total을 누적하지 않은 계산입니다. 추적표대로 이전 total에 현재 i를 더해야 합니다.
- ④ 정답: total은 0→1→3→6→10으로 바뀌므로 최종값은 1+2+3+4인 10입니다.
8. 강의의 while (*b++ = *a++) 문자열 복사 예제에 대한 설명으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
- ① 오답: 조건의
=는 비교가 아니라 역참조한 문자를 실제로 대입하는 연산자입니다. - ② 정답: 상태 변화인 문자 대입·포인터 증가와, 대입값을 이용한 반복 판단을 모두 반영합니다.
- ③ 오답: 대입이 먼저 이루어진 뒤 그 값이 조건으로 평가되므로 문자열의 끝을 표시하는 널 문자도 복사됩니다.
- ④ 오답: 반복 본문이 빈 문장일 뿐, 매 반복의 조건식은 평가되며 그 안에서 복사 작업이 일어납니다.
9. goto 논란에 관해 “goto는 조건이 없으므로 프로그램 구조를 언제나 더 단순하게 만든다”라고 주장했다. 가장 적절한 교정은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
- ① 오답: goto는 변수 값을 저장하는 대입문이 아니라 지정한 위치로 흐름을 옮기는 무조건 분기문입니다.
- ② 오답: goto의 핵심은 조건문 내부 사용 여부가 아니라 조건 없이 목적지로 분기한다는 데 있습니다.
- ③ 오답: 바로 다음 문장으로만 이동한다면 분기의 의미가 없으며, 강의는 목적지를 여러 곳으로 지정할 수 있음을 문제로 듭니다.
- ④ 정답: 조건의 부재가 단순성을 보장하는 것이 아니라, 눈에 보이는 구조 밖의 연결이 프로그램 파악 비용을 높일 수 있습니다.
10. 낯선 코드의 문장 역할과 실행 결과를 분석하는 순서로 가장 적절한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
- ① 오답: 결과 추측은 선언과 실행의 역할, 중간 상태 변화를 누락시켜 재현 가능한 분석이 되지 않습니다.
- ② 오답: 구두점 개수는 문장의 의미를 결정하지 않으며 대입·조건·분기의 상호작용도 설명하지 못합니다.
- ③ 정답: 선언문의 준비, 대입문의 상태 갱신, 제어문의 경로 선택을 분리한 뒤 실행 순서로 합치는 분석 절차입니다.
- ④ 오답: 제어문을 제거하면 어떤 대입문이 실제로 실행되는지 달라지므로 원래 프로그램의 결과를 판단할 수 없습니다.
참고 자료와 작성 기준
이 글은 해당 차시 강의자료를 바탕으로 학습 목적에 맞게 재구성한 비공식 학습자료입니다. 개념 관계, 직접 구성한 예제와 문제 해설은 학습자의 이해를 돕도록 구성하고 검토했습니다.
- 작성·편집: 올에이클래스 학습연구팀
- 주요 근거: 한국방송통신대학교 컴퓨터과학과, 「프로그래밍 언어론」 12강 ‘문장’ 강의자료(2025)
- 보충 자료: 외부 보충 자료를 사용하지 않았으며, 해당 차시 강의자료의 범위 안에서 재구성했습니다.
- 편집 원칙: 올에이클래스 편집 정책
- 최종 내용 검토: 2026-08-30
댓글
댓글 쓰기