변수 선언
대부분의 프로그래밍 언어에서 변수를 사용하기 위해서는 반드시 선언(Declaroation)을 먼저 해야 한다. 이러한 원칙을 사용 전 선언이라 한다. 선언된 변수가 유효한, 사용될 수 있는 프로그램 내의 범위 / 영역을 변수의 영역, 유효범위라고 한다. 정적 유효범위 규칙은 선언된 블록 안에서만 변수가 유효한 규칙이며, 이 규칙이 대부분의 프로그래밍 언어에서 사용된다. 이제 언어 S에서 지역 변수 선언을 위한 블록으로 사용되는 let 문을 살펴보자.
<stmt> -> ... | id = <expr>; | let <decls> in <stmts> end;
<decls> -> { <type> id [ =<expr> ]; }
<stmts> -> { <stmts> }
<type> -> int | bool | string
이 let 구문의 의미는 다음과 같다.
1. 변수 id는 <type> 타입의 변수이며, 초기화 가능하다.
2. 초기화하지 않은 변수는 자동으로 디폴트 값으로 초기화된다.
3. 변수 id의 유효 범위는 선언된 블록 내이다.
여기서, C / C++, Java 언어처럼 이렇게 한 번 선언된 변수의 타입이 변하지 않는 언어를 정적 타입 언어(statically typed language)라 한다.
간단한 예시도 하나 살펴보자.
언어 S
let int x; in
x = 1;
x = x + 1;
end;
C
{
int x;
x = 0;
x = x + 1;
}
위 예제에서 선언된 변수 x의 범위는 일반적으로 선언된 let 블록 내부이다. 우리가 Java 언어를 사용할 때 한 메소드에서 사용하는 지역 변수를 다른 메소드에서 가져와 사용할 수 없는 것으로 유효범위를 이해할 수 있을 것이다. 추가로, 언어마다 선언된 변수의 유효범위를 정하는 규칙인 유효범위 규칙은 조금씩 다를 수 있다.
블록의 중첩
위에서 let 구문의 구조를 보았을 때, let 블록 내에는 여러 문장들이 위치할 수 있다. 따라서 아래와 같이 let 블록 내에서 let 블록이 중첩되는 것도 가능하다.
언어 S
let int x = 1; in - 1
let int y; in
y = x + 2;
end;
let int x; in - 2
x = x + 1;
end;
x = x * 2; - 3
end;
조금 복잡해 보이지만, 위 예시를 한 번 살펴보자. 선언된 블록 안에서만 변수가 유효한 정적 유효범위 규칙을 잘 기억하며 위 예시를 한 번 뜯어보자. 2번째 줄의 y = x + 2에서는 외부 블록에서 선언된 1번 x 변수가 유효하다. 6번의 x = x + 1은 해당 블록 내부에서 선언된 2번 x 변수가 유효하게 사용될 것이며, 마지막으로 3번 x 변수 x = x * 2에서는 내부에서 선언된 2번 x 변수가 유효하지 않으므로, 외부 x 변수인 1번 x 변수가 유효하게 사용된다.
전역 변수 선언
앞선 예시들에서는 let 구문 내에서 선언되는 지역 변수의 범위에 대해 알아보았다. 이제 let 문 바깥에서 선언된 변수인 전역 변수에 대해 알아보자.
>> int x = 1;
>> let int x = 2; in
print x;
end;
2
>> print x;
1
위 예시에서는 let 문 바깥에 선언된 변수 x는 전역 변수, let 문 내에 선언된 x는 지역 변수이다. 따라서 let 문 내에서는 지역 변수 x가 유효하여 지역 변수 x의 값 2가 출력되고, let 문이 끝나고 print 문장을 실행하면 전역 변수 x의 값 1이 출력된다.
타입 없는 변수 선언
위 예시들은 모두 정적 타입 언어에 대한 예시였다. 하지만 Lisp / Scheme, JavaScript, Python 등 언어는 변수의 타입을 선언하지 않고 바로 사용할 수 있으며, 어떤 타입의 값이든지 저장 가능하다. 이러한 언어를 동적 타입 언어(Dynamically typed language)라 한다.
Python
>>> score = 80
>>> print(score)
80
>>> score = "80%"
>>> print(score)
80%
위 Python 예시와 같이 동적 타입 언어는 변수의 타입인 자료형을 따로 설정하지 않아도 다양한 타입의 값을 변수에 넣을 수 있다.
'CS > 프로그래밍 언어론' 카테고리의 다른 글
[프로그래밍 언어론] 변수의 상태와 의미 (1) | 2025.07.01 |
---|---|
[프로그래밍 언어론] 블록 구조 언어 (0) | 2025.07.01 |
[프로그래밍 언어론] 어휘 분석기 (1) | 2025.06.29 |
[프로그래밍 언어론] Parser와 추상 구문 트리 (0) | 2025.06.26 |
[프로그래밍 언어론] 구문법 - 파스 트리와 모호성 (1) | 2025.06.25 |