C 언어에서 변수와 상수에 대하여 1

Posted on

프로그래밍 언어에서 제일 중요하고 기초적인 요소가 변수와 상수일 것입니다. 프로그램이 작동하려면 데이터를 처리해야 하고 데이터를 처리하려면 데이터를 메모리 상에 적재해야 합니다. 변수와 상수는 데이터를 메모리에 적재하는 방법을 정의하는 문법 요소로 이들이 반드시 지정되어 있어야 처리가 됩니다. 변수란 값을 담는 그릇이라고 비유될 수 있습니다. 그릇 종류가 정해져 있고 요리사는 이들 그릇의 종류에 따라 알맞은 음식을 담아냅니다. 국그릇에는 국을 담고, 밥그릇에는 밥을 담습니다. 이와 같이 프로그래밍 언어에서도 데이터를 담을 데이터 타입을 지정해주어야 합니다. 언어마다 다르지만, C 언어에서는 상당히 정확해야 하기에, 프로그래머가 직접 변수의 타입 (자료형) 을 지정해주어야 하고 이에 따라 있게 되는 기술적 특징이 결정됩니다.

문법적으로 다음과 같은 형태로 지정됩니다.

또는

이렇게 되고, 이를 프로그래밍 언어 일반론으로 번안하면

이 됩니다.

이를 실재 C 언어로 표현하면

이렇게 표현합니다. 예에서는 a라는 변수명을 가진 메모리 구간을 정수형(int)으로 지정해서 공간을 할당한 후, 100을 대입하는 구문입니다.

다시 말하자면 int a; 구문으로 정수형 데이터를 저장할테니 준비해달라는 요청이구요. a = 100; 은 a가 100과 같다는 말이 아니라, a라는 변수에 100을 대입하라는 의미입니다.

맨위에 비유와 함께 말하자면 그릇은 변수이고 변수는 바뀔 수 있다는 의미로, 프로그램 실행시 바뀔수 있는 데이터를 대입해서 씁니다. 변수 개념과 대조되는 개념은 상수로, 한번 지정되면 바뀔 수 없는 값이 상수입니다.

상수는 두가지 방법으로 C 언어에서 지정됩니다. 매크로 상수가 있고 const 한정자를 붙여서 지정하는 상수가 있습니다.

이 두가지 방법은 기능은 흡사하지만 매크로 상수는 전처리기에 의해 컴파일시 지정한 이름표(MAX_SCORE)를 소스코드에서 찾아내면 100으로 치환하라는 의미이고, const 상수는 변수처럼 작동하지만 역시 치환 기능이 되도록 작동합니다. 아래처럼 활용이 됩니다.

변수의 특징은 데이터 타입을 반드시 잘 지정해두어야 한다는 것이구요. 데이터 타입을 잘 지정하지 않고 변수를 선언하고 초기화하면 타입 불일치 오류 (type mismatch error) 가 나게 됩니다. 타입이 서로 다를때 이후에 오류가 생길 수 있어서 미리 오류를 뿜고 컴파일을 중단하는 것입니다. 프로그래머는 이를 발견하면 소스코드를 적절하게 고쳐야 합니다.

데이터 타입은 때때로 타입이라고 간단하게 지칭되거나 자료형으로 불리우기도 합니다. 엄밀히 보면 구별점이 있는데 타입은 기본 자료형과 확장된 자료형 (클래스나 구조체 등으로 지정되는 데이터 타입) 이라는 정의도 있고, 자료형은 기본 자료형(primitive data type) 이라고도 하는데 사실 둘다 혼용되는 경우가 많습니다. 이 글에서는 구별을 안하고 쓰기로 합니다.

C 언어의 자료형은 정수형, 부동소수형, 문자형, 문자열 등으로 구분됩니다. 정수형은 short int, int, long int, long long int가 있고, int를 생략하고 기재하기도 합니다. short int는 short라고 하면 되죠. 부동소수형은 float, double, long double이 있습니다. 각각의 자료형은 하드웨어 아키텍처와 컴파일러에 따라 허용하는 바이트가 다릅니다.

