기본 콘텐츠로 건너뛰기

방송대 방통대 프로그래밍언어론 12강 - 대입문과 제어문의 동작 원리 - 요약 노트 시험족보 예상문제 - 올에이클래스

0-썸네일-요약노트-프로그래밍언어론-12강

프로그래밍언어론 12강 - 대입문과 제어문의 동작 원리

처리를 나타내는 문장을 선언문과 실행문으로 구분하고, 변수의 값을 변경하는 대입문의 여러 형태와 타입 변환을 학습한다. 조건문·반복문·무조건 분기문이 프로그램의 수행 흐름을 어떻게 바꾸는지 언어별 표현과 실행 과정에 초점을 맞추어 정리한다.

제1장 선언문과 실행문

1. 문장이란 무엇인가

문장(statement)은 처리를 나타내는 표현이다. 프로그램은 데이터를 처리하기 위한 문장의 나열로 구성된다. 문장은 기능에 따라 선언문과 실행문으로 나뉜다. 선언문은 프로그램에서 사용할 이름과 그 성질을 준비하고, 실행문은 준비된 변수·연산자·서브프로그램을 실제로 이용해 데이터를 처리한다.

예를 들어 int y;int add(int, int);는 각각 변수와 서브프로그램을 준비하는 선언문이다. y = add(3, 4);는 함수를 호출해 얻은 값을 변수에 저장하는 실행문이고, if (y > 5) y = 10; else y = 0;은 조건에 따라 다른 대입을 수행하도록 흐름을 제어하는 실행문이다.

2. 선언문의 역할

선언문은 변수나 서브프로그램의 이름을 만들어 이후에 사용할 수 있도록 준비한다. 변수 선언문은 변수명과 타입 같은 속성을 바인딩한다. int y;y라는 이름과 정수형을 연결한다. 서브프로그램 선언문은 서브프로그램의 프로토콜을 명시한다. int add(int, int);는 두 정수를 인수로 받아 정수를 반환하는 add의 호출 규약을 알린다.

3. 실행문의 역할

실행문은 변수, 연산자, 서브프로그램을 사용해 실제 데이터를 처리한다. 실행문은 변수의 값을 바꾸는 대입문과 프로그램의 수행 순서를 바꾸는 제어문으로 구분된다. 제어문에는 조건에 따라 갈래를 선택하는 조건문과 원하는 처리를 되풀이하는 반복문 등이 있다.

구분역할
변수 선언문변수명과 타입 등을 바인딩int y;
서브프로그램 선언문서브프로그램의 프로토콜을 명시int add(int, int);
대입문변수의 값을 변경y = add(3, 4);
제어문조건·반복 등으로 수행 흐름을 제어if (y > 5) ...

핵심 구분: 선언문은 이름과 속성을 준비하고, 실행문은 준비된 요소로 데이터를 처리한다. 대입문과 제어문은 모두 실행문에 속한다.

제2장 대입문과 대입 연산자

1. 대입문의 기본 동작

대입문(assignment statement)은 변수의 값을 변경하는 문장으로 프로그램에서 가장 자주 사용된다. 대입 연산자의 오른쪽 부분을 먼저 계산한 뒤 그 결과를 왼쪽 변수의 값으로 저장한다. 예를 들어 A = 5;는 정수 5를 계산해 변수 A가 사용하는 메모리 공간에 저장한다.

대입 연산자의 표기는 언어마다 다르다. C, C++, Java, Python 등은 =를 사용하고, Algol·Pascal·Ada 등은 :=를 사용한다. COBOL은 MOVE 5 TO A와 같이 쓴다. 표기는 달라도 오른쪽 값을 왼쪽 변수에 저장한다는 기본 의미는 같다.

C, C++, Java에서는 A = 5 자체가 값 5를 갖는 수식이며, 끝에 세미콜론을 붙인 A = 5;가 문장이 된다. 이 특징은 연속 대입과 다른 수식 속 대입을 이해하는 기초가 된다.

