제 4 장 변수 , 영역 , 수명

40
1 프프프프프 프프프 제 4 제 제제 , 제제 , 제제 변변 • 변변변 • 변변 • 변변변변 변변변 변변 • 변변변 변 변변 • 변변 변변변 • 변변변 변변

Upload: keitha

Post on 12-Jan-2016

50 views

Category:

Documents


0 download

DESCRIPTION

제 4 장 변수 , 영역 , 수명. 변수 바인딩 영역 기억장소 할당과 수명 변수와 그 환경 변수 초기화 상수와 변수. 주소 ( 참조 ). 속성들. 이름. 값. 4.1 변수 (Variables). 4.1 변수 (Variables) 정의 이름 , 형 속성 , 주소 ( 참조 ), 값 (value), 영역 , 수명 의 6 요소로 구성. . - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 제  4  장  변수 ,  영역 ,  수명

1

프로그래밍 언어론

제 4 장

변수 , 영역 , 수명• 변수• 바인딩• 영역• 기억장소 할당과 수명• 변수와 그 환경• 변수 초기화• 상수와 변수

Page 2: 제  4  장  변수 ,  영역 ,  수명

2

4.1 변수 (Variables)

4.1 변수 (Variables)

• 정의 이름 , 형 속성 , 주소 ( 참조 ), 값 (value), 영역 , 수명의 6 요소로 구성

이름 속성들 값

주소 ( 참조 )

<D.W.Barron 의 변수 선언 >

•식별자 (identifier) : 제한된 길이의 영문자 / 숫자로 구성된 변수의 한 요소 (component)

Page 3: 제  4  장  변수 ,  영역 ,  수명

3

• 변수의 이름 : 변수를 참조하기 위해 사용하는 일련의 문자들• 주소 : 변수와 관련된 첫 번째 메모리 셀• 영역 : 변수의 이름이 이해되고 참조될 수 있는 프로그램의 부분• 수명 : 실행 시간에 그 이름에 관련된 값을 보유할 기억 장소가 배정되어 있는 시간• 형 : 변수에 할당될 수 있는 가능한 값

변수 (Variables)(2)

Page 4: 제  4  장  변수 ,  영역 ,  수명

4

•예 ) var X: integer;X :=2 의 의미

- ① 이름: X

- ② 속성 : 정수

- ③ 주소 : 값이 저장된 위치

- ④ 값 : 2

x 정수 2

주소이름 속성

변수 (Variables)(3)

Page 5: 제  4  장  변수 ,  영역 ,  수명

별명 (aliasing) Alias : 동일한 기억 장소를 함께 사용하고 있는 다른 이름

변수 하나의 값 변화 -> 동일장소 사용하는 다른 변수의 값 변화

-> 별명의 효과 (aliasing effect)

초기 언어 : 효율적 기억 장소 사용을 위해 별명 허용

예 : Fortran 의 EQUIVALENCE, Pascal 의 가변 레코드 , C 의 uni

on

type intptr = ^integer; var x, y: intptr; begin new(x); x^ := 10; y := x; y^ := 20; writeln(x^); end;

Page 6: 제  4  장  변수 ,  영역 ,  수명

6

바인딩 (binding) 개념

바인딩이란 ? - 이름에 어떤 속성을 관련시키는 일련의 작업 즉 , 프로그램의 기본 단위에 이 단위가 택할 수 있는 여러 속성 중에서 일부를 선정하여 결정하는 작업

바인딩 예

- constant num = 5 ; 이름 num 에는 두개의 속성인 상수와 값 5 가 바인딩

- int x = 100 ; 이름 x 에 변수와 정수라는 두개의 속성이 바인딩

- x = 2 ; 변수 x 에 새로운 속성으로 값 2 가 바인딩

4.2 바인딩 시간

Page 7: 제  4  장  변수 ,  영역 ,  수명

7

바인딩 시간

- 바인딩이 발생되는 시간

- 바인딩 시간의 종류 : 언어정의시간 , 언어 구현시간 , 번역시간 , 실행 시간

(1) 실행 시간 - 프로그램 실행 시간에 발생되는 바인딩 동적 바인딩 (dynamic binding) 예 ) 변수값 배정 , 변수와 자료 구조에 기억 장소 할당 등 ① 서브 프로그램이나 블록 실행 시작 시간에 발생하는 바인딩 예 ) 형식 매개 변수와 실매개 변수간의 바인딩 지역 변수에 대한 기억 장소 할당 ② 프로그램 실행시 사용 시점에서 수시로 발생하는 바인딩 예 ) 지정문으로 값을 변수에 저장하는 바인딩