바이트수가 커진다는 것은 표현할 수 있는 수의 범위가 커진다는 것으로 정수형인 경우 큰 수를 표현할 수 있다는 의미이고, 부동소수의 경우 소수점 이하 정밀도가 높아진다는 의미이다. 32비트 컴퓨터 아키텍처에서는 int는 4바이트로 표현되어 2의 보수로 나타낼 경우 -2의 31승부터 2의 31승 빼기 1의 범위의 정수를 나타낼 수 있다. 대략 플러스마이너스 21억이 넘는 숫자다. 그러나 이를 초과해야 할때는 8바이트 long long을 쓰면 대략 플러스마이너스 922경 단위까지 수용할 수 있다.

자료형의 크기가 어느 정도인지 알아보려면 printf() 함수에 sizeof() 연산자를 대입해서 쓰면 된다.

참고로 sizeof는 함수가 아니라 연산자로 변수 자체나 자료형의 크기를 알아야 할때 쓴다. sizeof 의 괄호안에 C가 지원하는 자료형을 기재하면 자료형의 크기를 출력한다. 자료형의 크기는 1부터 16바이트의 정수이므로 printf 문에서 %d 자리에 오게 하면 된다. INT_MIN이나 DBL_MAX와 같은 상수는 limits.h에 정의된대로다.

한편 숫자를 담는 변수 선언시 별다른 한정자가 없으면 signed로 선언된다. 이는 한 변수에 음수와 양수를 모두 담을 수 있게 하겠다는 선언이다.

unsigned가 붙여진 숫자용 변수는 양수만 표현하는데, 최상위 비트도 숫자 표현이 쓰게 되므로 최대 표현 가능한 수가 거의 두배로 늘어난다. 4바이트 signed int는 -2의 31승부터 2의 31승 빼기 1까지의 정수를 담을 수 있지만, unsigned int로는 0부터 2의 32승 빼기 1까지의 정수를 담을 수 있다.

변수에 담을 수에 접미사를 붙이기도 한다.

때로는 한 자료형의 값을 다른 자료형의 변수에 대입할때가 있다. 이 경우 자료형이 서로 호환된다면 무사히 마쳐지지만, 자료형이 다르거나, 표현가능한 바이트를 넘어가면 앞부분 비트가 날아가서 원하는 값이 대입이 안될 수도 있다. 아래 예를 보자.

이 경우 length는 정수형인데 대입은 double이 되었다. 그러면 소수점 이하 표현이 잘려나가 3이 된다.

명시적으로 변환을 하기도 한다.

이 경우에도 잘려나가지 않게 생각을 잘 하면 좋다.

영문자가 담기는 char 는 1바이트 크기로, 문자 하나가 들어간다. ASCII 문자표에 정의된대로 0부터 127까지의 숫자로 대입해도 되고 작은따옴표로 둘러싸인 대문자나 소문자를 대입해도 된다. 알파뱃 A는 10진수 65, a는 97로 표시된다. 유의할 것은 큰따옴표로 지정하면 C 언어에서는 문자열로 인식해서 오류가 난다. 그리고 10진수로 표현할 경우 ‘a’ – ‘A’ 처럼의 연산이 된다. 이는 97 – 65 = 32 이므로 문자를 처리할 필요가 있을때, 문자끼리의 변환에 응용하면 좋다. ASCII 문자표를 확인해서 판단하면 된다.

그리고 char 자료형을 배열이나 포인터로 두면 문자열도 표현이 된다.

이렇게 선언하면 마지막 비트에 \0 (백슬래시 제로)가 붙어 문자열의 끝임을 알려주는 식으로 메모리가 할당된다.

변수를 지정할때는 C에서 쓰이는 예약어를 피해야 한다.

그리고 변수명 작명 또한 일정한 규약을 따르면 좋은데, C 언어에서는 sum_of_salary나 salary_sum을 쓰는게 추천되고, C++에서는 SumSalary, SumOfSalary, sumOfSalary 등으로 쓴다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다