2.1 변수(Variable)와 식별자(Name)
Variable
A variable can be characterized by a collection of properties, or attributes, the most important of which is type. The design of the data types of a language requires that a variety of issues be considered : scope, lifetime of variables, type checking, and initialization
프로그래밍 언어를 개발하는 과정에서, Reliability의 향상을 위해 변수의 Scope, Lifetime, Type & Type Checking, Initialization이란 개념 등이 등장하기 시작했다.
int i; // '변수'란, 본디 '속성의 집합'이다.
main() {
int j = 5; // 변수의 Name과 Type, 그리고 Initialization
}
sub() {
int k; // 변수 k는 sub라는 모듈의 시작과 끝에서만 접근 가능 (Lifetime)
j = k; // main의 local variable이므로 불가 (Scope)
i = k; // global variable이므로 가능 (Scope)
}
~> 우리는 본 Chapter2에서 이와 같은 내용들에 다룰 것이다.
변수 : Von-Neumann 컴퓨팅 모델 기반 프로그래밍 언어에서 변수란, '메모리 셀을 달리 부르기 위해 붙인 이름이자 그 공간'이다.
- Imperative Language : Von-Neumann 컴퓨터 아키텍쳐를 기반으로 한 추상화 결과이다.
- Memory : 명령과 데이터를 저장한다.
- CPU : 메모리를 접근하고, 들어있는 데이터를 변형하는 등의 Operation을 수행한다.
- Imperative Language에서 Variable이란?
- Variable : An abstraction of memory cell (메모리 셀의 추상화)
- 속성(Property/Attribute)의 집합이라고 볼 수 있다.
- 이때, '속성'이란, Value, Data Type, Scope, Lifetime, Initialization 등을 의미한다.
- 즉, 변수는, 해당 변수에 대한 Value, Data Type, Scope, Lifetime, Initialization 등의 집합이라는 것이다.
- 이 중 Value와 같은 속성은 언제든지 변할 수 있다.
- 반면, Type과 같은 속성은 한 번 정해지면 바뀌지 않는다. (Static Binding 기준)
여담) Pure한 Declarative Language에는 Variable이란 개념이 없어야한다. Variable 자체가 Imperative한 속성을 내포하기 때문이다. (추후 다룬다)
- 언어를 설계할 때, 언어의 용도에 따라, 실용적 측면에서 어떠한 Data Type이 필요한지를 고려해야한다.
- 예를 들어, 어셈블리어로 행렬 계산을 수행하는 프로그램을 짠다고 해보자. 상당히 복잡할 것이다.
- 예를 들어, C에는 String Data Type이 없다. C는 배열 자료구조를 통해 문자열을 처리한다. 반면, Python에선 String Data Type이 존재한다.
- ex) Python에서는 a라는 변수에 'a = "School"'을 넣었다가, 잠시 뒤 'a = "University"'와 같이 단순 대입으로 값을 바꿀 수 있다. String Data Type이 존재하기 때문이다.
- 이는 Dynamic Storage Binding을 통해 이뤄지는데, 추후 자세히 설명한다.
- ex) Python에서는 a라는 변수에 'a = "School"'을 넣었다가, 잠시 뒤 'a = "University"'와 같이 단순 대입으로 값을 바꿀 수 있다. String Data Type이 존재하기 때문이다.
변수는 대표적으로 6개의 속성으로 표현할 수 있다. name, address, value, type, lifetime, scope가 바로 그것들이다.
name
- 변수의 이름은 일반적으로 '식별자(Identifier)'를 의미한다. 아래에서 더 자세히 설명한다.
address
-
해당 변수가 저장된 메모리 공간을 의미한다.
-
많은 고급 언어에서, 같은 name을 서로 다른 메모리 공간에 부여하는 것이 가능하다. ex) 가장 대표적으로 C언어! Scope 개념에서 이를 좀 더 자세히 다룰 것이다.
-
특정 단일 메모리 셀에 하나 이상의 Variable Name으로 접근할 수 있을 때, 이러한 이름들을 'Alias'라고 부른다.
-
특정 메모리 셀에 대해 a와 b라는 이름 모두로 Referencing할 수 있을 때, 이를 Alias가 발생했다고 한다.
-
Chapter1 포스팅에서 설명했던 Aliasing이 바로 이를 의미한다.
-
대표적으로 C언어의 일반변수 & 포인터변수 관계가 있다. FORTRAN의 EQUIVALENCE 명령과 Pascal의 Variant Record Structure 등이 이에 해당한다.
-
또한, Subprogram(함수)의 Parameter를 통해 Caller의 변수를 그대로 접근할 수 있는 기능이 있는 언어도 있는데, 이도 Aliasing에 해당한다. Call by Reference가 Default Referencing 방법인 언어들!
-
이러한 Aliasing은 Readability, Maintenance 측면에서 결코 좋지 않은 기능이라고도 언급한 바 있다. (Debugging을 어렵게 하기 때문)
-
Type
- 변수의 Type은 변수가 가질 수 있는 Value의 범위와 해당 변수에 수행할 수 있는 Operation들의 종류를 결정한다.
Value
-
Variable이 나타내는 '추상 메모리 셀'이 실제로 가지고 있는 Content를 의미한다.
-
l-Value : Left Value라는 의미로, 변수의 주소를 의미한다.
-
r-Value : Right Value라는 의미로, 변수의 값을 의미한다.
ex) a = a + 1;
~> '=' 좌측의 a는 l-value, 우측의 a는 r-value
Scope
- 추후 설명 예정
Name
Name : 특정한 Entity(예를 들어 변수, 레이블, 서브프로그램, 형식 파라미터 등)를 식별(Identify)하기 위해 사용하는 문자열을 의미한다.
~> name은 Readability가 좋게 짜는 것이 중요하다. 변수/함수/레이블/파라미터 등의 의미를 잘 반영하는가는 프로그래머의 중요 자질 중 하나이다.
- 프로그래밍 언어 설계 시, Name과 관련해 다음과 같은 옵션들이 있다.
- name의 최대 길이
- Underbar/Underscore(_)의 사용 가능 여부
- '대소문자 구분 기능(Case Sensitivity)'
- Special Words, Reserved Words, Keywords 등을 사용할 수 있는지 여부
Name의 형식
- Name의 길이
- 초기 프로그래밍 언어의 경우 단일 문자로만 Name을 정할 수 있었다.
- FORTRAN 1의 경우, 최대 6문자까지 가능했다.
- COBOL : 최대 30문자까지 가능했다.
- Java, Ada와 같은 현대 언어들 : No Limit, 사실상 제한이 없다.
- Case Sensitive
- C/C++나 Modular와 같은 언어는 대소문자 구분 기능이 있다.
- 대소문자 구분 기능이 Readability 측면에서는 좋지 않은 기능이라 보는 의견이 많다.
- C/C++나 Modular와 같은 언어는 대소문자 구분 기능이 있다.
- Special Words 허용 가능 여부
-
Special Word란, 해당 언어에서 특별한 의미를 담는 단어를 의미함. 명령절(Statement Clause)을 분리하거나, 범위를 정할때 이러한 Special Word를 사용한다. Keyword가 여기에 해당한다.
- Keyword : 특정 Context에서만 사용할 수 있는 단어를 의미한다.
-
Reserved Word : Keyword 포함해 각 종 Special Word를 name으로 사용할 수 없게 "예약했다."라는 속성을 의미한다.
- Readability를 위해 이러한 기능이 추가된 것이다.
-
Author And Source
이 문제에 관하여(2.1 변수(Variable)와 식별자(Name)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@junttang/PL-2.1-Variable-Name-Binding저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)