바인딩 시간의 종류빠른 바인딩 늦은 바인딩

바인딩 시간 (2)

Page 8: 제  4  장  변수 ,  영역 ,  수명

8

(2) 컴파일 시간

- 언어를 번역하는 시점에서 발생되는 바인딩 정적 바인딩 (static binding) ( 번역시간 - 컴파일 시간 , 링크 시간 , 로드 시간 )

예 ) 변수의 형 , 자료 구조의 형과 크기 , 레코드 항목들의 형을 확정

바인딩 시간의 종류 ( 계속 )

(3) 언어의 구현 시간

- 언어 정의시 원소들에 특성을 한정하지 않고 , 언어를 컴퓨터 상에서

구현할 때 특성의 일부를 확정하는 바인딩

- 예 ) 정수의 자리수 , 실수의 유효숫자 개수 , 수의 하드웨어에서의 표현법

바인딩 시간 (3)

Page 9: 제  4  장  변수 ,  영역 ,  수명

9

바인딩 시간의 종류 ( 계속 )

(4) 언어 설계 시간 ( 언어 정의 시간 ) - 언어를 정의할 때 확정되는 바인딩 - 예 ) 언어 구문 정의 ( 반복문 , 허용되는 자료 구조 , 연산 종류 등 ) 혼합형 연산 ( 덧셈 , 곱셈 ) 에서 두 피연산자의 형 결정에 관한 사항

• 지정문 Y := X + 10 에서 발생되는 바인딩과 시간 변수 x : 현재값 ( 실행 시간 ), 자료형 ( 컴파일 시간 ), 자료형의 종류 ( 언어 설계 시간 ) 상수 10 : 표현 방법 ( 언어 구현 시간 ) 과 의미 ( 언어 설계 시간 ), 적재 ( 컴파일 시간 ) 연산자 + : 성질과 의미 ( 언어 설계 시간 ), 덧셈의 종류 ( 실수 or 정수 : 컴파일 시간 ) 지정문 := : 성질과 의미 ( 언어 설계 시간 ) 평가 순서 : 언어 설계 시간 (or 언어 구현 시간 ) 지정문 x := y; 의 바인딩 시간과 수행되는 작업은 ? (p. 108)

바인딩 시간 (4)

Page 10: 제  4  장  변수 ,  영역 ,  수명

10

바인딩 시간의 중요성

• 언어들 간의 중요하고 , 미묘한 차이점은 바인딩 시간의 차이에서 발생

예 ) - 큰 배열에 많은 연산이 포함된 문제는 Fortran 이 적당 실행시간에 적은 부분만이 바인딩 ( 실행시간 효율성 )

- 배열의 크기나 자료형이 실행시 변화되는 자료형의 처리는 Snobol4 가 적당

실행중 자료가 입력되는 순간에 바인딩 발생 ( 자료 처리의 융통성 )

• 정적 ( 빠른 ) 바인딩은 효율성이 증가하고 동적 ( 늦은 ) 바인딩은 융통성이 증가

• 컴파일러 언어 , 명령형 언어 : 정적 바인딩 ( 실행 시간 바인딩을 제외한 모든 바인딩 )

• 인터프리터 언어 , 함수형 언어 : 동적 바인딩

• PL/I 은 프로그래머가 바인딩 시간 선택 가능

바인딩 시간 (5)

Page 11: 제  4  장  변수 ,  영역 ,  수명

11

주요 언어에서 식별자의 바인딩 시간

번역 시간 바인딩( 정적 바인딩: static binding)

컴파일 시간( 프로그램 작성 시간 포함 )

Linkage edit 시간

적재 시간 (load time)

(1) Fortran, Algol, PL/I, Pascal, Cobol 등 컴파일러 언어 : 대부분의 변수형 확정(2) 상수값의 기계 내부 표현이 확정됨

(1) Fortran : COMMON 문에 주어진 이름의 상대 주소 확정(2) Fortran, Algol, PL/I 등: 부프로그램 이름에 관한 상대 주소 확정