2. 연속 대입문

C = B = A = 5;는 하나의 값을 여러 변수에 대입하는 연속 대입문이다. 대입 연산자는 우결합이므로 오른쪽부터 계산한다. 먼저 A = 5를 수행하고 이 대입 수식의 값도 5가 된다. 다음으로 B = 5, 마지막으로 C = 5가 차례로 수행되어 세 변수 모두 5를 갖는다.

실행 순서: C = B = A = 5;C = B = 5;C = 5;. 단순히 왼쪽부터 저장한다고 해석하면 안 된다.

3. C++의 조건 연산자를 이용한 대입

C++에서는 조건 연산자로 값이 대입될 변수를 선택할 수 있다. (cond ? t : f) = 5;에서 cond가 참이면 t에 5를 대입하고, 거짓이면 f에 5를 대입한다. 이는 if (cond) t = 5; else f = 5;와 같은 효과를 낸다.

이 예에서 조건 연산자는 대입할 값이 아니라 대입의 대상이 될 변수를 고른다. 조건에 따라 왼쪽 값이 될 수 있는 두 변수 가운데 하나를 선택한다는 점이 일반적인 조건 수식과 구별되는 특징이다.

4. 복합 대입 연산자

복합 대입 연산자는 산술 또는 비트 연산자와 대입 연산자를 결합한다. 변수의 현재 값을 읽고 연산한 뒤 결과를 같은 변수에 다시 저장하는 과정을 간결하게 표현한다.

연산자의미기본 형태
+=현재 값에 더한 결과를 대입a += b
-=현재 값에서 뺀 결과를 대입a -= b
*=, /=, %=곱·몫·나머지를 계산해 대입a *= b
>>=, <<=비트를 오른쪽·왼쪽으로 이동한 결과를 대입a <<= 1

5. 단항 대입 연산자

++는 피연산자의 값에 1을 더해 다시 대입하고, --는 1을 빼서 다시 대입한다. 값 변경 효과만 보면 a++, a += 1, a = a + 1은 모두 a를 1 증가시킨다. 마찬가지로 --b, b -= 1, b = b - 1b를 1 감소시킨다.

대입문의 공통점: 기본 대입, 연속 대입, 복합 대입, 증가·감소 연산은 표현이 달라도 결국 변수에 새로운 값을 바인딩한다. 각 연산의 결합 방향과 수식으로서의 값에 주의해야 한다.

제3장 대입과 타입 변환

1. 타입 변환이 필요한 경우

타입 변환은 주어진 타입의 값을 다른 타입의 값으로 바꾸는 것이다. 대입할 값의 타입과 값을 받을 변수의 타입이 서로 다르면 변환이 필요하다. 실수형 값 1.5를 정수형 변수에 대입하는 경우처럼 표현 범위나 정밀도가 다른 타입 사이의 변환에서는 값의 일부 정보가 사라질 수 있다.

2. 묵시적 타입 변환

묵시적 타입 변환은 별도의 변환 표기 없이 값의 타입을 변수의 타입에 맞추어 변환한 뒤 대입하는 방식이다. 강의에 따르면 C와 C++은 작은 표현 범위에서 큰 범위로 옮기는 확대 변환과 반대 방향의 축소 변환을 모두 허용한다. Java는 묵시적으로 확대 변환만 허용한다.

double pi=3.14, radius=1.5; int area; area = radius * radius * pi;에서 오른쪽 계산 결과는 실수형이고 왼쪽 area는 정수형이다. C와 C++에서는 대입 과정에서 결과가 정수형으로 묵시적으로 변환된다. 축소 변환에서는 소수 부분이나 표현 범위가 손실될 수 있다는 점을 고려해야 한다.

3. 명시적 타입 변환

명시적 타입 변환은 프로그래머가 변환할 타입을 코드에 직접 표시하는 방식이다. 확대 변환과 축소 변환을 모두 표현할 수 있다. 위 예를 area = (int)(radius * radius * pi);로 쓰면 계산 결과를 정수형으로 변환하겠다는 의도를 분명히 나타낸다.

