변수란 무엇인가 (Variable)
목차
변수하면 수학의 변수 x 를 떠올리기 마련입니다. 수학의 변수는 방정식에서 등장합니다. 방정식은 어려운 주제이지만 잠깐 컴퓨터공학의 변수와 비교를 해보겠습니다.
예를 들어 x + 5 = 10 라는 1차 방정식이 있습니다. 여기서 x가 변수입니다. 답은 5입니다 어렵지 않습니다. x는 변수이고 정답이 있습니다. 그럼 x + y = 10 은 어떨까요? x에 5를 넣으면 y는 5가 되고 4를 넣으면 y는 6이 됩니다. 실수를 넣을 수도 있습니다. x에 1.1을 넣으면 y는 8.9가 됩니다. y = 10 – x 라는 식으로 만들거나 f(x) = 10 – x 라는 식으로도 만들 수 있고 같은 내용입니다. 요컨데 x의 값에 따라 y의 값이 변하는 식입니다. 이것을 왜 설명하느냐? 컴퓨터 변수의 동작방식과도 같기 때문입니다.
컴퓨터는 단순합니다. 데이터를 가지고 조작하고 처리하는 입니다. 수많은 프로그래밍 코드가 있지만 결국 CPU가 하는 일은 데이터(data)를 처리(processing)하는 일입니다.
변수를 사용하면 데이터를 처리해서 다양한 결과값을 도출해 낼 수 있습니다. 다양한 입력값을 넣을 수 있기 때문입니다. 자판기에 비유를 하면 콜라가 1번 사이다가 2번 환타가 3번입니다. 이 자판기는 choice 라는 변수를 하나 사용해서 소비자에게 버튼으로 입력을 받고 3가지 종류의 음료수를 판매합니다. 만약에 변수 choice가 없다면? 아마도 콜라 하나만 판매할 수 있을 겁니다.
변수(variable)는 우리말로는 변하는 수, 영어로는 variable (변하기 쉬운)이 원래 뜻으로 데이타를 담는 그릇과 같습니다. 구체적으로는 메모리에 저장된 값입니다. 이 값은 프로그램의 실행 중에 언제든지 변경할 수 있습니다. 그래서 변수입니다. C언어의 변수를 예를 들어 보면 아래와 같습니다.
int myVariable = 10; printf("나의 변수값: %d", myVariable);
myVariable 이라는 변수를 선언하고 10으로 그 값을 초기화 한 후 콘솔스크린에 출력합니다.
수학과의 차이점
변수가 변경가능한 수라는 점에서는 수학과 같습니다. 그런데 결정적인 차이가 있습니다. 수학의 x는 말 그대로 미지수입니다. 어떤 수라도 될 수 있습니다. 정수, 실수, 무리수, 복소수 등 제한이 없습니다. 그런데 컴퓨터의 변수 x는 안됩니다. 예를 들어 1.111111….. 이라는 유리수가 있습니다. 이것을 소프트웨어적으로 구현할 수는 있습니다만 메모리에 저장은 안됩니다. 왜냐하면 1.1111…. 이 언제 끝날지 모르기 때문입니다. 1.1 은 메모리에 저장할 수 있습니다. 소수를 저장하는 방식인 부동소수점을 사용하면 됩니다. 하지만 1.11111….. 메모리에 저장하려면 전세계의 모든 메모리를 사용해도 불가능합니다. 즉 컴퓨터는 무한개념의 수는 메모리에 저장할 수 없습니다. 순환소수의 규칙인 알고리즘으로 구현하는 것은 가능합니다. 하지만 그것은 변수의 사용방식이 아닙니다. 메모리에 저장가능 범위가 차이가 있다는 것이 수학의 변수와의 차이점입니다.
메모리는 컴퓨터의 중요한 자원입니다. 메모리를 효율적으로 사용하려면 변수를 적재적소에 사용할 필요가 있습니다. 프로그래머는 1이란 숫자를 저장하기 위해 1바이트를 사용할 수도 1메가를 사용할 수도 있습니다. 수학은 머리속에서 무한대건 무한소건 떠올릴 수 있지만 컴퓨터의 메모리는 무한하지 않습니다. 컴퓨터의 한정된 자원을 관리하는 개념이 변수에 포함되어 있습니다.
물론 컴퓨터 프로그래밍을 처음 배우는 사람들은 답답할 수 있습니다. 거의 모든 프로그래밍 언어 학습은 처음에 변수의 개념과 데이터형(data type)부터 시작하기 때문입니다. 너무 당연하게도 프로그램은 데이터를 처리(Data Processing)하기 위한 것인데 데이터를 어떻게 사용해야 하는가? -> 변수(Variable)를 통해서 입니다. 변수는 데이터 타입에 따라 분류가 되는데 대표적으로 정수형(int type), 부동소수점 형(float type) 또 클래스의 참조 변수(Class reference variable), 포인터 변수(pointer variable) 등이 다 변수입니다. 프로그래밍을 배우는 것은 절반은 이 변수에 대해 배우는 것과 같습니다. 데이터가 절반이고 처리가 또 반이니까.
변수의 데이터 타입
변수는 데이터 타입을 지정해야 합니다. 운영체제 입장에서는 변수가 메모리를 무한정 쓸 수 있도록 놔둘 수는 없습니다. 메모리 사용규칙을 정하고 범위를 한정하는 것이 데이터 타입입니다. 1바이트는 0000 0000 처럼 8개의 비트로 이루어져 있습니다. 데이터 타입에 따라 몇 개의 바이트를 사용하는가 정해집니다. C언어의 구조체나 클래스 처럼 더 복잡하고 많은 바이트를 사용하는 타입도 있습니다. 대부분 언어에서 기본 데이터 타입으로 바이트(Byte), 유니코드 문자형(2Byte Char), 정수형(4Byte) 등이 있습니다.
데이터 타입이 없는 변수는 없습니다. 변수를 선언할 때 메모리의 범위를 한정해야 하기 때문인데요. 컴퓨터에서 사용하는 숫자 중에는 위에서 말한 유리수나 무리수도 있을 수 있습니다. 이럴 때는 알고리즘으로 구현해야 하는데 변수와는 좀 다른 개념입니다. 어쨋거나 컴파일러는 변수를 메모리에 할당(allocate) 해야 하는데 메모리의 단위인 바이트(byte)는 고정되야 합니다.
요약
컴퓨터공학의 변수에 대해서 알아봤습니다. 특정 언어의 변수가 아니라 일반 상식선에서 다룬 내용입니다. 변수에 대해서 알아야 할 것은 다음과 같습니다.
- 변수는 임시값을 저장한다. 즉 변경가능하다.
- 변수가 사용하는 메모리 단위는 바이트(Byte)이다.
1바이트는 256개 표현이 가능하다(0~255, -128~127) - 변수는 메모리의 주소를 부르는 이름이다.
변수의 이름이 있고 실제 메모리의 주소가 있다. - 변수는 데이터 형을 가진다. 이는 메모리를 한정한다.
- 수학의 변수는 유리수와 무리수 등 모든 수를 대입할 수 있다.
컴퓨터의 변수는 데이터 형에 의해 메모리의 제한을 받는다. - 변수는 정수형 등 기본형(원시형)과 참조형 (클래스, 포인터 등)이 있다.
- 변수는 정적 메모리(data)이나 스택 메모리(stack), 동적 메모리(heap)에 저장한다.
- 변경이 불가능한 변수를 상수(constant), 숫자나 문자 그대로 사용하는 값을 리터럴 상수(literal constant)라고 한다.
프로그래밍을 한다는 것은 결국 데이터(data)를 처리(process)하기 위함이고, 데이터를 다루기 위해서 필요한 도구가 변수(variable)입니다. 변수는 프로그램이란 건물을 이루는 콘크리트, 철골 같은 같은 것으로 어떤 언어를 배우더라도 숙지해야 하는 주제입니다.
1바이트는 256개 표현이 가능하다(0~255, -125~126)
-125~126 오타네요
-128~127로 수정요망
오타를 지적해주셔서 감사합니다! -128~127로 수정하였습니다.