(1) Fortran, Cobol : 모든 변수의 기억 장소 할당(2) PL/I : 정적 변수로 선언된 변수의 기억 장소 할당(3) Algol, Pascal : 전역 (global) 변수의 기억 장소 할당(4) Fortran : DATA 문에서 정의된 값을 변수에 배정

실행 시간 바인딩( 동적 바인딩:dynamic binding)

호출 시간( 또는 모듈 시작 시간 )

(1) 실매개 변수를 형식 매개 변수에 연결 ① by value : 실매개 변수값을 지역 변수에 배정 ② by reference : 실매개 변수를 형식매개 변수로 사용할 수 있도록 주소를 배정 ③ by name : 사용할 때 주소와 해당 값을 계산할 수 있는 thunk 루틴의 주소 확정(2) Algol, Pascal : 지역 변수에 대한 기억 장소 할당 ( 활성 레코드가 만들어짐 )(3) PL/I : AUTOMATIC 변수에 대한 기억 장소 할당

(1) PL/I : BASED 변수 기억장소 (ALLOCATE 문 , FREE 문 )(2) APL, Lisp, Snobol4 : 변수들의 자료형 배정 , 기억 장소 할당(3) 모든 프로그래밍 언어: 지정문 등에서 변수값을 배정

실행 시간 사용 시점(reference)

바인딩 시간 (6)

Page 12: 제  4  장  변수 ,  영역 ,  수명

12

선언 (Declarations)

• 선언문 (Declarations)

- 실행시 사용될 자료의 속성을 언어의 번역기에게 알려주는 프로그램 문장

• 자료의 속성– 자료형 , 크기 , 이름 , 생성 시기 , 소멸 시기 , 참조하기 위한 첨자 등

예– Javal 의 선언문

int [ ]x = new int[10]

생성 , 소멸 시기 : 블록 시작과 종료자료형 : 1 차원 배열원소수 : 10첨자 범위 : 0 ~ 9원소 자료형 : 정수배열 이름 : X

생성 , 소멸 시기 : 블록 시작과 종료자료형 : 1 차원 배열원소수 : 10첨자 범위 : 0 ~ 9원소 자료형 : 정수배열 이름 : X

Page 13: 제  4  장  변수 ,  영역 ,  수명

13

선언 (Declarations) (2)

• 선언문의 목적(1) 주기억 장치 사용과 접근 방법의 효율성 ( 변수 , 배열 , 레코드 등의 효율적인 접근 가능 ) (2) 주기억 장치 경영의 효율성 ( 생성과 소멸 시점을 알므로 스택 기반 기억 장소 할당 등을 수행 가능 )(3) 정적 형 검사 (static type checking) 가능

– 형 고정 연산 (type specific operation) : 하드웨어 제공– 혼합형 연산 (mixed operation) : 프로그래밍 언어 제공– 정적 형 검사로 혼합형 연산을 형 고정 연산으로 변환 효율성 추구cf> 혼합형 연산의 동적 형 검사 융통성 추구

• 선언문의 예 float X; int Y; ... X + Y

• 번역기 동작 ( 정적 형 검사 ) 1) 혼합형 연산 발견 2) Y 를 실수형으로 변환 3) 실수형 덧셈코드 생성

• 번역기 동작 ( 정적 형 검사 ) 1) 혼합형 연산 발견 2) Y 를 실수형으로 변환 3) 실수형 덧셈코드 생성

Page 14: 제  4  장  변수 ,  영역 ,  수명

14

선언 (3)

• 정적 형 검사 (static type checking)– 모든 변수의 자료형 선언 요구– 단점 : 자료 생성 , 소멸 , 내용 변경 방법에 많은 제약 존재– 장점 : 실행 시간 효율이 높음– 정적 형 검사 언어 : Java, C, Fortran, Algol, Pascal 등

• 동적 형 검사 (dynamic type checking)– 선언문 사용 안함– 장점 : 프로그래밍 단순화 , 유연성 (flexibility) 높음– 단점 : 프로그램 실행 시간 지연 , 자료 표현상의 효율 저하 , 복잡한 기억 장소 경영 기법 요구– 동적 형 검사 언어 : Lisp, APL, Snobol 4

• Algol, Java - 약간의 효율성을 상실하여 실질적인 큰 융통성 ( 유연성 ) 을 얻는 선언

예 ) 배열 real array x[m1:n1,m2:n2]