구분변환 주체와 표기강의의 언어별 특징
묵시적 타입 변환언어가 대입 문맥에 맞추어 자동 변환C/C++은 확대·축소, Java는 확대만 가능
명시적 타입 변환프로그래머가 변환 타입을 직접 표시확대·축소 변환 모두 가능

확대 변환은 일반적으로 더 넓은 표현 범위로 옮기고, 축소 변환은 더 좁은 범위로 옮긴다. 명시적 변환은 정보 손실 가능성을 없애는 것이 아니라 프로그래머가 그 변환을 의도했음을 표현한다.

제4장 조건문과 반복문

1. 제어문

제어문(control statement)은 프로그램의 수행 흐름을 제어한다. 문장을 위에서 아래로 한 번씩 실행하는 기본 흐름에서 벗어나 조건에 따라 일부 문장을 선택하거나 원하는 문장을 여러 번 수행하게 한다. 강의에서는 제어문을 조건문과 반복문으로 구분한다.

2. if문

조건문은 조건에 따라 서로 다른 처리를 수행하도록 제어한다. 대표적인 if문은 조건이 참일 때 then에 해당하는 문장을 수행한다. else가 있으면 조건이 거짓일 때 else 쪽 문장을 수행한다.

C에서는 조건을 괄호로 묶고 여러 문장을 중괄호 블록으로 표현한다. Python에서는 조건 뒤에 콜론을 쓰고 들여쓰기로 블록을 표시한다. 예를 들어 y > 5가 참이면 두 언어 모두 y를 10으로 바꾸고 그 값을 출력하며, 거짓이면 0을 대입하고 별도의 문자열을 출력할 수 있다. 표면 구문은 달라도 조건에 따른 두 갈래 선택이라는 의미는 같다.

3. switch문

switch문은 조건식의 값에 따라 여러 갈래 가운데 하나를 선택한다. 하나의 조건을 연속해서 참·거짓으로 검사하는 대신 값 0, 1, 2, 7처럼 여러 경우를 한 번에 나누어 서로 다른 처리를 작성할 수 있다. 각 case는 특정 값에 해당하는 처리를 나타내고, default는 어느 case에도 맞지 않을 때 수행한다.

강의의 C 예제에서는 case 0이면 “zero”, 1이면 “just one”, 2이면 “even”, 7이면 “lucky”를 출력하고 각 처리 끝에 break를 둔다. 나머지 값에는 default가 적용된다.

4. for문

반복문은 원하는 문장을 되풀이해 수행하도록 흐름을 제어한다. for문은 제어 변수를 초깃값에서 시작해 종료 조건을 만족하는 동안 증가분만큼 바꾸며 본문을 반복한다. for (i = 0; i < 100; i++)i를 0부터 99까지 변화시키며 본문을 수행한다.

본문에서 y += i를 수행하면 y에는 0부터 현재 i까지의 누적 합이 저장된다. 초기 y가 0이라면 출력은 0, 1, 3, 6, 10처럼 증가하고 마지막에는 0부터 99까지의 합 4950이 된다.

5. while문과 do-while문

while문은 본문을 수행하기 전에 조건을 검사하고 조건이 참인 동안 반복한다. 처음 검사부터 거짓이면 본문이 한 번도 수행되지 않으므로 반복 횟수는 0번 이상이다. while (max > min) max--;maxmin보다 큰 동안 max를 감소시킨다.

do-while문은 본문을 먼저 수행하고 나서 조건을 검사한다. 따라서 조건이 처음부터 거짓이어도 본문을 적어도 한 번 수행하며 반복 횟수는 1번 이상이다. while문과 do-while문의 가장 중요한 차이는 첫 조건 검사와 첫 본문 수행의 순서이다.

반복문제어 방식최소 반복 횟수
for초깃값·종료 조건·증가분으로 제어조건에 따라 0번 이상
while본문 전에 조건 검사0번
do-while본문 뒤에 조건 검사1번

