기본 콘텐츠로 건너뛰기

방송대 방통대 컴퓨터과학개론 12강 - 프로그래밍 언어 (2) - 요약 노트 시험족보 예상문제 - 올에이클래스

컴퓨터과학개론 12강 - 프로그래밍 언어 (2)

컴퓨터과학개론 12강 - 프로그래밍 언어 (2)

블록을 기준으로 정해지는 변수의 유효범위와 함수 호출의 제어 흐름을 이해한다. 값 호출과 참조 호출, 변수의 수명과 기억장소 할당 방식, 객체지향 프로그램의 기반이 되는 추상 자료형과 캡슐화까지 연결하여 살펴본다.

1. 블록과 타입 검사

타입 선언과 타입 검사

프로그래밍 언어에서 변수의 타입(type)은 그 변수에 저장할 수 있는 데이터의 종류와 허용되는 연산을 정한다. 변수나 식의 타입이 정해지면 언어 처리계는 프로그램에 사용된 연산이 해당 타입에 적합한지 검사할 수 있다. 이처럼 데이터와 연산의 타입이 서로 맞는지 확인하는 과정을 타입 검사(type checking)라고 한다.

예를 들어 C 언어의 int x = 10 + "hello";에서 정수와 문자열에 덧셈 연산을 적용하는 것은 타입 규칙에 맞지 않는다. 문장의 겉모양만 보면 대입문 형식을 갖추었지만 피연산자의 타입이 연산에 적합하지 않으므로 이는 타입 오류에 해당한다. 타입 검사는 프로그램 실행과 밀접한 관계가 있으며, 언어에 따라 번역 단계 또는 실행 단계에서 수행될 수 있다.

블록의 의미

블록(block)은 여러 명령문을 하나의 단위로 묶은 프로그램 영역이다. 많은 고급 프로그래밍 언어는 블록 안에 다시 블록을 둘 수 있는 중첩 구조를 제공한다. 블록은 단순히 명령문을 모으는 역할에 그치지 않고, 변수 이름을 어느 범위에서 사용할 수 있는지 판단하는 기준이 된다.

일반적으로 블록은 변수 선언부와 실행할 문장들로 구성된다. 블록 안에서 선언된 변수는 해당 블록의 실행에 필요한 데이터를 보관하며, 블록의 경계를 벗어나면 같은 이름이 다른 기억장소를 가리킬 수 있다.

타입 검사는 데이터와 연산의 적합성을 확인하고, 블록은 변수 이름의 유효범위를 정하는 기본 단위가 된다.

2. 전역변수와 지역변수

변수의 유효범위

유효범위(scope)는 프로그램의 어느 영역에서 변수 이름이 특정 기억장소를 가리키는지를 나타낸다. 같은 이름이 소스 코드의 여러 곳에 나타나더라도 항상 같은 기억장소를 뜻하는 것은 아니다. 어느 선언과 연결되는지를 알아야 그 이름에 값을 저장하거나 읽는 동작을 정확히 해석할 수 있다.

전역변수(global variable)는 프로그램의 넓은 영역에서 이름과 기억장소의 연결이 유효한 변수이다. 반면 지역변수(local variable)는 자신이 선언된 블록 안에서만 그 연결이 유효하다. 지역변수를 사용하면 블록별로 필요한 데이터를 독립적으로 관리할 수 있다.

중첩 블록과 이름 가림

바깥 블록과 안쪽 블록에 같은 이름의 변수가 선언되면 안쪽 블록을 실행하는 동안에는 안쪽 선언이 우선한다. 이때 바깥 변수의 이름과 기억장소 연결은 사라진 것이 아니라 잠시 가려진다. 안쪽 블록이 끝나 지역변수의 연결이 제거되면 바깥 변수의 연결이 다시 보이게 된다.

유효범위는 이름을 사용할 수 있는 코드상의 영역을 말한다. 같은 이름의 변수가 중첩되어 있을 때는 현재 위치에서 가장 가까운 블록의 선언이 우선하는지를 살펴야 한다.