• 차원수와 자료형 선언 번역시간 : 효율적인 코드 생성 실행시간 : 첨자 범위 결정

• 차원수와 자료형 선언 번역시간 : 효율적인 코드 생성 실행시간 : 첨자 범위 결정

Page 15: 제  4  장  변수 ,  영역 ,  수명

15

4.3 영역 (scope) 영역 (Scope)

- 변수의 이름이 모두 동일하게 사용되는 프로그램의 부분 - 식별자의 효력을 나타낼 수 있는 영역을 통제하는 방법 즉 , 식별자의 사용이 허락되는 프로그램의 범위

• 식별자– 변수 , 상수 , 레이블 , 자료형 , 서브프로그램 등의 이름

수명 (Extent 또는 Life time) - 프로그램 실행 중에 참조된 변수의 값이 기억장소를 할당 받아 존재하는 시간 - 실행시간에 식별자의 값을 보유할 기억장소가 배정되어 있는 시간 즉 , 식별자의 기억장소 할당부터 해제까지의 기간

Page 16: 제  4  장  변수 ,  영역 ,  수명

16

영역 (2)

식별자 영역 제공의 간결한 방법 - 모든 식별자를 전 프로그램에서 사용가능 ( 전역 변수화 )

모든 프로그램에서 모든 식별자 공유• 문제점

– 식별자 사용의 복잡화 ( 단위 프로그램내의 식별자 요구 )– 식별자 혼돈– 프로그램 결합시 문제점 발생

ALGOL 60• begin-end 사용

– 블록 구조 ( 지역 식별자 선언 가능 ) 1) 블록 입구 - 기억장소 할당 2) 블록 출구 - 기억장소 해제– 블록끼리는 nested 또는 disjoint – 복합문 (compound statement) 과 구별

• ALGOL60

integer x

1) 컴파일 시간

2) 실행시간

• ALGOL60

integer x

1) 컴파일 시간

2) 실행시간

x integer

x integer

Page 17: 제  4  장  변수 ,  영역 ,  수명

17

정적 영역과 동적 영역

정적 영역 규칙 (static scope rule)

- 식별자의 사용 영역을 블록의 정적 내포관계로 결정 ( 컴파일러 언어 )

1) 지역변수 - 현재 블록에서 선언된 변수 , 형식매개변수 2) 비지역 변수 - 현재 블록에서 사용되나 바깥 블록에서 선언된 변수 3) 전역 변수 - 모든 블록에서 사용 가능한 변수참고 1) 자유변수 (free variable)

- 현재 블록에서 선언되지 않고 사용되는 변수 - 해결책 불허 lexical scope dynamic scope

참고 2) 영역 구멍 (hole-in-scope)

- 내포된 블록사이에 동일 지역변수를 선언하면 , 바깥 블록의 지역변수는 내부 블록 구간에서 사용할 수 없는 현상

Page 18: 제  4  장  변수 ,  영역 ,  수명

18

정적 영역과 동적 영역 (2)

동적 영역 규칙 (dynamic scope rule)

- 식별자의 사용 영역을 프로그램의 실행 순서에 의해 결정 ( 인터프리터 언어 )

Page 19: 제  4  장  변수 ,  영역 ,  수명

19

정적 영역과 동적 영역 (3)

1 a : begin integer i, j; real x, y;2 34567

8 · · ·9 10111213 14151617

18 · · ·19 end a;

1 a : begin integer i, j; real x, y;2 34567

8 · · ·9 10111213 14151617

18 · · ·19 end a;

b : procedure test(integer a, b) begin boolean i;

· · · x := i * j + y;

· · · end b;

c : begin integer x, y; real i, j;

· · ·

· · · end c;

d : begin boolean j;

· · · call test(x, y);

· · · end d;

< 각 변수 영역 라인 번호 >

정적 영역 규칙 (Algol)

i j

integer

boolean

real

1, 2, 8, 18~19

3~7

9~17

1~8, 18~19

11~15

9~10, 16~17

x y

integer

real

9~17

1~8, 18~19

9~17

1~8, 18~19

선언된 자료형변수

변수선언된 자료형

Page 20: 제  4  장  변수 ,  영역 ,  수명

20

정적 영역과 동적 영역 (4)

정적 영역 규칙을 따른 변칙 현상 (anomaly):• 영역 구멍 (hole – in –scope) : a 에서 선언된 x 처럼 전역 선언이 지역선언 때문에

