[프로그래밍 언어론] 변수의 범위

2025. 6. 30. 16:44·CS/프로그래밍 언어론

변수 선언

 대부분의 프로그래밍 언어에서 변수를 사용하기 위해서는 반드시 선언(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
'CS/프로그래밍 언어론' 카테고리의 다른 글
  • [프로그래밍 언어론] 변수의 상태와 의미
  • [프로그래밍 언어론] 블록 구조 언어
  • [프로그래밍 언어론] 어휘 분석기
  • [프로그래밍 언어론] Parser와 추상 구문 트리
hyeon0117
hyeon0117
컴공으로 살아남기
  • hyeon0117
    컴공 생활기
    hyeon0117
  • 전체
    오늘
    어제
    • 분류 전체보기 (61) N
      • Algorithm (2)
      • PS (19)
        • Solve (19)
      • CS (40) N
        • 객체지향설계 & 패턴 (12)
        • COLMAP (2)
        • 머신러닝 (1)
        • 프로그래밍 언어론 (19)
        • 형식언어 (5) N
        • 운영체제 (1)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    PS
    의미론
    최단 경로
    유한 오토마타
    컴파일러
    형식언어
    객체지향설계
    구현
    객체지향
    촘스키 계층
    자료형
    자료구조
    Formal Language
    디자인패턴
    디자인 패턴
    선택 정렬
    CS
    PLT
    형식언어론
    알고리즘
    그리디 알고리즘
    객체지향언어
    BOJ
    함수
    백준
    java
    정규 문법
    프로그래밍 언어론
    정규 언어
    boj 1343
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
hyeon0117
[프로그래밍 언어론] 변수의 범위
상단으로

티스토리툴바