기본 콘텐츠로 건너뛰기

방송대 방통대 C프로그래밍 7강 - 함수와 기억 클래스(2) - 요약 노트 시험족보 예상문제 - 올에이클래스

C프로그래밍 7강 - 함수와 기억 클래스(2)

C프로그래밍 7강 - 함수와 기억 클래스(2)

함수 호출에서 값과 주소를 매개변수로 전달하는 방식을 비교하고 호출 전후 변수 값의 변화를 이해한다. 변수의 유효범위와 존속기간을 바탕으로 지역·전역 변수와 auto·static·extern·register 기억 클래스의 차이를 정리한다.

1. 함수 호출과 자료 전달

함수를 호출하면 처리에 필요한 자료를 피호출 함수의 매개변수에 전달한다. 함수가 작업을 마치면 처리 결과를 함수 호출식의 값으로 반환하고 호출한 위치로 복귀한다.

int sum(int x, int y)
{
    int z = x + y;
    return z;
}

int d = sum(10, 20);

호출문의 10과 20은 실 매개변수, 함수 헤더의 x와 y는 형식 매개변수이다. 호출 시 두 값이 x와 y로 전달되고 sum이 반환한 30이 호출식의 값이 되어 d에 저장된다.

방식전달 내용원본 변경
값에 의한 전달실 매개변수의 값을 형식 매개변수에 복사형식 매개변수를 바꿔도 원본은 유지
참조에 의한 전달실 매개변수 값이 저장된 곳의 주소 전달주소를 통해 원본을 변경할 수 있음

C의 기본 전달 방식은 값에 의한 전달이다. C가 참조 전달을 직접 지원하지는 않지만 포인터에 주소를 전달하여 같은 목적의 처리를 구현할 수 있다.

2. 값에 의한 자료 전달

값에 의한 전달에서는 실 매개변수의 값을 형식 매개변수에 복사한다. 실 매개변수는 원본이고 형식 매개변수는 복사본이므로 전달이 끝난 뒤 두 변수는 완전히 별개이다.

int sum(int x, int y)
{
    x += y;
    return x;
}

int a = 10, b = 20;
int d = sum(a, b);

함수 안의 x는 30으로 바뀌지만 main의 a는 계속 10이고 b도 20이다. 결과 d만 30을 받는다.

swap(int x, int y) 안에서 x와 y의 값을 교환해도 호출한 쪽의 a와 b는 바뀌지 않는다. 함수 안에서는 x=5, y=3이 되지만 호출 후 a=3, b=5가 그대로 유지된다. 복사본만 교환했기 때문이다.

3. 포인터를 이용한 참조 전달

참조에 의한 전달은 실 매개변수의 값이 저장된 곳의 주소를 전달한다. 주소를 받기 위해 형식 매개변수를 포인터형으로 선언하며 피호출 함수는 역참조를 통해 호출한 쪽의 실제 변수에 접근한다.

void swap(int *x, int *y)
{
    int temp = *x;
    *x = *y;
    *y = temp;
}

int a = 3, b = 5;
swap(&a, &b);

&a&b는 a와 b의 주소이고, 포인터 x와 y는 그 주소를 받는다. *x*y를 수정하면 원본 a와 b가 직접 바뀌어 호출 후 a=5, b=3이 된다.

이 방식은 함수에서 처리한 여러 결과를 매개변수로 돌려받거나 큰 구조체처럼 복사 비용이 큰 인수를 효율적으로 전달할 때 유용하다. 전체 자료를 복사하는 대신 주소만 복사할 수 있기 때문이다.

호출할 때는 주소 연산자 &, 함수 안에서 주소가 가리키는 값에 접근할 때는 역참조 연산자 *를 사용한다.

4. 유효범위와 지역·전역 변수

유효범위의 개념

유효범위(scope)는 변수나 함수 등의 명칭을 사용할 수 있는 영역이다. 지역변수와 전역변수는 선언 위치에 따라 사용할 수 있는 범위가 달라진다.

지역변수는 블록이나 함수 내부에 선언되며 형식 매개변수도 지역변수에 포함된다. 자신이 선언된 블록 또는 함수 안에서만 사용할 수 있다. 서로 다른 함수에 같은 이름의 지역변수가 있어도 각각 별개의 변수이다.

전역변수는 함수 밖에 선언되어 프로그램 전체에 걸쳐 사용할 수 있다. 같은 파일 또는 다른 파일에 선언될 수 있으며 명시적으로 초기화하지 않으면 0으로 초기화된다.

이름 가림

같은 이름의 여러 변수가 현재 위치에서 모두 보이면 가장 안쪽 블록에 선언된 지역변수가 우선한다. 전역 a=10, 함수 지역 a=20, 안쪽 블록 지역 a=30이면 안쪽 블록에서는 30, 블록을 나온 함수에서는 20이 출력된다.