보이지 않을 때 • 영역과 선언의 가시성 (visibility) 에 약간의 차이를 갖는다 .

– 가시성 : 프로그램에서 특정 언어 구성자를 참조할 수 있는 부분• C++ 는 영역 해결 연산자 (scope resolution operator) :: 에 의해 접근 가능• Ada 와 Java 는 영역 한정자 (scope qualifier) . 에 의해 접근 가능

– 예 ) Ada 에서

a. x

블록 c 에서 a 의 x 를 볼 수 있다 . : 선택에 의한 가시성

블록 c 에서 a 의 x 를 볼 수 있다 . : 선택에 의한 가시성

Page 21: 제  4  장  변수 ,  영역 ,  수명

21

정적 영역과 동적 영역 (5)

program scope; var a, b : integer;

begin a :=p; q; end scope

program scope; var a, b : integer;

begin a :=p; q; end scope

function p : integer; var a : integer; begin a :=0; b :=1; p :=2 end p;

procedure print; begin write(a); write(b); writeln(p) end print;

procedure q; var b, p : integer; begin a :=3; b :=4; p :=5; print end q;

• 실행과정 1) scope 실행 2) 함수 p 호출 , 실행 a=0 ( 지역변수 ) b=1 (비지역변수 , scope) p=2 ( 함수 이름 ) => scope 의 a 에 2 저장 3) 프로시져 q 호출 , 실행 a=3 (비지역변수 , scope) b=4 ( 지역변수 ) p=5 ( 지역변수 ) 4) 프로시져 print 호출 , 실행 ① 정적 영역 규칙 a : scope, b : scope, p : 함수 p 결과 : 3, 1, 2

② 동적 영역 규칙 a : scope, b : 함수 q, p : 함수 q 결과 : 3, 4, 5

• 실행과정 1) scope 실행 2) 함수 p 호출 , 실행 a=0 ( 지역변수 ) b=1 (비지역변수 , scope) p=2 ( 함수 이름 ) => scope 의 a 에 2 저장 3) 프로시져 q 호출 , 실행 a=3 (비지역변수 , scope) b=4 ( 지역변수 ) p=5 ( 지역변수 ) 4) 프로시져 print 호출 , 실행 ① 정적 영역 규칙 a : scope, b : scope, p : 함수 p 결과 : 3, 1, 2

② 동적 영역 규칙 a : scope, b : 함수 q, p : 함수 q 결과 : 3, 4, 5

• 예제 : 영역규칙 적용 예

Page 22: 제  4  장  변수 ,  영역 ,  수명

22

각 언어에서의 영역

FORTRAN• 지역변수 - 서브 프로그램 (SUBROUTINE 또는 FUNCTION) 내에 선언된 ( 명시적 / 묵시적 ) 변수• 전역변수 - COMMON 문으로 선언• 예 )

C THIS IS THE MAIN PROGRAM

COMMON /A/ X, Y, Z(10)COMMON GD, IRED, TEMP . . .END

SUBROUTINE A1(P, Q)COMMON GD, IRED, TEMP . . .END

SUBROUTINE A2(P, Q)COMMON /A/ X, Y, Z(10) . . .END

• X, Y, Z(10) 은 A2 와 공유• GD, IRED, TEMP 는 A1 과 공유

• X, Y, Z(10) 은 A2 와 공유• GD, IRED, TEMP 는 A1 과 공유

Page 23: 제  4  장  변수 ,  영역 ,  수명

23

각 언어에서의 영역 (2)

PL/I• ALGOL 60 의 후계자• BEGIN..END 도입 ( 블록 개념 )

• 모든 변수들을 반드시 명시적으로 선언하지 않아도 되는 묵시적 선언가능 -> 변수가 선언되지 않고 사용되면 그 변수가 사용된 프로시져 문에서 묵시적으로 정의된 것으로 간주

• 문제점 발생– 다음의 예 : 블록에서 사용되는 대부분의 변수들이 지역 변수로

사용되기를 원했지만 , 그와는 반대로 기대하지 않았던 결과를 초래

Page 24: 제  4  장  변수 ,  영역 ,  수명

24

각 언어에서의 영역 (3)

:PROCEDURE

END PEC;

: BEGIN; ···B

END A;

: BEGIN; J = X; ① ···C

D

END B;

: BEGIN J = Y; ② ···END C;