6. 대입 수식을 조건으로 사용하는 예

강의의 while (*b++ = *a++);는 대입 수식이 값도 갖는 C의 특성을 활용한다. a가 가리키는 문자를 b가 가리키는 곳에 대입하고 두 포인터를 다음 위치로 이동한다. 대입된 문자의 값이 조건값이 되어, 문자열 끝의 널 문자가 대입될 때까지 반복한다. 본문은 세미콜론뿐인 빈 문장이며 실제 복사 처리는 조건식에서 이루어진다.

주의: 대입문과 조건문이 결합될 수 있는 이유는 C 계열에서 대입 수식 자체가 대입한 값을 갖기 때문이다. 조건식에 대입을 사용할 때는 비교 연산과 혼동하지 않도록 동작을 단계별로 읽어야 한다.

제5장 무조건 분기문과 goto 논란

1. 무조건 분기

무조건 분기문은 아무 조건 없이 지정한 위치로 수행 흐름을 옮기는 문장이다. 대표적인 goto문은 기계어와 어셈블리어에서 유래했다. 레이블을 목적지로 지정하며, 실행되면 현재 위치 다음 문장이 아니라 해당 레이블의 문장으로 이동한다.

강의 예제는 i를 1로 초기화한 뒤 레이블 L0에서 값을 출력하고 1 증가시킨다. i가 11이면 종료하고, 그렇지 않으면 goto L0;로 돌아간다. 그 결과 1부터 10까지 출력한다.

2. goto 사용 논란

goto를 프로그램에 포함해야 하는지를 두고 논란이 있다. 목적지를 거의 아무 곳으로나 지정할 수 있어 흐름이 여러 방향으로 얽히면 프로그램의 구조를 파악하기 어렵기 때문이다. 조건문과 반복문처럼 구조화된 제어문은 진입과 종료 관계가 비교적 명확하지만, goto가 많으면 코드의 실행 경로를 추적하기 어려워진다.

강의에서는 goto를 제외한 언어로 Modula-2, CLU, Java, Rust 등을 제시한다. goto가 수행할 수 있는 반복이나 선택의 상당 부분은 조건문과 반복문으로 표현할 수 있으므로, 언어 설계에서는 표현력뿐 아니라 가독성과 구조 파악의 용이성도 함께 고려한다.

goto는 조건을 검사하지 않고 분기한다는 점이 핵심이다. 예제에서 종료 조건은 goto 자체가 아니라 goto 앞의 if문이 검사한다.

핵심 개념 정리

문장은 처리를 나타내며 선언문과 실행문으로 나뉜다. 선언문은 변수와 서브프로그램의 이름 및 속성을 준비하고, 실행문은 실제 데이터를 처리한다. 실행문에는 값을 바꾸는 대입문과 흐름을 바꾸는 제어문이 있다.

대입문은 오른쪽 값을 왼쪽 변수에 저장한다. C 계열의 대입 수식은 값도 가지므로 우결합 연속 대입이 가능하다. 복합 대입, 증가·감소 연산으로 값을 간결하게 갱신하며, 타입이 다르면 묵시적 또는 명시적 타입 변환이 필요하다.

조건문은 조건이나 값에 따라 갈래를 선택하고, for·while·do-while문은 처리를 반복한다. while은 0번, do-while은 적어도 1번 수행될 수 있다는 차이가 있다. goto는 조건 없이 지정 위치로 분기하지만 구조 파악을 어렵게 할 수 있다.

최종 정리: 문장의 종류를 기능에 따라 구분하고, 각 수식의 계산값과 부수 효과, 조건 검사 시점, 흐름 이동 방향을 순서대로 추적해야 한다. 특히 연속 대입의 우결합, 타입 변환 방식, while과 do-while의 최소 수행 횟수는 시험에서 자주 혼동되는 핵심이다.

예상문제 20선