3. 정적 유효범위와 동적 유효범위

정적 유효범위 규칙

정적 유효범위(static scope)는 소스 코드에서 변수 선언이 놓인 위치와 블록의 중첩 관계에 따라 그 이름이 가리킬 기억장소를 결정한다. 프로그램을 실제로 실행하기 전인 번역 시점에도 연결 관계를 판단할 수 있으므로 정적 또는 어휘적 유효범위라고 한다.

정적 규칙에서는 어떤 함수가 어디에서 호출되었는지보다 그 함수가 소스 코드의 어느 블록 안에 정의되어 있는지가 중요하다. 따라서 코드를 읽으며 바깥쪽 선언을 차례로 찾아 변수의 의미를 추적할 수 있다.

동적 유효범위 규칙

동적 유효범위(dynamic scope)는 프로그램의 실제 실행 과정과 함수 호출 순서에 따라 변수 이름의 연결을 결정한다. 현재 실행 중인 블록에서 선언을 찾지 못하면 그 블록을 호출한 실행 환경을 거슬러 올라가며 같은 이름의 변수를 찾는다.

구분판단 기준결정 시점과 특징
정적 유효범위소스 코드의 선언 위치와 블록 중첩번역 시점에 판단 가능하며 코드를 통해 연결을 예측할 수 있음
동적 유효범위실행 중인 함수의 호출 순서실제 실행 환경에 따라 같은 이름의 연결이 달라질 수 있음

4. 함수와 프로시저

서브프로그램의 필요성

프로그램에서 자주 사용하는 코드를 하나의 단위로 묶고 이름을 붙이면, 필요할 때 그 이름을 하나의 명령처럼 호출하여 재사용할 수 있다. 이렇게 독립된 기능을 수행하도록 구성한 프로그램 단위를 서브프로그램(subprogram)이라고 한다. 서브프로그램은 큰 문제를 작은 기능으로 나누어 프로그램을 이해하고 관리하기 쉽게 만든다.

서브프로그램은 일반적으로 함수(function)프로시저(procedure)로 구분한다. 함수는 실행 결과로 값을 되돌려 주는 형태이고, 프로시저는 특정 작업을 수행하는 문장들의 묶음으로서 결과값을 돌려주지 않는 형태이다. 다만 실제 지원 방식은 언어마다 다르다.

C 언어에서의 표현

C와 C++에서는 서브프로그램을 함수로 표현한다. 결과값이 필요하지 않은 프로시저와 같은 기능은 반환형을 void로 선언한 함수로 나타낼 수 있다. 따라서 함수와 프로시저의 개념적 차이를 이해하되, 각 언어가 이를 어떤 문법으로 구현하는지도 함께 살펴야 한다.

5. 함수 호출과 제어 이동

호출자와 피호출자

함수를 부르는 프로그램이나 함수를 호출자(caller), 호출되어 실행되는 함수를 피호출자(callee)라고 한다. 호출이 발생하면 호출자의 실행은 현재 위치에서 잠시 중단되고 프로그램의 제어가 피호출자의 첫 문장으로 이동한다.

피호출자가 반환문이나 종료 조건에 도달하면 제어는 다시 호출자에게 돌아온다. 이때 실행은 함수를 호출했던 문장 다음 지점부터 계속된다. 호출된 함수가 다시 다른 함수를 호출할 수도 있으므로 실행 흐름은 여러 단계로 중첩될 수 있다.

호출 과정

  1. 호출자가 함수 이름과 필요한 인수를 사용해 함수를 호출한다.
  2. 호출자의 실행 위치를 보존하고 제어가 피호출자로 이동한다.
  3. 피호출자가 전달받은 데이터를 사용하여 함수 본문을 실행한다.
  4. 함수가 끝나면 필요한 결과와 제어를 호출자에게 돌려준다.
  5. 호출자는 호출문 다음 문장부터 실행을 재개한다.

함수 호출은 단순한 코드 복사가 아니라 호출자 실행 중단 → 피호출자 실행 → 호출 지점 다음 문장으로 복귀하는 제어 이동 과정이다.

