변수 (컴퓨터 과학)

컴퓨터 프로그래밍에서 **변수**(變數, variable) 또는 **스칼라**(scalar)는 아직 알려지지 않거나 어느 정도까지만 알려져 있는 양이나 정보에 대한 상징적인 이름이다. 컴퓨터 소스 코드에서의 변수 이름은 일반적으로 데이터 저장 위치와 그 안의 내용물과 관련되어 있으며 이러한 것들은 프로그램 실행 도중에 변경될 수 있다. 프로그래밍에서의 변수는 하나의 값을 저장할 수 있는 **메모리 공간**이자 값을 나타내는 문자나 문자들의 집합이며 실행 중인 컴퓨터 프로그램에서, **임의의 값을 저장한 메모리 주소**에 대응한다. 수학에서 말하는 변수의 개념과 완전히 일치하지 않을 수도 있다. 컴퓨터 변수의 값은 수학에서처럼 등식이나 공식의 필수적인 부분이 아니다. 컴퓨터 환경에서 변수는 반복적인 과정 안에서 이용할 수도 있다. 이를테면 한 장소의 값을 할당한 뒤 어느 곳에서 사용한 다음 새로운 값으로 다시 할당하고 같은 방법으로 다시 사용할 수도 있다. 컴퓨터 프로그래밍에서의 변수는 긴 이름이 자주 나오며, 어떻게 이용할 것인지에 대한 설명을 나타내는 반면 수학에서의 변수는 짧은 시간 동안 쓰이는 간결한, 한 두 개 문자 이름이다. 컴파일러는 변수의 상징적인 이름을 데이터의 실제 위치로 치환해야 한다. 변수 값, 형, 위치는 일반적으로 고정된 채 유지되는 반면 위치에 저장되어 있는 데이터는 프로그램 실행 도중 변경될 수 있다.
# 범위
변수의 범위는 프로그램 텍스트에서 변수가 사용될 수 있는 위치를 설명하는 반면, 변수의 범위(수명이라고도 함)는 프로그램 실행에서 변수가 (의미 있는) 값을 갖는 시기를 설명한다. 변수의 범위는 그 범위에 영향을 미친다. 변수의 범위는 실제로 변수 이름의 속성이고 범위는 변수 저장 위치의 속성이다. 이를 프로그램의 속성이며 프로그램 텍스트 또는 실행 지점에 따라 달라지는 컨텍스트와 구별된다. 또한 개체 수명은 변수 수명과 일치할 수 있지만 많은 경우에는 이에 묶이지 않는다. 범위는 변수 이름 확인의 중요한 부분이다. 대부분의 언어는 각 변수(및 기타 명명된 엔터티)에 대한 특정 범위를 정의하며, 이는 특정 프로그램 내에서 다를 수 있다. 변수의 범위는 변수 이름에 의미가 있고 변수가 "표시"된다고 하는 프로그램 텍스트의 부분이다. 해당 범위에 들어가면 일반적으로 변수의 수명이 시작되고(컨텍스트에 들어오면) 일반적으로 해당 범위에서 나가면 수명이 끝난다(컨텍스트를 벗어나면). 예를 들어, "어휘 범위"가 있는 변수는 특정 함수/서브루틴 내에서만 의미가 있거나 보다 정밀하게는 표현식/문 블록 내에서(함수 범위 또는 블록 범위에 따라) 의미가 있다. 이는 구문 분석 시 또는 컴파일 시 수행 가능한 정적 해결이다. 또는 동적 범위가 있는 변수는 특정 제어 흐름에 따라 달라지는 전역 바인딩 스택을 기반으로 런타임에 확인된다. 특정 함수 내에서만 액세스할 수 있는 변수를 "지역 변수"라고 한다. "전역 변수" 또는 범위가 무한한 변수는 프로그램의 어느 곳에서나 참조될 수 있다. 반면에 범위는 변수의 런타임(동적) 측면이다. 값에 대한 변수의 각 바인딩은 런타임에 자체 범위를 가질 수 있다. 바인딩의 범위는 변수가 동일한 값이나 메모리 위치를 계속 참조하는 동안 프로그램 실행 시간의 일부이다. 실행 중인 프로그램은 종료의 경우처럼 주어진 범위에 여러 번 들어가고 나갈 수 있다. 프로그래밍 언어에 가비지 수집 기능이 없으면 범위가 영구적으로 범위를 벗어나는 변수로 인해 메모리 누수가 발생할 수 있다. 이로 인해 변수에 할당된 메모리는 할당 해제 목적으로 참조하는 데 사용되는 변수가 더 이상 해제되지 않기 때문에 해제될 수 없다. 그러나 리스프 클로저 및 C 정적 지역 변수에서 발생하는 것처럼 변수 바인딩이 범위를 넘어 확장되는 것이 허용될 수 있다. 실행이 변수의 범위로 다시 전달되면 변수가 다시 사용될 수 있다. 범위가 시작되기 전에 범위가 시작되는 변수는 초기화되지 않은 것으로 간주되며 아직 특정 값이 명시적으로 제공되지 않았기 때문에 액세스할 경우 정의되지 않은 임의 값을 갖는 경우가 많다. 범위가 끝나기 전에 범위가 끝나는 변수는 매달린 포인터가 될 수 있으며 해당 값이 삭제되었기 때문에 다시 한 번 초기화되지 않은 것으로 간주된다. 이전 두 가지 경우에 설명된 변수는 범위를 벗어났거나 바인딩되지 않았다고 할 수 있다. 많은 언어에서는 범위를 벗어난 변수 값을 사용하려고 시도하는 것이 오류이다. 다른 언어에서는 그렇게 하면 예상치 못한 결과가 나올 수 있다. 그러나 이러한 변수에는 새 값이 할당되어 새 범위가 지정될 수 있다. 공간 효율성을 위해 변수에 필요한 메모리 공간은 해당 변수를 처음 사용할 때만 할당하고 더 이상 필요하지 않을 때 해제할 수 있다. 변수는 범위 내에 있을 때만 필요하므로 범위에 들어갈 때 각 변수의 수명을 시작하면 사용되지 않는 변수에 공간이 생길 수 있다. 이러한 공간 낭비를 피하기 위해 컴파일러는 변수가 선언되었지만 사용되지 않은 경우 프로그래머에게 경고하는 경우가 많다. 프로그램의 여러 부분이 서로의 변수를 수정하여 실수로 서로 상호 작용하지 않도록 변수의 범위를 가능한 한 좁게 만드는 것이 좋은 프로그래밍 방식으로 간주된다. 그렇게 하면 먼 거리에서의 행동도 방지할 수 있다. 이를 위한 일반적인 기술은 프로그램의 여러 섹션에서 서로 다른 네임스페이스를 사용하도록 하거나 동적 변수 범위 지정 또는 어휘 변수 범위 지정을 통해 개별 변수를 "비공개"로 만드는 것이다. 많은 프로그래밍 언어에서는 유효하지 않거나 초기화되지 않은 변수를 나타내기 위해 예약된 값(종종 null 또는 nil로 명명됨)을 사용한다.
# 타이핑
자료형 체계 C, C++, 자바 또는 C#과 같은 정적으로 유형이 지정된 언어에서는 변수에도 유형이 있다. 즉, 특정 종류의 값만 변수에 저장할 수 있다. 예를 들어 "정수" 유형의 변수는 텍스트 값을 저장할 수 없다. 파이썬과 같은 동적으로 유형이 지정되는 언어에서 변수의 유형은 해당 값으로 유추되며 해당 값에 따라 변경될 수 있다. 커먼 리스프에서는 두 가지 상황이 동시에 존재한다. 변수에는 컴파일 타임에 존재하는 유형이 지정된다(선언되지 않은 경우 범용 상위 유형인 T로 간주된다). 값에는 런타임에 확인하고 쿼리할 수 있는 유형도 있다. 변수를 입력하면 컴파일 타임에 다형성을 해결할 수도 있다. 그러나 이는 변수에 허용된 상위 유형이 아닌 값 유형을 기반으로 호출을 해결하는 객체 지향 함수 호출(C++에서는 가상 함수라고 함)에 사용되는 다형성과는 다르다. 변수는 정수 및 리터럴 문자열과 같은 간단한 데이터를 저장하는 경우가 많지만 일부 프로그래밍 언어에서는 변수가 다른 데이터 유형의 값도 저장할 수 있도록 허용한다. 이러한 언어는 함수를 매개변수적 다형성으로 만들 수도 있다. 이러한 함수는 변수처럼 작동하여 여러 유형의 데이터를 나타낸다. 예를 들어, length라는 함수는 목록의 길이를 결정할 수 있다. 이러한 길이 함수는 유형 시그니처에 유형 변수를 포함함으로써 매개변수 다형성이 될 수 있다. 목록의 요소 수는 요소 유형과 무관하기 때문이다.
# 명명 규칙
명명 규칙 수학적 대응과 달리 프로그래밍 변수 및 상수는 일반적으로 여러 문자 이름을 사용한다.(예: COST 또는 total) 단일 문자 이름은 보조 변수에만 가장 일반적으로 사용된다. 예를 들어, 배열 인덱스 변수의 경우 i, j, k이다. 일부 명명 규칙은 유효한 식별자 형식과 관련된 언어 구문의 일부로 언어 수준에서 시행된다. 거의 모든 언어에서 변수 이름은 숫자(0-9)로 시작할 수 없으며 공백 문자를 포함할 수 없다. 변수 이름에 문장 부호가 허용되는지 여부는 언어마다 다르다. 많은 언어에서는 변수 이름에 밑줄("_")만 허용하고 다른 모든 구두점은 금지한다. 일부 프로그래밍 언어에서는 변수의 데이터 유형이나 범위를 나타내기 위해 변수 식별자에 기호(기호 또는 구두점)가 부착된다. 변수 이름의 대소문자 구분은 언어마다 다르며 일부 언어에서는 특정 항목의 이름을 지정할 때 특정 대소문자를 사용해야 한다. 대부분의 최신 언어는 대소문자를 구분한다. 일부 오래된 언어는 그렇지 않는다. 일부 언어에서는 내부 사용을 위해 특정 형식의 변수 이름을 예약한다. 많은 언어에서 두 개의 밑줄("__")로 시작하는 이름이 이 범주에 속하는 경우가 많다. 그러나 언어에 의해 부과된 기본 제한을 넘어서 변수 이름 지정은 주로 스타일의 문제이다. 기계 코드 수준에서는 변수 이름이 사용되지 않으므로 선택한 정확한 이름은 컴퓨터에 중요하지 않는다. 따라서 변수 이름은 변수를 식별하며 나머지는 프로그래머가 프로그램을 더 쉽게 작성하고 이해하도록 만드는 도구일 뿐이다. 잘못 선택한 변수 이름을 사용하면 설명이 없는 이름보다 코드를 검토하기가 더 어려워질 수 있으므로 명확한 이름을 사용하는 것이 권장되는 경우가 많다. 프로그래머는 변수 명명에 대한 지침을 제공하거나 정확한 명명 체계를 적용하는 코드 스타일 지침을 만들고 준수하는 경우가 많다. 이름이 짧을수록 입력이 더 빠르지만 설명력이 떨어진다. 이름이 길수록 프로그램을 더 쉽게 읽을 수 있고 변수의 목적을 더 쉽게 이해할 수 있다. 그러나 변수 이름이 지나치게 장황하면 코드 이해가 어려워질 수도 있다.