가급적 지역변수를 사용하면 함수의 독립성이 높아지고 디버깅이 쉬우며 기억공간을 절약하고 재귀 호출 함수도 자연스럽게 작성할 수 있다. 전역변수는 프로그램 선두에 선언하는 것이 권장된다.

5. 기억 클래스의 개념

기억 클래스(storage class)는 변수의 존속기간, 유효범위, 저장 위치 등을 결정하는 개념이다. C의 주요 기억 클래스는 자동변수, 정적변수, 외부변수, 레지스터 변수이다.

기억 클래스예약어존속기간초기화 생략 시
자동변수auto블록 진입부터 이탈까지미지의 값
정적변수static프로그램 시작부터 종료까지0
외부변수extern프로그램 시작부터 종료까지0
레지스터 변수register자동변수와 같음미지의 값

같은 지역변수라도 기억 클래스에 따라 호출 사이에 값을 유지하는지, 블록을 나갈 때 사라지는지가 달라진다.

6. 자동변수와 정적변수

자동변수

자동변수는 지역변수에 적용할 수 있으며 auto로 선언한다. 지역변수의 기본 기억 클래스이므로 예약어를 생략할 수 있다. 소속 함수나 블록에 진입할 때 생성되고 빠져나갈 때 제거되며 해당 함수나 블록 안에서만 사용할 수 있다.

명시적으로 초기화하지 않은 자동변수는 미지의 값을 가지므로 사용 전 적절히 초기화해야 한다. 중첩 블록에서 같은 이름의 자동변수가 선언되면 가장 안쪽 변수가 우선하고 블록을 나오면 바깥 변수가 다시 보인다.

정적변수

정적변수static으로 선언하며 프로그램 시작 시 생성되어 종료할 때까지 유지된다. 함수나 블록 안에 선언하면 유효범위는 해당 함수나 블록으로 제한되지만 값의 존속기간은 프로그램 전체이다. 함수 밖에 선언하면 해당 파일 안에서만 사용할 수 있다.

void test()
{
    auto int a = 0;
    static int s = 0;
    printf("auto = %d, static = %d\n", a, s);
    ++a;
    ++s;
}

test를 세 번 호출하면 a는 호출할 때마다 새로 0이 되므로 계속 0을 출력한다. s는 이전 호출의 값을 유지하여 0, 1, 2를 차례로 출력한다. 초기값을 생략한 정적변수는 자동으로 0이 된다.

정적 지역변수는 유효범위는 지역적이지만 존속기간은 프로그램 전체라는 두 특성을 동시에 갖는다.

7. 외부변수와 레지스터 변수

외부변수

외부변수는 함수 밖에서 정의한 전역변수이며 extern 선언으로 다른 위치나 파일에 정의된 변수를 사용할 수 있다. 프로그램 시작부터 종료까지 유지되고 프로그램 전체 범위에서 연결하여 사용할 수 있으며 초기값을 생략하면 0이 된다.

전역 i=10, j=20이 있고 main 안에 지역 j=100을 선언하면 지역 j가 전역 j를 가린다. extern int i;extern int k;로 외부 정의를 참조하면 출력은 i=10, j=100, k=50이 된다.

한 파일에 전역 문자 배열 s를 정의하고 다른 파일에서 extern char s[];로 선언하면 두 파일이 같은 문자열 자료를 공유할 수 있다.

레지스터 변수

레지스터 변수register를 지정하여 CPU 레지스터에 자료를 저장해 달라고 요청한다. 반복문의 카운터처럼 매우 자주 사용하는 변수의 실행 속도를 높이려는 목적이다. 실제 배치 여부는 처리 시스템에 따라 달라진다.

레지스터 변수의 존속기간, 유효범위, 초기값 특성은 자동변수와 같다. 강의 예에서 register형 i를 0부터 10까지 반복하면 최종 i는 10으로 조정되고 합은 55가 된다.

핵심 개념 정리

  • 값에 의한 전달은 실 매개변수 값을 복사하므로 함수 안에서 형식 매개변수를 바꿔도 원본은 유지된다.
  • C에서는 포인터에 원본 주소를 전달하여 참조 전달과 같은 처리를 구현한다.
  • 지역변수는 선언한 블록이나 함수에서만, 전역변수는 프로그램 전체에서 사용할 수 있다.
  • 같은 이름이 겹치면 가장 안쪽 블록의 지역변수가 바깥 변수의 이름을 가린다.
  • 기억 클래스는 변수의 존속기간, 유효범위, 저장 위치 등을 결정한다.
  • 자동변수는 블록 진입 시 생성되고 이탈 시 제거되며 초기화하지 않으면 미지의 값을 갖는다.
  • 정적변수는 프로그램 실행 동안 유지되고 호출 사이에 값을 보존한다.
  • 외부변수는 다른 위치나 파일의 전역변수를 연결해 사용하고, 레지스터 변수는 빠른 처리를 요청한다.

최종 정리: 함수가 원본을 바꿀 수 있는지는 값과 주소 중 무엇을 전달했는지로 판단한다. 변수의 사용 가능 영역은 유효범위, 값이 유지되는 시간은 존속기간이므로 기억 클래스를 비교할 때 두 기준을 분리해 살펴야 한다.

