변수(컴퓨터 과학)
Variable (computer science)이 글은 검증을 위해 인용구가 추가로 필요하다. – · · 책 · · (2009년 11월) (이 템플릿 하는 |
컴퓨터 프로그래밍에서 변수는 관련 기호 이름과 쌍을 이룬 추상 저장 위치로서, 값으로 언급되는 일부 알려져 있거나 알려지지 않은 양의 정보를 포함하고 있다. 또는 더 간단한 용어로 변수는 특정 비트 집합이나 데이터 유형(예: 정수, 플로트, 문자열 등)을 위한 컨테이너다.변수는 결국 메모리 주소와 연관되거나 식별될 수 있다.변수 이름은 문맥에 따라 변수 자체를 참조하는 것 외에 저장된 값을 참조하는 일반적인 방법이다.이러한 이름과 내용의 분리는 그 이름이 나타내는 정확한 정보와 독립적으로 사용될 수 있게 한다.컴퓨터 소스 코드의 식별자는 실행 시간 동안 값에 바인딩될 수 있으며, 따라서 프로그램 실행 과정에서 변수의 값이 변경될 수 있다.[1][2][3][4]
프로그래밍의 변수는 수학의 변수 개념과 직접 일치하지 않을 수 있다.후자는 추상적이며 저장 위치와 같은 물리적 객체에 대한 참조가 없다.계산 변수의 값이 수학에서와 같이 방정식이나 공식의 일부일 필요는 없다.컴퓨터 프로그래밍의 변수들은 자주 긴 이름을 붙여서 그 용도를 비교적 기술적으로 설명하게 하는 반면 수학의 변수들은 필사과 조작의 간결함을 위해 단어나 1문자 또는 2문자 이름을 갖는 경우가 많다.
변수의 저장 위치는 별칭으로 알려진 상황인 여러 다른 식별자에 의해 참조될 수 있다.식별자 중 하나를 사용하여 변수에 값을 할당하면 다른 식별자를 통해 액세스할 수 있는 값이 변경된다.
컴파일러는 변수의 기호 이름을 데이터의 실제 위치로 교체해야 한다.변수의 이름, 유형 및 위치는 고정된 상태로 유지되는 경우가 많지만, 프로그램 실행 중에 해당 위치에 저장된 데이터가 변경될 수 있다.
변수에 대한 작업
명령어 프로그래밍 언어에서, 값은 일반적으로 언제든지 접근하거나 변경할 수 있다.순수한 기능 및 논리 언어에서 변수는 표현에 구속되며 참조 투명성의 요구 사항으로 인해 전체 수명 동안 단일 값을 유지한다.명령어에서는 (이름) 상수(기호 상수)에 의해 동일한 행동이 나타나는데, 일반적으로 (정상) 변수와 대조된다.
프로그래밍 언어의 유형 시스템에 따라 변수는 지정된 데이터 유형(예: 정수 또는 문자열)만 저장할 수 있다.또는 데이터 유형은 현재 값과만 연관되어 단일 변수가 프로그래밍 언어에서 지원되는 모든 것을 저장할 수 있다.
변수는 값을 저장하기 위한 용기다.
변수 및 범위:
- 자동 변수:함수의 각 국부변수는 함수가 호출될 때만 존재하게 되고, 함수가 빠지면 사라진다.그러한 변수를 자동 변수라고 한다.
- 외부 변수:이러한 변수들은 함수의 외부에 있고 어떤 함수에 의해서도 이름만으로 접근할 수 있는 변수들이다.이러한 변수들은 영구적으로 존재하며, 오히려 기능을 부르고 내보내는 것으로서 나타나고 사라지는 것은, 자신을 설정한 기능이 돌아온 후에도 그 가치를 유지한다.
변수를 참조하는 식별자
변수를 참조하는 식별자를 사용하여 값을 읽거나 값을 변경하거나 액세스 권한, 잠금, 세마포어 등 변수의 다른 속성을 편집할 수 있다.
예를 들어, 변수는 식별자 "에 의해 참조될 수 있다.total_count
" 그리고 변수는 1956이라는 숫자를 포함할 수 있다.동일한 변수가 식별자에 의해 참조되는 경우 "r
" 또한, 그리고 만약 이 식별자를 사용한다면 "r
", 변수의 값은 2009년으로 변경되었다가 식별자를 사용하여 값을 읽는다.total_count
"는 1956년이 아닌 2009년의 결과를 산출할 것이다.
변수가 단일 식별자에 의해서만 참조되는 경우, 그 식별자는 단순히 변수의 이름이라고 불릴 수 있다. 그렇지 않으면 우리는 변수의 이름 중 하나로 말할 수 있다.예를 들어, 이전 예에서 식별자 "total_count
"는 문제의 변수의 이름이며, "r
"는 같은 변수의 다른 이름이다.
범위 및 범위
변수의 범위는 프로그램의 텍스트에서 변수를 사용할 수 있는 위치를 설명하고, 변수의 범위(수명이라고도 함)는 프로그램의 실행에서 변수가 (의미 있는) 값을 가질 때를 설명한다.변수의 범위는 변수의 범위에 영향을 미친다.변수의 범위는 실제로 변수의 이름의 속성이며, 범위는 변수의 저장 위치의 속성이다.이는 프로그램 속성인 컨텍스트(환경이라고도 함)와 혼동해서는 안 되며, 프로그램 텍스트나 실행에서 포인트에 따라 달라진다.범위:개요를 참조하십시오.또한 개체 수명은 가변 수명과 일치할 수 있지만, 많은 경우에 개체 수명은 그것에 얽매이지 않는다.
범위는 변수의 이름 분해능에서 중요한 부분이다.대부분의 언어는 지정된 프로그램 내에서 다를 수 있는 각 변수(다른 명명된 개체뿐만 아니라)에 대한 특정 범위를 정의한다.변수의 범위는 프로그램 텍스트에서 변수의 이름에 의미가 있고 변수의 이름이 "보이는" 부분이 된다.그 범위에 들어가는 것은 일반적으로 변수의 수명을 시작하고(문맥에 도달하는 대로) 그 범위로부터 나가는 것은 일반적으로 변수의 수명을 종료한다(문맥에서 벗어나는 대로).예를 들어, "lexical scope"를 가진 변수는 특정 함수/서브루틴 내에서만 의미가 있고, 또는 표현/상태 블록 내에서 더 정교하게 의미가 있다(기능 범위 또는 블록 스코프에서 누적됨). 이것은 정적 분해능으로, 파스 타임 또는 컴파일 타임에서 수행할 수 있다.또는 특정 제어 흐름에 따라 달라지는 전역 바인딩 스택에 기초하여 런타임에 동적 범위를 가진 변수가 해결된다.특정 함수 내에서만 액세스할 수 있는 변수를 "로컬 변수"라고 한다."글로벌 변수" 또는 범위가 비한정적인 변수는 프로그램의 어느 곳에서나 언급될 수 있다.
반면에 익스텐트는 변수의 런타임(동적) 측면이다.변수의 값 바인딩은 런타임에 고유한 범위를 가질 수 있다.바인딩의 범위는 변수가 동일한 값이나 메모리 위치를 계속 참조하는 프로그램 실행 시간의 부분이다.실행 중인 프로그램은 폐쇄의 경우처럼 일정한 범위를 여러 번 출입할 수 있다.
프로그래밍 언어가 가비지 수집을 특징으로 하지 않는 한, 범위를 영구히 초과하는 변수의 경우 메모리 누수를 초래할 수 있으며, 이 경우 변수에 할당된 메모리는 할당 해제 목적으로 이를 참조하는 데 사용될 변수에 더 이상 액세스할 수 없기 때문에 결코 해제할 수 없다.단, Lisp 폐쇄 및 C 정적 국부변수에서처럼 변수 바인딩이 범위 밖으로 확장되는 것은 허용될 수 있다. 실행이 변수의 범위에 다시 전달되면 변수를 다시 사용할 수 있다.범위가 범위보다 먼저 시작되는 변수는 아직 특정 값을 명시적으로 부여하지 않았기 때문에 접근하면 정의되지 않고 임의적인 값을 갖는 경우가 많다(야생 포인터 참조).범위가 범위보다 먼저 끝나는 범위가 매달린 포인터가 될 수 있고 값이 파괴된 이후 다시 초기화되지 않은 것으로 간주되는 변수.앞의 두 경우에 기술된 변수는 범위를 벗어났거나 구속되지 않았다고 할 수 있다.여러 언어에서 변수의 값이 범위를 벗어났을 때 그 값을 사용하려고 하는 것은 오류다.다른 언어에서, 그렇게 하는 것은 예측할 수 없는 결과를 초래할 수 있다.그러나 그러한 변수에는 새로운 값이 할당될 수 있으며, 이는 새로운 범위를 제공한다.
공간 효율성의 경우 변수에 필요한 메모리 공간은 변수를 처음 사용할 때만 할당하고 더 이상 필요하지 않을 때 비워둘 수 있다.변수는 범위 내에 있을 때만 필요하므로, 범위에 들어갈 때 각 변수의 수명을 시작하는 것은 사용되지 않는 변수에 공간을 줄 수 있다.이러한 공간을 낭비하지 않기 위해 컴파일러는 변수가 선언되었지만 사용되지 않을 경우 프로그래머에게 경고를 보내는 경우가 많다.
프로그램의 서로 다른 부분이 서로의 변수를 수정하여 우연히 상호 작용하지 않도록 변수의 범위를 가능한 한 좁게 만드는 것이 좋은 프로그래밍 관행으로 여겨진다.그렇게 하는 것은 또한 먼 곳의 행동을 예방한다.이를 위한 일반적인 기법은 프로그램의 다른 섹션이 서로 다른 이름 공간을 사용하도록 하거나 동적 변수 범위 지정 또는 어휘 변수 범위를 통해 개별 변수를 "개인적"으로 만드는 것이다.
많은 프로그래밍 언어는 유효하지 않거나 초기화되지 않은 변수를 나타내기 위해 예약된 값(종종 null 또는 nil)을 사용한다.
타자 치기
Go나 ML과 같이 정적으로 입력된 언어에서도 변수에 유형이 있는데, 이는 변수에 특정 종류의 값만 저장할 수 있다는 것을 의미한다.예를 들어, "integer" 유형의 변수는 텍스트 값을 저장할 수 없다.
파이썬과 같은 동적으로 입력된 언어에서 변수의 유형은 그 값으로 유추되며, 그 값에 따라 변할 수 있다.Common Lisp에서는 두 가지 상황이 동시에 존재한다: 변수가 유형으로 주어진다(비공개된 경우, 해당 상황은 다음과 같이 가정한다).T
, 컴파일 시간에 존재하는 범용 수퍼타입)값에는 유형도 있어 런타임에 확인하고 쿼리할 수 있다.
변수를 입력하면 컴파일 시간에 다형성 문제를 해결할 수 있다.그러나 이는 변수가 가질 수 있는 슈퍼타입과는 반대로 값 유형을 기준으로 통화를 해결하는 객체지향 함수 호출(C++에서는 가상 함수라고 한다)에 사용되는 다형성과는 다르다.
변수는 종종 정수나 리터럴 문자열과 같은 단순한 데이터를 저장하지만, 일부 프로그래밍 언어는 변수가 다른 데이터 유형의 값도 저장할 수 있도록 허용한다.그러한 언어는 또한 파라메트릭 다형성 기능을 가능하게 할 수 있다.이러한 함수는 여러 유형의 데이터를 나타내는 변수처럼 작동한다.예를 들어, 이름이 지정된 함수length
목록의 길이를 결정할 수 있다.저런length
함수는 형식 서명에 형식 변수를 포함함으로써 파라메트릭 다형성일 수 있다. 목록의 요소 수는 요소의 형식과 무관하기 때문이다.
매개변수
함수의 형식 매개변수(또는 형식 인수)도 변수라고 한다.예를 들어, 이 파이썬 코드 세그먼트에서는
>>>반항하다 두 개를 더하다(x): ... 돌아오다 x + 2 ... >>>두 개를 더하다(5) 7
명명된 변수x
함수를 호출할 때 값이 주어지기 때문에 매개 변수다.정수 5는 다음과 같은 인수를 의미한다.x
그 가치대부분의 언어에서 함수 매개변수는 로컬 범위를 가진다.이름이 지정된 이 특정 변수x
에 언급할 수 있다.addtwo
함수(물론 다른 함수도 불리는 변수를 가질 수 있다.x
).
메모리 할당
변수 할당과 그 가치의 표현은 프로그래밍 언어와 주어진 언어의 구현에서 매우 다양하다.많은 언어 구현은 로컬 변수에 공간을 할당하며, 범위는 통화 스택의 단일 함수 호출에 대해 지속되며, 함수가 반환될 때 자동으로 메모리가 회수된다.보다 일반적으로 이름 바인딩에서 변수의 이름은 메모리에 있는 바이트의 특정 블록(연속 시퀀스)의 주소에 바인딩되며 변수에 대한 연산은 해당 블록을 조작한다.코드를 컴파일할 때 값이 크거나 알 수 없는 크기를 갖는 변수에 참조하는 것이 더 일반적이다.이러한 변수는 힙이라는 메모리 풀에서 할당되는 값 자체를 저장하는 대신 값의 위치를 참조한다.
바운드 변수에는 값이 있다.그러나 가치는 추상화, 아이디어다. 구현에서 가치는 컴퓨터 메모리 어딘가에 저장되어 있는 어떤 데이터 객체로 표현된다.프로그램 또는 런타임 환경은 각 데이터 객체에 대해 메모리를 따로 두어야 하며 메모리는 유한하므로 객체가 더 이상 어떤 변수의 값을 나타내기 위해 필요하지 않을 때 이 메모리가 재사용을 위해 산출되도록 보장한다.
힙에서 할당된 개체는 회수해야 하며, 특히 개체가 더 이상 필요하지 않을 경우 회수해야 한다.가비지 수집 언어(예: C#, Java, Python, Golang, Lisp)에서 런타임 환경은 확장 변수가 더 이상 객체를 참조할 수 없을 때 객체를 자동으로 회수한다.C와 같은 비배지 수집 언어에서는 프로그램(및 프로그래머)이 메모리를 명시적으로 할당하고 나중에 메모리를 확보하여 메모리를 확보해야 한다.그렇지 않으면 메모리 누수가 발생하며, 프로그램 실행 시 힙이 고갈되어 사용 가능한 메모리가 소진될 위험이 있다.
변수가 동적으로 생성된 데이터 구조를 지칭하는 경우, 변수의 일부 구성요소는 변수를 통해 간접적으로만 접근할 수 있다.이러한 상황에서, 쓰레기 수집기(또는 쓰레기 수집기가 없는 언어의 유사 프로그램 특징)는 변수에서 도달할 수 있는 메모리의 일부만 회수할 필요가 있는 경우를 다루어야 한다.
명명 규칙
수학적 상대와 달리 프로그래밍 변수와 상수는 일반적으로 다중 문자 이름을 사용한다.COST
또는total
. 단문자 이름은 예를 들어, 보조 변수에만 가장 일반적으로 사용된다.i
,j
,k
배열 인덱스 변수의 경우
일부 명명 규칙은 유효한 식별자 형식을 포함하는 언어 구문의 일부로 언어 수준에서 시행된다.거의 모든 언어에서 변수 이름은 숫자(0–9)로 시작할 수 없으며 공백 문자를 포함할 수 없다.문장 부호가 가변 이름에 허용되는지 여부는 언어마다 다르다. 많은 언어는 변수 이름의 밑줄("_")만 허용하고 다른 모든 문장 부호는 금지한다.일부 프로그래밍 언어에서는 가변 식별자에 시그널(기호 또는 구두점)을 부착하여 변수의 데이터 유형이나 스코프를 표시한다.
가변 이름의 대/소문자 구분도 언어마다 다르며, 일부 언어에서는 특정 실체를 명명할 때 특정 사례를 사용해야 한다.[note 1] 대부분의 현대 언어는 대/소문자를 구분하며, 일부 구어는 그렇지 않다.일부 언어는 자체적인 내부 사용을 위해 특정 형태의 변수 이름을 예약한다. 많은 언어에서 두 개의 밑줄로 시작하는 이름(_)은 종종 이 범주에 속한다.
그러나 언어에 의해 부과되는 기본적인 제한을 넘어, 변수의 명칭은 크게 스타일에 관한 문제다.기계코드 레벨에서는 변수 이름을 사용하지 않기 때문에 선택한 정확한 이름은 컴퓨터에 상관없다.따라서 변수의 이름은 변수의 이름을 식별하며, 나머지는 프로그래머들이 프로그램을 쓰고 이해하기 쉽게 만드는 도구일 뿐이다.잘 선택되지 않은 변수 이름을 사용하면 비문자 이름보다 코드를 검토하기가 더 어려워질 수 있기 때문에 명료한 이름이 권장되는 경우가 많다.[5][6]
프로그래머들은 종종 변수 이름 지정에 대한 지침을 제공하거나 정확한 이름 지정 체계를 부과하는 코드 스타일 지침을 만들고 준수한다.짧은 이름은 타이핑하는 것이 더 빠르지만 덜 서술적이다. 이름이 길면 프로그램 읽기가 더 쉬워지고 변수의 목적을 더 쉽게 이해할 수 있다.그러나 변수 이름의 극단적인 장황함은 또한 덜 이해할 수 있는 코드로 이어질 수 있다.
가변 유형(수명 기준)
변수의 분류에 있어서는 변수의 수명을 기준으로 변수의 분류를 할 수 있다.다양한 유형의 변수는 정적, 스택 동적, 명시적 힙 동적 및 암묵적 힙 동적이다.정적 변수는 전역 변수라고도 하며 실행이 시작되기 전에 메모리 셀에 바인딩되며 종료될 때까지 동일한 메모리 셀에 유지된다.대표적인 예가 C와 C++의 정적 변수다.스택 동적 변수는 선언문이 실행될 때 바인딩되는 로컬 변수로 알려져 있으며, 절차가 반환될 때 할당 해제된다.C 하위프로그램과 자바방식의 로컬 변수가 대표적이다.명시적 힙-역동적 변수는 프로그래머가 지정한 명시적 런타임 지침에 의해 할당 및 할당 해제되는 이름 없는(추상적인) 메모리 셀이다.주요 예로는 C++(새로 만들기 및 삭제하기)의 동적 객체와 Java의 모든 객체가 있다.Implicative Hip-Dynamic 변수는 값이 할당될 때만 저장소를 힙으로 만들기 마련이다.할당과 해제는 값이 변수에 재할당될 때 발생한다.그 결과, 암묵적 힙-역동적 변수는 가장 높은 수준의 유연성을 갖는다.주요 예는 자바스크립트, PHP 및 APL의 모든 변수들이다.
참고 항목
메모들
참조
- ^ Compilers: Principles, Techniques, and Tools, pp. 26–28
- ^ Knuth, Donald (1997). The Art of Computer Programming. Vol. 1 (3rd ed.). Reading, Massachusetts: Addison-Wesley. pp. 3–4. ISBN 0-201-89683-4.
- ^ "Programming with variables". Khan Academy. Retrieved 23 March 2020.
- ^ "Scratch for Budding Coders". Harvard. Retrieved 23 March 2020.
- ^ 변수를 선택하지 않는 방법, 2012년 7월 11일 검색 [DEAD LINK]
- ^ Edsger Dijkstra, To hell with "meaningful identifiers"!