[C언어] 변수

라임이·2022년 7월 22일
1

C언어

목록 보기
6/11

해당 C언어 시리즈는 처음 코딩을 접하는 사람들이 쉽게 이해할 수 있도록 작성되었습니다.

변수

변수. 다들 수학 시간에 한 번쯤은 들어봤을 겁니다.
컴퓨터에서의 변수 개념은 수학에서 배운 변수와 다르지만 어떠한 값을 가진다는 점에서 가진다는 비슷한 부분도 존재합니다.

우리는 앞으로 변수를 데이터를 저장하는 공간이라는 의미로 사용할 겁니다. 여기서 데이터라 함은 문자, 숫자, 특수기호 등이 포함되겠지요.

이전 시간에 자료형에 대해 배웠습니다.
자료형은 정수형 자료형과 실수형 자료형으로 나뉘는데 이는 변수와 함께 사용합니다.

정수형 자료형을 갖는 변수를 정수 타입 변수,
실수형 자료형을 갖는 변수를 실수 타입 변수라고 부릅니다.

당연하겠지만 정수 타입 변수는 정수, 실수 타입 변수는 실수만 저장 가능합니다.


자료형과 변수의 이해

자료형과 변수

코딩을 처음 배우는 입장에서 자료형과 변수의 개념 이해는 다소 어려울 수 있습니다.

위 그림에는 물건을 담을 수 있는 서로 다른 종류(2칸, 4칸, 1칸)의 상자가 있습니다.
여기서 봐야 할 단어는 종류와 물건을 담을 수 있는 상자입니다.

2칸, 4칸, 1칸과 같이 데이터(물건)를 담을 수 있는 상자의 종류자료형을 의미합니다.
각각의 데이터(물건)를 담을 수 있는 상자변수를 의미합니다.

컴퓨터의 관점에서 봤을 때 물건은 데이터를 의미합니다.
우리는 이제부터 어떠한 데이터를 담을 거냐에 따라 상자의 종류를 적절하게 선택하고 그 안에 데이터를 담는 행위를 할 겁니다.


변수 이름 규칙

수학에서는 x, y, z 등을 변수 이름으로 사용합니다. 컴퓨터에서도 마찬가지로 x, y, z 등의 이름을 변수 이름으로 사용할 수 있습니다. 하지만 이는 문제가 있습니다. 위와 같이 이름을 지었을 때 본인은 알아볼 수 있을지 몰라도 타인이 봤을 때는 어떠한 의미로 사용되었는지 이해할 수 없기 때문입니다.

처음에는 코드를 혼자 작성하고 볼지 몰라도 나중에는 협업을 하면서 타인과 코드를 공유하는 일이 빈번하기에 이름을 잘 짓는 건 매우 중요한 일입니다. 실제로 변수 이름을 얼마나 잘 짓냐로 코딩 실력을 평가하기도 합니다. 변수 이름은 변수가 갖는 역할을 명시할 수 있도록 짓는 게 포인트입니다.

대신 아래의 규칙을 준수하여 지어야만 합니다.

  • 영문자 a ~ z, A ~ Z / 숫자 0 ~ 9, _(밑줄)을 조합하여 이름을 구성합니다.
  • 모두 숫자이거나 숫자로 시작하면 안 됩니다.
  • 공백(스페이스, 탭, 엔터)을 허용하지 않습니다.
  • 대문자와 소문자를 구분합니다.
    ex) lime과 Lime을 서로 다른 변수로 취급합니다.
  • 예약어를 사용할 수 없습니다.
    예약어는 문법적으로 이미 정의되어 있는 이름을 말합니다.
  • 변수 이름 최대 길이는 컴파일러마다 상이하지만 일반적으로 최대 255자까지 허용됩니다.

사용할 수 없는 변수 이름

$name: $는 사용할 수 없습니다.
012: 모두 숫자로 구성할 수 없습니다.
012c: 숫자로 시작할 수 없습니다.
my name: 공백을 허용하지 않습니다.
int: 자료형은 예약어에 포함되므로 사용할 수 없습니다.


표기법

변수의 이름을 지을 때 공백이 허용되지 않다 보니 사람들이 길어지는 이름을 어떻게 표현해야 효율적일지에 대해 많은 고민을 하게 됩니다. 그 결과 카멜 표기법헝가리안 표기법이 탄생하게 됩니다.

카멜 표기법

카멜 표기법은 연결되는 단어의 시작 문자를 대문자로 표기하는데, 대문자가 툭 튀어나온 모양이 마치 낙타의 혹처럼 보인다 하여 지어진 이름입니다.

다음은 카멜 표기법 작성법입니다.

my name이라는 문장이 있다고 가정합니다.
my와 name 사이의 공백을 지워줍니다. (myname)
공백 바로 뒤에 위치했던 영문자 n을 대문자로 변경합니다. (myName)

공백을 지우고 공백 뒤의 문자를 대문자로 변경하면 끝입니다.

헝가리안 표기법

과거의 코드 편집기는 성능이 좋지 않아 변수의 자료형을 확인하기가 어려웠습니다. 이를 해결하기 위해 개발자들은 변수의 이름 앞에 자료형 또는 변수의 특성을 알 수 있는 접두어를 붙여서 사용했습니다. 이렇게 탄생한 표기법이 헝가리안 표기법입니다.