: /* 여기서 J 를 사용 */ ③

• ① J : 프로시져 PEC 에서 묵시적 선언 간주• ② J : B, C 에서 각각 지역변수로 오해• ③ J 의 해석 : X 라고 생각하나 비지역 변수라서 X 가 아닌 Y 값을 가짐

묵시적 선언 => 변수 선언의 혼동 초래

PL/1 영역 문제

PEC

A

Page 25: 제  4  장  변수 ,  영역 ,  수명

25

각 언어에서의 영역 (4)

ALGOL 68• begin ... end 블록 개념 일반화• 영역 블록 - 모든 문맥 시작 기호와 문맥 마침 기호 사이• 선언문

– 블록 입구에서 선언– 블록 끝에서 해제 => 영역 : 블록 단위

• 예 ) if - fi, then-else, else -fi, begin-end 등

Pascal• begin ... end 도입 ( 복합문 개념 ) - 영역 단위인 블록 아님• 선언 - 프로시져 , 함수 시작부 => 프로시저 / 함수가 영역 단위• 프로시져 내포 가능

– 정적 영역 규칙

ifthen

else

fi

Page 26: 제  4  장  변수 ,  영역 ,  수명

26

각 언어에서의 영역 (5)

예 ) Pascal 영역 문제 •호출 구조 (recursion 가능 ) 1) A 는 A, B, D 호출가능 2) B 는 A, B, C 호출가능 3) C 는 A, B, C 호출가능 4) D 는 A, B, D 호출가능 * A 는 직접 C 를 , B 는 D 호출 불가• 변수 영역 - 정적 영역 규칙 예 ) B 에서 선언된 변수 B : 지역변수 C : 비지역 변수 A,D: 알 수 없음

•호출 구조 (recursion 가능 ) 1) A 는 A, B, D 호출가능 2) B 는 A, B, C 호출가능 3) C 는 A, B, C 호출가능 4) D 는 A, B, D 호출가능 * A 는 직접 C 를 , B 는 D 호출 불가• 변수 영역 - 정적 영역 규칙 예 ) B 에서 선언된 변수 B : 지역변수 C : 비지역 변수 A,D: 알 수 없음

procedure A

procedure B

procedure C

procedure D

Page 27: 제  4  장  변수 ,  영역 ,  수명

27

각 언어에서의 영역 (6)

C, C++, Java 에서의 영역• A lgol 과 같은 블록 개념의 언어• begin-end 대신에 중괄호 ( { ,} ) 를 사용하여 영역을 정의

{ int a = 2 ; /* outer block a */ print f ( “%d \n”, a) ; /* 2 is printed */ { int a = 5 ; /* inner block a */ printf (“%d\n”, a) ; /* 5 is printed */ } /*back to the outer block */ printf (“%d\n”, ++a) ; /* 3 is printed */}

{ int a = 2 ; /* outer block a */ print f ( “%d \n”, a) ; /* 2 is printed */ { int a = 5 ; /* inner block a */ printf (“%d\n”, a) ; /* 5 is printed */ } /*back to the outer block */ printf (“%d\n”, ++a) ; /* 3 is printed */}

{ int a_outer = 2 ; printf ("%d\n", a_outer) ; { int a_inner = 5 ; printf ("%d\n", a_inner) ; } printf("%d\n", ++a_outer) ; }