6. 매개변수와 반환값

형식 매개변수와 실 매개변수

매개변수(parameter)는 호출자와 피호출자 사이에서 데이터를 주고받기 위해 사용하는 수단이다. 함수 정의에 적어 놓은 매개변수를 형식 매개변수(formal parameter)라고 하며, 호출자가 실제 호출문에서 전달하는 값이나 변수를 실 매개변수(actual parameter) 또는 인수라고 한다.

예를 들어 int f(int x) { return x + 2; }에서 x는 형식 매개변수이다. val의 값이 10일 때 f(val)을 호출한다면 val은 실 매개변수이고, 함수가 계산하여 되돌려 주는 값은 12가 된다.

반환형과 반환값

반환값(return value)은 함수가 작업을 마친 뒤 호출자에게 돌려주는 실행 결과이다. 함수 정의에는 반환할 데이터의 타입을 명시하며, 반환값이 없는 함수는 void를 반환형으로 사용한다. 호출자는 반환값을 변수에 저장하거나 다른 식의 일부로 사용할 수 있다.

구분나타나는 위치역할
형식 매개변수함수 정의피호출자가 입력 데이터를 받을 이름을 선언함
실 매개변수함수 호출문호출자가 실제 값이나 변수를 전달함
반환값함수 실행 종료 시피호출자가 계산 결과를 호출자에게 전달함

7. 값 호출

값을 복사하여 전달하는 방식

값 호출(call by value)은 실 매개변수의 값을 형식 매개변수의 기억장소에 복사하여 전달하는 방식이다. 피호출자는 원본 변수가 아니라 복사된 값을 다룬다. 따라서 함수 안에서 형식 매개변수의 값을 바꾸어도 호출자에 있는 실 매개변수의 값은 변하지 않는다.

값이 2인 a와 값이 3인 bswap(a, b)에 값 호출로 전달한다고 하자. 함수의 형식 매개변수 xy에는 각각 2와 3이 복사된다. 함수 안에서 xy를 교환해도 지역 복사본만 바뀌므로 함수 종료 후 호출자의 a는 2, b는 3으로 유지된다.

값 호출은 원본 종이를 건네는 것이 아니라 내용을 베낀 종이를 건네는 것과 같다. 복사본을 수정해도 원본에는 영향을 주지 않는다.

8. 참조 호출

기억장소 주소를 전달하는 방식

참조 호출(call by reference)은 실 매개변수의 기억장소 주소를 피호출자에게 전달하는 방식이다. 형식 매개변수가 호출자의 원본 기억장소를 참조하므로 함수 안에서 값을 변경하면 실 매개변수의 값도 함께 변경된다.

C 언어는 포인터를 사용하여 참조 호출의 효과를 구현한다. &는 변수의 기억장소 주소를 구하는 주소 연산자이고, *는 포인터가 가리키는 주소의 내용을 접근하는 역참조 연산자이다. 호출자는 &a&b를 전달하고, 함수는 포인터를 통해 두 원본 기억장소의 내용을 교환한다.

초기에 a=2, b=3이라면 참조 방식의 교환 함수가 끝난 뒤에는 a=3, b=2가 된다. 원본을 수정해야 하는 작업에서는 참조 방식이 필요하지만, 의도하지 않은 변경이 일어나지 않도록 주의해야 한다.

구분전달 대상피호출자의 변경 영향교환 함수 실행 결과
값 호출실 매개변수 값의 복사본원본에 영향 없음a=2, b=3 유지
참조 호출실 매개변수의 기억장소 주소원본 값이 변경됨a=3, b=2로 교환

9. 변수의 수명과 기억장소 할당

변수 수명의 의미

변수의 수명(lifetime)은 변수의 값을 저장할 기억장소가 할당되어 있는 기간이다. 변수 이름과 기억장소의 연결이 만들어지는 때부터 그 연결이 제거되어 기억장소를 더 이상 사용할 수 없게 되는 때까지를 뜻한다.