1. 선언문에 대한 설명으로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
선언문은 변수명과 타입을 바인딩하거나 서브프로그램의 프로토콜을 명시해 이후 사용을 준비한다.

2. 실행문의 두 대표 분류는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
실행문은 변수 값을 바꾸는 대입문과 프로그램의 수행 흐름을 조절하는 제어문으로 구분한다.

3. 대입문의 기본 동작을 바르게 설명한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
대입 연산자는 오른쪽 수식의 값을 구한 뒤 왼쪽 변수가 가리키는 저장 공간의 값을 변경한다.

4. 대입 연산자 표기의 연결로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
C·C++·Java·Python은 =, Algol·Pascal·Ada는 :=를 사용하며 COBOL은 MOVE 5 TO A처럼 표현한다.

5. C = B = A = 5;의 실행 결과는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
대입은 오른쪽부터 결합하고 각 대입 수식의 값이 5이므로 A, B, C에 차례로 5가 저장된다.

6. C++의 (cond ? t : f) = 5;가 뜻하는 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
조건 연산자가 대입 대상 변수를 선택하므로 if(cond) t=5; else f=5;와 같은 효과이다.

7. 복합 대입 연산자와 의미의 연결로 옳지 않은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
*=는 현재 값에 오른쪽 값을 곱한 결과를 다시 대입한다. 빼기와 대입의 결합은 -=이다.

8. 변수 a의 값을 1 증가시키는 표현으로 보기 어려운 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
a -= 1은 a를 1 감소시킨다. 나머지 세 표현은 값 변경 효과만 보면 a를 1 증가시킨다.

9. 타입 변환이 필요한 대표 상황은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
서로 다른 타입 사이에서 값을 대입하려면 값의 타입을 변수의 타입에 맞추는 변환이 필요하다.

10. 묵시적 타입 변환에 대한 강의의 설명으로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
묵시적 변환은 언어가 자동 적용한다. 강의에서는 C/C++이 확대와 축소, Java가 확대 변환만 허용한다고 설명한다.

11. area = (int)(radius * radius * pi);에 적용된 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
(int)는 프로그래머가 계산 결과를 정수형으로 변환하겠다고 직접 표시한 캐스트이다.

12. if문에 대한 설명으로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
if문은 조건의 참·거짓에 따라 두 처리 가운데 해당하는 한 갈래를 선택한다.

13. switch문의 주된 용도는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
switch문은 하나의 값에 여러 case를 대응시켜 한 번에 여러 갈래로 수행 흐름을 나눈다.

14. for (i=0; i<100; i++) y += i;에서 초기 y가 0일 때 마지막 y는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
i는 0부터 99까지 변하고 y에는 그 합이 누적된다. 0부터 99까지의 합은 4950이다.

15. while문과 do-while문의 차이로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
while은 처음 조건이 거짓이면 0번 수행하지만 do-while은 본문을 먼저 실행해 적어도 1번 수행한다.

16. while (*b++ = *a++); 예제에 대한 설명으로 알맞은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
대입 수식의 값이 while 조건으로 사용되고 후위 증가로 두 포인터가 다음 위치로 이동한다. 세미콜론 때문에 본문은 비어 있다.

17. 무조건 분기문에 대한 설명으로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
goto는 자체 조건 없이 지정한 레이블로 이동한다. 필요한 종료 조건은 별도의 if문 등이 담당한다.

18. goto 사용이 논란이 되는 주된 이유는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
goto가 여러 위치로 흐름을 이동시키면 구조화된 제어문의 명확한 진입·종료 관계가 약해져 실행 경로를 추적하기 어렵다.

19. 강의에서 goto를 제외한 언어로 제시하지 않은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
강의는 Modula-2, CLU, Java, Rust를 goto를 제외한 언어로 제시한다. C에는 goto문이 있다.

20. 문장과 제어 흐름의 관계를 바르게 정리한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
조건문은 조건이나 값에 따라 처리 갈래를 선택하고, 반복문은 조건 또는 제어 변수에 따라 본문을 반복한다.

댓글