다음은 헝가리안 표기법 작성법입니다.

my name이라는 문장이 있다고 가정합니다.
my와 name 사이의 공백을 _(밑줄)로 변경합니다. (my_name)

공백 대신 _(밑줄)로 변경하면 끝입니다.

Java, Python 등의 언어는 카멜 표기법을 사용하고,
C, C++, C#과 같은 C 계열 언어는 헝가리안 표기법을 사용합니다.

우리는 현재 C언어를 학습 중이므로 헝가리안 표기법을 사용할 겁니다.


변수 선언하기

프로그램 내에서 데이터를 저장하기 위해 메모리 공간을 할당받는 과정변수를 선언한다고 표현합니다.

변수는 아래와 같이 자료형과 변수 이름을 나란히 작성하여 선언합니다.

int number; // signed int number;와 동일

위 코드는 부호를 고려하는 4 바이트 크기의 메모리를 사용하는 변수 number를 선언한다는 뜻입니다.

여기서 주의할 점은 코드를 작성할 때 명령어의 끝에는 항상 ;(세미콜론)을 붙여야 한다는 겁니다. 컴파일러의 입장에서는 어디가 명령어의 끝인지 알 수 없기 때문에 항상 ;을 붙여 명령어가 끝났음을 알려야 합니다.


변수 초기화하기

운영체제(Windows, Mac OS, Linux 등)는 프로그램이 실행될 때 사용할 수 있는 메모리 공간을 할당해 줍니다. 프로그램이 할당받은 메모리 공간은 현재 프로그램 외에도 다른 프로그램에서 사용한 적 있는 공간일 수 있습니다.

그렇기에 해당 공간에는 우리가 알 수 없는, 의도하지 않은 값이 들어있게 되죠. 이때 메모리에 들어있는 값을 쓰레기 값이라 합니다.

그리고 쓰레기 값 대신 자신이 사용하고 싶은 값을 메모리 공간에 저장하는 걸 초기화라고 합니다.

int number = 0;

위 코드는 부호를 고려하는 4 바이트 크기의 메모리를 사용하는 변수 number를 선언하고 해당 공간에 정수 0을 넣어 초기화를 하겠다는 뜻입니다.


변수의 필요성

메모리는 1 바이트 단위로 끊어 16진수로 표현된 주소를 부여받습니다. 사용자가 원하는 위치에 접근하려면 16진수로 표현된 주소를 기억해야 합니다. 이러한 방식은 사용하는 데에 있어 큰 불편함이 있고 여러 관점에서 위험합니다. 따라서 메모리 주소에 이름을 붙여 사용합니다. 변수 이름은 컴파일 과정에서 메모리 주소로 변환됩니다.


변수 크기의 중요성

일반적으로 정수를 저장할 때는 int, 실수를 저장할 때는 double 자료형을 사용합니다. 이는 오류(실수)를 줄이는 방향일 수도 있지만, 불필요한 메모리 낭비일 수도 있습니다.

자료형과 변수

일상 속의 예를 들어 설명하겠습니다.
[ 속옷, 양말 ], [ 신발, 가방 ], [ 코트 등의 외투 ]가 있고 위의 상자에 넣어 정리해야 한다고 합니다. 가장 부피가 적은 [ 속옷, 양말 ]을 2칸 또는 4칸 크기의 상자에 정리하는 건 공간의 낭비입니다. 또한 다소 부피가 큰 외투는 1칸 크기의 상자에 들어가지 않고 넘칩니다. 우리는 물품의 부피를 고려하여 적절한 크기의 상자에 정리할 필요가 있습니다.

위의 상황을 고려하면 왼쪽의 상자부터 [ 신발, 가방 ], [ 코트 등의 외투 ], [ 속옷, 양말 ]이 위치하게 됩니다. 이렇게 공간을 적절히 활용함으로써 공간의 낭비를 막을 수 있고 한정된 공간을 효율적으로 사용할 수 있습니다.


변수 크기의 중요성 2

사실 메모리의 크기는 바이트 단위로 생각하면 매우 큽니다.
회원의 정보를 관리하는 프로그램을 작성했다고 가정합시다.

최소한의 공간만 할당하면 회원의 정보를 인당 20바이트로 관리할 수 있다고 합니다. 그런데 코드를 보니 자료형을 모두 크기가 큰 자료형을 사용해서 인당 40바이트의 크기를 차지하게 되었습니다. 크기가 2배로 늘어난 셈이죠.

회원의 수가 적다면 큰 문제가 되지 않을 수 있습니다.
하지만 회원이 10만 명, 100만 명 계속 커지게 된다면 저장 공간의 낭비가 더더욱 커지게 되고 이런 낭비가 쌓여 메모리 공간 증설을 위해 불필요한 비용을 지불하게 될 겁니다.

따라서 메모리 크기를 적절하게 할당받아 사용하는 건 매우 중요한 일입니다.

profile
백엔드 개발이 즐거운 4학년 컴공생

0개의 댓글