2.1 변수(Variable)와 식별자(Name)

6765 단어 PLPL

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을 통해 이뤄지는데, 추후 자세히 설명한다.

  변수는 대표적으로 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 측면에서는 좋지 않은 기능이라 보는 의견이 많다.

  • Special Words 허용 가능 여부
    • Special Word란, 해당 언어에서 특별한 의미를 담는 단어를 의미함. 명령절(Statement Clause)을 분리하거나, 범위를 정할때 이러한 Special Word를 사용한다. Keyword가 여기에 해당한다.

      • Keyword : 특정 Context에서만 사용할 수 있는 단어를 의미한다.

    • Reserved Word : Keyword 포함해 각 종 Special Word를 name으로 사용할 수 없게 "예약했다."라는 속성을 의미한다.

      • Readability를 위해 이러한 기능이 추가된 것이다.

좋은 웹페이지 즐겨찾기