유효범위와 수명은 서로 관련되지만 같은 개념은 아니다. 유효범위는 소스 코드에서 이름을 사용할 수 있는 공간적 영역이고, 수명은 실행 중 기억장소가 존재하는 시간적 기간이다.

세 가지 할당 방식

할당 방식할당과 회수 시점수명의 특징
자동 할당함수나 블록 실행 시작 시 할당, 종료 시 회수대체로 블록의 실행 기간과 일치함
정적 할당프로그램 시작 시 할당, 프로그램 종료 시까지 유지프로그램 전체 실행 기간 동안 기억장소가 존재함
프로그래머 지정 할당실행 중 프로그래머가 명시적으로 요청하고 해제블록 종료와 독립적으로 해제할 때까지 유지됨

자동 할당 변수는 블록이 실행될 때 필요한 기억장소를 받고 블록이 끝나면 이를 반납한다. 정적 할당 변수는 프로그램이 시작될 때 기억장소가 정해지고 종료될 때까지 유지된다. 프로그래머 지정 할당은 실행 중 필요한 시점에 기억장소를 요청하고 사용이 끝나면 명시적으로 해제하는 방식이다.

시험에서는 ‘이름을 어디에서 쓸 수 있는가’인 유효범위와 ‘기억장소가 언제까지 존재하는가’인 수명을 구분해야 한다.

10. 추상화와 프로시저 추상화

추상화의 기본 원리

추상화(abstraction)는 어떤 대상에서 본질적이고 공통적인 성질만 드러내고, 문제 해결에 필요하지 않은 우연적이거나 세부적인 성질은 감추는 과정이다. 서로 다른 대상에서 공통점을 묶어 하나의 개념으로 표현하면 복잡한 세부 구현을 모두 알지 않고도 대상을 이해하고 사용할 수 있다.

프로시저 추상화

프로시저 추상화(procedural abstraction)는 작업이 내부적으로 어떻게 수행되는지는 숨기고 무엇을 수행하는지만 이름과 입출력으로 나타내는 방식이다. 예를 들어 sort_int(list, list_len)이라는 호출을 사용하는 프로그래머는 정수 배열의 이름과 크기를 전달하면 정렬된다는 사실만 알면 된다. 내부에서 어떤 정렬 알고리즘을 사용하는지는 호출자의 작업에 본질적이지 않다.

이 예에서 배열의 이름, 원소의 데이터 타입, 배열의 크기는 기능을 사용하기 위한 본질적 속성이다. 반면 정렬을 구현한 소스 코드와 구체적인 알고리즘은 호출자에게 우연적 속성이므로 감출 수 있다. 추상화 덕분에 내부 구현을 변경하더라도 외부에서 사용하는 호출 방법을 유지할 수 있다.

11. 추상 자료형과 캡슐화

데이터 추상화

데이터 추상화는 데이터를 그 데이터에 적용할 수 있는 연산과 함께 묶어 표현하고, 외부에서는 정해진 연산을 통해서만 다루게 하는 방식이다. 이는 프로그램의 재사용성을 높이고 내부 표현의 변경이 외부 코드에 미치는 영향을 줄인다.

추상 자료형의 조건

추상 자료형(abstract data type, ADT)은 데이터와 그 데이터를 처리하는 연산을 하나의 단위로 선언한 자료형이다. 추상 자료형의 선언은 구체적인 구현 방법과 독립적이어야 하며, 제공하는 연산의 선언에는 그 연산이 무엇을 의미하고 어떤 결과를 내는지에 관한 의미 명세가 포함되어야 한다.

예를 들어 어떤 자료형이 값을 넣고 꺼내는 연산을 제공한다면 사용자는 내부 저장 방식보다 각 연산의 이름, 필요한 입력, 실행 결과를 통해 자료형을 사용한다. 같은 외부 명세를 지키는 한 내부 구현은 다른 방법으로 교체할 수 있다.

캡슐화의 창

