본문 바로가기
카테고리 없음

C언어의 고유 특징에 대하여(27)

by 데일리J형 2022. 6. 8.

지난 시간의 머지와 머지 소트 내용을 마무리하고, 이어서 기억 클래스와 그 유형에 대하여 적어보도록 하겠습니다. 

 

머지(merge)와 머지 소트(merge sort)

⑤free(w);

이 함수는 표준 헤더 파일에서 제공되는 함수로서 역시 stdlib.h의 파일 내에서 정의되어 있으며 이 함수와 calloc() 함수의 선언을 위해 프로그램의 선두 부분에 #include <stdlib.h> 구문이 사용되었습니다. 

이 함수의 목적은 기억 장소 내에 이미 할당된 배열 w를 위한 공간을 프로그램 수행 도중에 동적으로 제거하기 위해 호출되었습니다. 함수가 수행되어 반환되어 반환된 기억 장소를 시스템은 다른 용도를 위해 사용할 수 있게 되므로 메모리의 재활용 차원에서 효과적인 메모리 관리 기법입니다. 

 

버블 소트 방식과 머지 소트 방식을 비교해보면 버블 소트는 배열의 원소의 수가 n이면 수행되는 배열 원소 값들의 비교 횟수는 n2에 비례하며 머지 소트 배열 원소 값들의 비교 횟수가 n log n 값에 비례하므로 속도 면에서 머지 소트가 상당히 효과적이라는 것을 알 수 있습니다. 

 

기억 클래스의 유형

C 언어에서 사용되는 변수나 함수들을 저장하기 위해 물리적인 기억 장소로 CPU의 레지스터와 메모리가 사용되는데 메모리의 효율성을 높이기 위해 기억 장소를 메모리로 할당할 때 여러 가지 기법이 제공되며 이러한 저장 장소에 관한 정보는 사용자가 정의해야 합니다. 이러한 정보의 지정을 위해 C 언어에서는 모든 변수들과 함수들에 대한 자료형과 기억 클래스의 유형이라는 두 가지 특성을 제공하고 있으며, 자료형은 int, char, float, double 등이 제공되며 기억 클래스의 종류로는 자동(auto), 외부(extern), 레지스터(register), 정적(static)의 네 가지가 제공되고 있습니다.

 

auto 기억 클랙스

지금까지 사용해 왔던 대부분의 변수나 함수들에 대한 저장 방식은 자동 저장 방식을 사용해 왔으며 이 경우의 auto라는 키워드를 생략할 수 있기 때문에 특별한 정의를 하지 않아 왔습니다. auto라고 불리는 자동 변수는 함수의 몸체 내에서 선언되는 변수들로 선언된 몸체 안에서만 그 효력을 갖는 변수들입니다. 

 

예를 들어 다음과 같이 func1() 함수 내에서 선언된 i, j, f와 같은 변수들은 자동 변수입니다. 

 

int func1()
{
    auto int i, j;
    auto float f;
}

위 함수에서 사용된 auto라는 기억 클래스 분류자는 생략할 수 있기 때문에 거의 사용하지 않으며 따라서 기억 클래스 분류자가 없는 변수는 자동 변수로 생각하면 됩니다. 컴퓨터가 위의 예에서처럼 함수 내에서 선언된 자동 변수들에 대한 기억 공간을 할당하게 되면, 이 변수들은 단지 선언된 함수 블록 내에서만 사용 가능한 지역 변수로 사용되며 그 함수의 범위에서 벗어나게 되면 설정된 자동 변수의 기억 공간도 사라지게 됩니다. 그러나 다시 그 함수를 호출하게 될 경우 컴퓨터는 그 함수 내에서 선언된 변수들을 위한 기억 공간을 마련하게 되나 이전에 사용한 값은 더 이상 유효하지 않게 되므로 그 변수의 값에 대한 초기 값이 필요한 경우는 명시적으로 지정해야 오류를 피할 수 있습니다. 

 

extern 기억 클래스

서로 다른 함수 간에 변수가 가지고 있는 값을 공유할 필요가 있는 경우는 외부 변수를 사용해야 하는데 외부 변수의 선언은 어떤 함수에도 포함되지 않게 함수 블록 밖에서 선언해야 합니다. 이와 같이 외부에서 선언된 변수의 값은 모든 함수의 내부에서 그 값을 계속적으로 사용할 수 있으며 프로그램 전체가 종료될 때까지 값을 유지시킬 수 있기 때문에 전역(global) 변수라고도 합니다. 외부 변수를 선언하는 방법은 자동 변수의 형식과 동일하나 선언되는 위치가 함수의 내부가 아닌 외부라는 점에서 차이가 있습니다. 

 

다음의 프로그램은 매우 커다란 프로그램을 작성할 때 사용하는 방식으로 몇 개의 파일로 작성된 프로그램을 서로 독립적으로 컴파일하여 링크시키면 하나의 실행파일로 생성합니다. 이 예에서 file1.c에 들어 있는 main() 함수와 file2.c에 들어있는 func2() 함수에서 공통적으로 어떤 변수를 사용할 경우 이 변수를 외부 변수로 선언하게 되는데 file1.c에서 선언된 변수 i, j, k와 func2() 함수의 선언된 위치가 어느 함수 내에도 포함되어 있지 않으며 앞의 기억 클래스 분류자인 extern은 생략 가능하기 때문에 생략하는 것이 일반적인 관례입니다. 

 

 

댓글