예상문제 20선

1. C 언어의 기본적인 매개변수 전달 방식은?

정답입니다.

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

정답 및 해설 보기

정답: ①
C는 실 매개변수의 값을 형식 매개변수에 복사하는 값 전달을 기본으로 한다.

2. 값에 의한 전달에서 형식 매개변수를 수정하면?

정답입니다.

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

정답 및 해설 보기

정답: ②
형식 매개변수는 원본 값의 복사본이므로 둘은 전달 후 별개의 변수이다.

3. C에서 참조 전달과 같은 처리를 구현하는 수단은?

정답입니다.

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

정답 및 해설 보기

정답: ③
원본 변수의 주소를 포인터 매개변수에 전달하면 함수에서 원본을 직접 수정할 수 있다.

4. swap(&a, &b)에서 &a가 뜻하는 것은?

정답입니다.

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

정답 및 해설 보기

정답: ④
주소 연산자 &는 피연산자인 변수의 메모리 주소를 구한다.

5. 유효범위(scope)의 의미는?

정답입니다.

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

정답 및 해설 보기

정답: ①
유효범위는 선언한 명칭이 코드의 어느 영역에서 보이고 사용 가능한지를 나타낸다.

6. 지역변수에 포함되는 것은?

정답입니다.

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

정답 및 해설 보기

정답: ②
형식 매개변수는 피호출 함수 안에서 지역변수처럼 사용된다.

7. 명시적으로 초기화하지 않은 전역변수의 초기값은?

정답입니다.

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

정답 및 해설 보기

정답: ③
전역변수는 초기값을 생략하면 자동으로 0으로 초기화된다.

8. 같은 이름의 전역변수와 지역변수가 모두 보일 때 우선하는 것은?

정답입니다.

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

정답 및 해설 보기

정답: ④
안쪽 지역변수가 같은 이름의 바깥 변수와 전역변수를 가린다.

9. 기억 클래스가 결정하는 내용에 포함되지 않는 것은?

정답입니다.

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

정답 및 해설 보기

정답: ①
기억 클래스는 변수의 존속기간, 유효범위, 저장 위치 등을 결정한다.

10. 지역변수의 기본 기억 클래스는?

정답입니다.

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

정답 및 해설 보기

정답: ②
지역변수는 별도 지정이 없으면 자동변수이며 auto 예약어는 생략할 수 있다.

11. 자동변수의 존속기간은?

정답입니다.

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

정답 및 해설 보기

정답: ③
자동변수는 블록 진입 시 생성되고 이탈 시 제거된다.

12. 초기화하지 않은 자동변수의 값은?

정답입니다.

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

정답 및 해설 보기

정답: ④
자동변수는 자동 0 초기화가 되지 않으므로 사용 전에 명시적으로 초기화해야 한다.

13. 정적변수의 존속기간은?

정답입니다.

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

정답 및 해설 보기

정답: ①
static 변수는 프로그램이 실행되는 전체 기간 동안 저장공간과 값을 유지한다.

14. test 함수의 static int s=0;를 세 번 증가시키며 호출할 때 출력 순서는?

정답입니다.

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

정답 및 해설 보기

정답: ②
정적 지역변수는 호출 사이에 값을 보존하므로 출력 후 증가한 값이 다음 호출에 이어진다.

15. 다른 파일에 정의된 전역변수를 연결해 사용할 때 지정하는 예약어는?

정답입니다.

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

정답 및 해설 보기

정답: ③
extern은 함수 밖이나 다른 파일에 정의된 외부변수를 참조한다고 선언한다.

16. 레지스터 변수의 주된 사용 목적은?

정답입니다.

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

정답 및 해설 보기

정답: ④
register는 CPU 레지스터 저장을 요청하여 반복 카운터 같은 변수의 처리 속도를 높이려는 것이다.

17. 레지스터 변수의 존속기간과 유효범위 특성은 어떤 변수와 같은가?

정답입니다.

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

정답 및 해설 보기

정답: ①
register 변수의 존속기간, 유효범위, 초기값 특성은 자동변수와 같다.

18. 큰 구조체의 전달에 주소 방식이 효율적인 이유는?

정답입니다.

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

정답 및 해설 보기

정답: ②
용량이 큰 인수 전체를 형식 매개변수에 복사하는 대신 작은 주소 값만 전달할 수 있다.

19. 가급적 지역변수를 사용할 때의 장점이 아닌 것은?

정답입니다.

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

정답 및 해설 보기

정답: ③
지역변수는 오히려 함수 간 결합을 줄여 독립성을 높인다.

20. 유효범위와 존속기간의 구분으로 옳은 것은?

정답입니다.

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

정답 및 해설 보기

정답: ④
정적 지역변수처럼 범위는 지역적이지만 수명은 프로그램 전체일 수 있으므로 두 개념을 구분해야 한다.

댓글