캡슐화(encapsulation)는 데이터와 연산을 한 단위 안에 보호하고, 외부에 필요한 부분만 공개하는 원리이다. 강의에서는 프로그래머가 정의된 추상 자료형 이름을 통해 객체를 호출할 수 있도록 캡슐화가 하나의 ‘창’을 제공한다고 설명한다.

공개 부분(public part)은 외부 프로그래머가 그 창을 통해 객체를 어떻게 사용할 수 있는지 보여 준다. 비공개 부분(private part)은 실제 데이터 표현과 연산 구현을 감추고 보호한다. 외부에서는 공개된 연산만 사용하므로 객체의 내부 일관성을 유지하기 쉽다.

추상 자료형은 데이터와 연산의 명세에 초점을 두고, 캡슐화는 공개된 사용 방법과 감춰진 구현을 분리한다.

12. 핵심 개념 정리

  • 유효범위는 프로그램의 어느 영역에서 변수 이름이 특정 기억장소를 가리키는지에 관한 개념이다.
  • 중첩 블록에서 같은 이름의 지역변수가 선언되면 안쪽 변수가 바깥 변수의 연결을 잠시 가린다.
  • 정적 유효범위는 소스 코드의 선언 위치와 중첩 관계로, 동적 유효범위는 실제 함수 호출 순서로 결정한다.
  • 함수 호출 시 제어는 호출자에서 피호출자로 이동하고, 함수가 끝나면 호출문 다음 지점으로 돌아온다.
  • 형식 매개변수는 함수 정의에, 실 매개변수는 호출문에 나타난다.
  • 값 호출은 값을 복사하므로 원본을 바꾸지 않고, 참조 호출은 기억장소 주소를 전달하므로 원본을 바꿀 수 있다.
  • 변수의 수명은 값을 저장할 기억장소가 할당되어 있는 기간이며 자동·정적·프로그래머 지정 할당에 따라 달라진다.
  • 추상 자료형은 데이터와 관련 연산을 함께 선언하고, 구현과 독립된 의미 명세를 제공한다.
  • 캡슐화는 공개 부분을 사용의 창으로 제공하고 비공개 구현을 보호한다.

이번 강의의 흐름은 이름의 연결, 함수 사이의 데이터 전달, 기억장소의 존재 기간, 구현의 은닉으로 이어진다. 유효범위와 수명, 값 호출과 참조 호출처럼 비슷해 보이는 개념을 판단 기준과 실행 결과로 비교하면 핵심을 정확히 이해할 수 있다.

13. 예상문제 20선

1. 변수의 유효범위에 대한 설명으로 옳은 것은?

정답입니다.

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

정답 및 해설 보기

정답: ①
유효범위는 이름을 사용할 수 있고 그 이름이 특정 기억장소와 연결되는 코드상의 영역이다.

2. 지역변수에 대한 설명으로 옳은 것은?

정답입니다.

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

정답 및 해설 보기

정답: ②
지역변수의 연결은 선언된 블록 내부에서 유효하며, 중첩된 같은 이름의 선언이 있으면 잠시 가려질 수 있다.

3. 정적 유효범위를 결정하는 주된 기준은?

정답입니다.

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

정답 및 해설 보기

정답: ③
정적 유효범위는 소스 코드에 나타난 선언의 위치와 어휘적 중첩 구조를 이용해 번역 시점에 판단할 수 있다.

4. C 문장 int x = 10 + "hello";에서 나타나는 오류의 종류는?

정답입니다.

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

정답 및 해설 보기

정답: ④
정수와 문자열은 덧셈 연산에 함께 사용할 수 없는 타입이므로 타입 규칙 위반이다.

5. 함수와 프로시저를 포괄하는 프로그램 단위는?

정답입니다.

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

정답 및 해설 보기

정답: ①
자주 사용하는 코드를 이름 붙인 독립 기능 단위인 서브프로그램은 함수와 프로시저로 나눌 수 있다.

6. 함수 호출이 일어날 때의 제어 흐름으로 옳은 것은?

정답입니다.

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

정답 및 해설 보기

정답: ②
제어는 호출자에서 피호출자로 이동하며, 피호출자가 종료되면 저장해 둔 호출 지점의 다음 문장으로 복귀한다.