{

{ int a_outer = 2 ; printf ("%d\n", a_outer) ; { int a_inner = 5 ; printf ("%d\n", a_inner) ; } printf("%d\n", ++a_outer) ; }

{

동등하다 .동등하다 .

Page 28: 제  4  장  변수 ,  영역 ,  수명

28

각 언어에서의 영역 (7)

void p(void){ int a, b, x ; /* 블럭 p */ · · · { float x, y, z ; /* 다른 블럭 */ y = 1.5 ; /* 지역 변수 y */ a = 2 ; /* 비지역 변수 a 즉 p 의 a */ x = b * z ; /* 지역 변수 x, z, 비지역 변수 b */ } · · · }

void p(void){ int a, b, x ; /* 블럭 p */ · · · { float x, y, z ; /* 다른 블럭 */ y = 1.5 ; /* 지역 변수 y */ a = 2 ; /* 비지역 변수 a 즉 p 의 a */ x = b * z ; /* 지역 변수 x, z, 비지역 변수 b */ } · · · }

•다른 블럭에서 x, y, z : 지역변수•블록 p 에서 a, b : 비지역 변수•p 의 x : 영역 구멍 상태

•다른 블럭에서 x, y, z : 지역변수•블록 p 에서 a, b : 비지역 변수•p 의 x : 영역 구멍 상태

Page 29: 제  4  장  변수 ,  영역 ,  수명

29

각 언어에서의 영역 (8)

• C 에서는 모든 함수 전체를 영역으로 하는 외부 영역 외부 영역 (external scope) 이 존재 . 외부 영역만이 전역 영역을 갖는다 .

int i, j ;float x , y ; /* i, j, x, y 는 전역 변수 */void main (void){ int i, k ; /* i, k 는 main 함수에 지역적임 */ float a, b, c ; /* a, b, c 는 main 함수에 지역적임 */ · · · }

int i, j ;float x , y ; /* i, j, x, y 는 전역 변수 */void main (void){ int i, k ; /* i, k 는 main 함수에 지역적임 */ float a, b, c ; /* a, b, c 는 main 함수에 지역적임 */ · · · }

Page 30: 제  4  장  변수 ,  영역 ,  수명

30

각 언어에서의 영역 (9)

C++, Java• 변수 선언이 어느 부분에서나 나타날 수 있다 . ( 영역 : 선언문부터 함수 끝까지 )

• For 문의 초기화식에 제어 변수가 새로 정의되는 것을 허용– C++ 의 초기 버전에서 이 변수의 영역은 그 정의 부분부터 그 블록의 끝까지 였지만 , 표준 버전에서 그 영역은 Java 처럼 for 문으로 제한

블록 구조를 통한 영역의 개념의 장점① 지역성 (locality) 을 높여준다 . 변수를 사용할 프로그램 근처에 선언② 운영 체제하에서 작은 working set 이 요구된다 . 크기가 작은 기억장소 요구③ 표준 패키지를 사용자 프로그램에 결합시켜 하나의 프로그램을 만들기 쉽다 .

사용자 프로그램 안에 사용된 어떤 식별자도 표준 패키지에서 사용된 식별자와 충돌 없음

④ 프로그램의 구성을 단계적으로 세분화하는데 도움이 된다 .

Page 31: 제  4  장  변수 ,  영역 ,  수명

31

4.4 변수의 수명 (Extent)

수명 (Extent 또는 life time)- 변수가 기억장소를 할당받은 기간

X int

기억장소 할당에 관해서는 별도의 복사물 ( 제 8 장 기억장소 할당 ) 및 강의 노트 (ch04-1.ppt) 참고 !!!

Page 32: 제  4  장  변수 ,  영역 ,  수명

32

변수의 수명 (2)

FORTRAN• 정적 기억 장소 할당

=> 변수 수명 = 프로그램 수명 ALGOL 60

• 블록 단위 할당 / 해제 => 변수 수명 : ( 블록 시작 ~ 블록 종료 )

• own 변수 (static 변수 )

=> 변수 수명 : ( 주 프로시져 시작 ~ 주 프로시져 종료 )

참고 ) 변수 영역 : ( 블록 시작 ~ 블록 끝 )

– 초기화는 첫 번째 진입시 한 번 ( 진입 여부 검사 코드를 작성 )

Page 33: 제  4  장  변수 ,  영역 ,  수명

33

변수의 수명 (3) 동적 수명

• 예) 실행 시간에 기억 장소 할당 Pascal - new() ~ dispose()

PL/1 - ALLOCATE() ~ FREE()• 힙(heap) 기법 이용: 스택의 원리로 처리할 수 없는 객체들을 생성할 수 있도록 사용 가능한 기억 장소들의 집합

스택 사용

힙 사용

Page 34: 제  4  장  변수 ,  영역 ,  수명

34

4.5 변수와 그 환경 참조 환경 (reference environment)

• 특정 문장에서 가시적인 객체 이름의 모임

Pascal 프로그램과 해당하는 참조 환경의 예

program scopex; 참조 환경var i, j: integer;...procedure first(); var a, b: integer; ... scopex 의 i, j; first 의 a, b procedure inner() var i, a: real; begin ... inner 의 i, a; first 의 b; scopex 의 j end inner begin ... first 의 a, b; scopex 의 i, j end firstbegin... scopex 의 i, jend scopex

Page 35: 제  4  장  변수 ,  영역 ,  수명