7. 함수 정의에 사용되어 피호출자가 입력을 받을 이름은?

정답입니다.

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

정답 및 해설 보기

정답: ③
형식 매개변수는 함수 정의에 나타나고, 실 매개변수는 호출문에서 실제로 전달하는 값이나 변수이다.

8. 함수가 작업을 마친 뒤 호출자에게 돌려주는 실행 결과를 무엇이라 하는가?

정답입니다.

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

정답 및 해설 보기

정답: ④
반환값은 피호출자가 계산하여 호출자에게 전달하는 결과이며 반환형은 그 데이터 타입을 나타낸다.

9. 값 호출에 대한 설명으로 옳은 것은?

정답입니다.

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

정답 및 해설 보기

정답: ①
값 호출은 값의 복사본을 전달하므로 피호출자가 형식 매개변수를 바꾸어도 호출자의 원본은 변하지 않는다.

10. a=2, b=3을 값 호출 방식의 swap(a, b)에 전달한 뒤의 결과는?

정답입니다.

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

정답 및 해설 보기

정답: ②
함수 안에서는 복사된 xy만 교환되므로 호출자의 ab는 그대로이다.

11. 참조 호출의 핵심 특징은?

정답입니다.

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

정답 및 해설 보기

정답: ③
참조 호출은 주소를 통해 호출자의 기억장소 자체에 접근하므로 함수 내부의 변경이 원본에 반영된다.

12. C 언어에서 변수의 기억장소 주소를 얻는 연산자는?

정답입니다.

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

정답 및 해설 보기

정답: ④
&는 변수의 주소를 구하고, *는 포인터가 가리키는 주소의 내용을 접근한다.

13. 변수의 수명에 대한 설명으로 옳은 것은?

정답입니다.

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

정답 및 해설 보기

정답: ①
수명은 이름과 기억장소의 연결이 만들어진 때부터 제거될 때까지, 즉 기억장소가 존재하는 기간이다.

14. 자동 할당 변수의 일반적인 수명은?

정답입니다.

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

정답 및 해설 보기

정답: ②
자동 할당 기억장소는 블록 실행 시 할당되고 블록 실행이 끝나면 회수되는 것이 일반적이다.

15. 프로그램 시작 시 기억장소가 할당되어 프로그램 종료 시까지 유지되는 방식은?

정답입니다.

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

정답 및 해설 보기

정답: ③
정적 할당 변수의 기억장소는 프로그램 전체 실행 기간 동안 유지된다.

16. 프로그래머 지정 할당에 대한 설명으로 옳은 것은?

정답입니다.

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

정답 및 해설 보기

정답: ④
프로그래머 지정 할당의 기억장소는 블록 경계와 독립적으로 명시적 요청부터 해제까지 유지된다.

17. 추상화에 대한 설명으로 가장 적절한 것은?

정답입니다.

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

정답 및 해설 보기

정답: ①
추상화는 문제 해결에 필요한 핵심 속성을 남기고 우연적이거나 세부적인 속성을 숨겨 복잡성을 줄인다.

18. sort_int(list, list_len)을 사용할 때 내부 정렬 알고리즘을 몰라도 되는 원리는?

정답입니다.

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

정답 및 해설 보기

정답: ②
프로시저 추상화는 내부 수행 방법을 감추고 그 기능이 무엇을 하는지와 사용 방법만 보여 준다.

19. 추상 자료형에 대한 설명으로 옳은 것은?

정답입니다.

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

정답 및 해설 보기

정답: ③
추상 자료형은 데이터와 관련 연산을 하나로 선언하고, 연산의 의미를 구체적 구현과 분리하여 명세한다.

20. 객체를 사용할 수 있는 ‘창’을 제공하고 공개 부분과 비공개 부분을 나누는 원리는?

정답입니다.

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

정답 및 해설 보기

정답: ④
캡슐화는 외부에 공개된 사용 방법을 창으로 제공하면서 내부 데이터 표현과 구현을 비공개로 보호한다.

댓글