35

4.6 상수 및 변수 초기화 변수 초기화

• 정적 변수는 기억 장소의 바인딩과 초기화가 동시에 가능• 동적 변수의 초기화는 실행 시간에 이루어짐• Fortran

– DATA COUNT /0/, AVERAGE /100.0/• Ada

– AVERAGE: REAL := 0.0;• C

– 정적 변수는 블록 실행시 오직 한 번만 초기화되어 그 값이 유지– 자동(동적) 변수는 블록의 매번 호출시 마다 초기화

상수와 초기화(Constant & Initialization)

• 프로그램이 실행되는 동안 값이 변하지 않는 식별자• 상수 개념 제공 : Pascal, Ada, Java, ANSI C, C++

Page 36: 제  4  장  변수 ,  영역 ,  수명

36

상수 및 변수 초기화 (2)

• 상수 표기법 : 참조 없이 값만을 보유

• 상수 허용 시 고려사항① 단순 자료형 또는 구조 자료형 (record, array)

② 상수 값 표현 : 번역 시간이나 실행 시간에 평가되는 수식 가능 여부③ 상수 값 배정 시간 ( 정적 : 프로그램 실행 전 한 번 or

동적 : 상수가 정의된 블록을 시작할 때마다 매번 )

④ 미리 정의된 상수 제공 여부

이름 속성들 값

Page 37: 제  4  장  변수 ,  영역 ,  수명

37

상수와 변수 초기화 예 Pascal

• const 사용• 숫자 , 스트링 , 열거형 값 등 허용 (스칼라 형 )

• true, false, maxint 등 내장된 상수 제공• const pi = 3.14159;

Algol 68

• 지정 연산자와 상수 선언 연산자의 구별 (:=, =)

real root2 := 1.4142135 변수 선언과 초기화 real root2 = 1.4142135 상수 선언

Page 38: 제  4  장  변수 ,  영역 ,  수명

38

상수와 변수 초기화 예 (2)

Ada• constant ( 모든 자료형에 사용 가능 )

X : constant INTEGER :=17; 상수 선언Y : INTEGER :=17; 변수 선언과 초기화

• 구조적 자료형의 초기화 type NATURAL is 1 . . N;

type ROSTER is array (NATURAL) of INTEGER;LINEUP : ROSTER (1 . . 100); 배열 선언LINEUP : = ( 1 . . 50 => 1 , 51 . . 100 => -l ); 배열 지정문LINEUP : ROSTER (1 . . 100) := ( 1 . . 50 => 1 , 51 . . 100 => -l ); 배열 선언과

초기화 LINEUP : constant ROSTER (1 . . 100) := ( 1 . . 50 => 1 , 51 . . 100 => -l );

상수 선언

Page 39: 제  4  장  변수 ,  영역 ,  수명

39

상수와 변수 초기화 예 (3)

C 언어• #define 문으로 기호 상수를 선언하였으나 , ANSI C 표준에서 상수 선언

도입• 예 )

const float pi = 3.1415926 ;

• 초기값 선언은 배열까지도 가능• 예 )

int a [2][3] = {{1, 2, 3}, {4, 5, 6}} ;

int a [2][3] = {1, 2, 3, 4, 5, 6} ;

int a [ ][ ] = {{1, 2, 3}, {4, 5, 6}} ;

동일한 선언 동일한 선언

Page 40: 제  4  장  변수 ,  영역 ,  수명

40

상수와 변수 초기화 예 (4)

Java• 예약어로 const 는 확보하였으나 , 기억 장소 속성으로 상수를 선언• 예 )

static finalstatic final float pi = 3.1415926 ;

• 초기값 선언 (C 언어와 비슷 )

– 변수 선언에서 초기값 부여 가능 .

– 예 ) int i = 100 ;

• 배열 선언– 객체로 취급하여 생성문 new 사용이 요구– 예 )

int [ ] ia = new int [3] ;

int [ ] ib = { 1, 2, 3 } ;

첫 선언 : 정수 배열 ia 선언과 생성만을 의미 .두 번째 선언 : new 가 없어도 정수 배열 ib 선언 및 생성과 초기값이 주어진다 .

첫 선언 : 정수 배열 ia 선언과 생성만을 의미 .두 번째 선언 : new 가 없어도 정수 배열 ib 선언 및 생성과 초기값이 주어진다 .