제 8장 영역과 수명 8.1 블록과 영역 8.2 정적 영역과 동적 영역 8.3 주요 언어에서의 영역 8.4 변수의 수명

Slides:



Advertisements
Similar presentations
3. 메소드와 변수 SCJP 자격증 프로젝트 발표자 : 최선웅. 1. 메 소 드 개 념 2. 메 소 드 양 식 3. 메 소 드 변 수 4. 메 소 드 예 제 5. 참 고 문 헌 / 자 료 목 차.
Advertisements

SCJP. Garbage Collection  Garbage Collector( 이하 GC) 가 Heap 영역 에 할당된, 더 이상 사용되지 않는 메모리인 Garbage 를 다른 객체가 사용할 수 있도록 정리하는 것.  C++ 에서의 메모리 해제 int* v=new.
Chapter 7 서브프로그램. Introduction 서브 프로그램의 명시 형식 인자전달 방법 ▫ Call by value ▫ Call by value result ▫ Call by reference ▫ Call by name 구현 방법 2.
제 4 장 변수, 영역, 수명 변수 바인딩 영역 기억장소 할당과 수명 변수와 그 환경 변수 초기화 상수와 변수.
5. 접근 제한자의 이해 SCJP 자격증 프로젝트 발표자 : 노효진.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
클래스 class, 객체 object 생성자 constructor 접근 access 제어 이벤트 event 처리.
Chapter 3 – 프로그래밍 언어 설계 Outline 3.1 설계 기준의 역사적 변천 3.2 효율성
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
제 9 장 구조체와 공용체.
컴퓨터 프로그래밍 기초 [Final] 기말고사
-Part2- 제3장 포인터란 무엇인가.
자료 구조: Chapter 3 (2)구조체, 포인터
제4장 블록 및 유효범위 Reading Chap. 5 © 숙대 창병모.
제 1장 프로그래밍 언어 소개 1.1 프로그래밍 언어란 무엇인가 1.2 프로그래밍 언어를 배워야 하는 이유
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용 8.3 인터페이스의 상속 8.4 인터페이스 참조
제 3장. C보다 나은 C++ II.
C 프로그래밍.
프로그래밍 언어론 제 4-1 장(보충 자료) 기억 장소 할당 정적 및 동적 기억 장소 할당 단위 프로그램 정적 기억 장소 할당
Chapter 9 – 기억 장소 배당 Outline 9.1 정적 및 동적 기억 장소 배당 9.2 단위 프로그램
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template
6주차: Functions in C and Others
자바 5.0 프로그래밍.
패키지와 접근 제어 패키지에 대하여 접근 제어에 대하여.
Java 6장. 클래스 : 속성 public class SumTest {
Lesson 7. 클래스와 메소드 - 1.
11장. 1차원 배열.
C#.
5장 이름, 바인딩, 영역(2) 순천향대학교 컴퓨터공학과 하상호.
5장 이름, 바인딩, 영역(2) 순천향대학교 컴퓨터공학과 하상호.
Method & library.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
제 10장 부 프로그램 10.1 개요 10.2 매개 변수 평가와 전달 기법 10.3 형식 매개 변수 명세
27장. 모듈화 프로그래밍.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
Lesson 2. 기본 데이터형.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
10장 부프로그램 구현 순천향대학교 컴퓨터공학과 하 상 호.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
자바 5.0 프로그래밍.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
Chapter 4 변수 및 바인딩.
6.4 타입 검사 (Type Checking).
JA A V W. 06.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
함수(Function) ◈ 함수의 개념 및 사용 이유 ◈ 함수 정의, 호출 및 선언 ◈ 지역변수와 전역변수 ◈ return 문
Signature, Strong Typing
제 6 장 함수(functions).
클래스 : 기능 CHAPTER 7 Section 1 생성자(Constructor)
7주차: Functions and Arrays
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
Chapter 3 – 프로그래밍 언어 설계 Outline 3.1 설계 기준의 역사적 변천 3.2 효율성
3. 모듈 (5장. 모듈).
발표자 : 이지연 Programming Systems Lab.
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
구조체(struct)와 공용체(union)
16장. 변수, 연산자, 사용자 정의 함수 변수 배열과 객체 연산자 함수.
Numerical Analysis Programming using NRs
Static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab..
1. 지역변수와 전역변수 2. auto, register 3. static,extern 4. 도움말 사용법
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
자바 객체 지향 프로그래밍 Ps lab 김윤경.
Pointers summary.
함수 정의, void 자료형 함수 원형선언 함수 호출 변수 영역 규칙 재귀 함수
Presentation transcript:

제 8장 영역과 수명 8.1 블록과 영역 8.2 정적 영역과 동적 영역 8.3 주요 언어에서의 영역 8.4 변수의 수명 8.5 Ada의 영역

8.1 블록과 영역 영역 (Scope) 식별자의 사용이 허락하는 프로그램 범위 수명 (Extent, Life time) 식별자 영역과 수명 8.1 블록과 영역 영역 (Scope) 식별자의 사용이 허락하는 프로그램 범위 수명 (Extent, Life time) 식별자의 메모리 할당부터 해제까지의 기간 가장 간단한 영역 사용 개념 전역 변수화 : 모든 프로그램에서 공유 가능 문제점 - 식별자 사용의 복잡화 - 혼돈 - 프로그램 합성시 문제점 발생

컴파일 시간 : 기호(Symbol) 테이블 저장 식별자 영역과 수명 ALGOL 60 블록 구조 (begin - end) 사용 컴파일 시간 : 기호(Symbol) 테이블 저장 실행 시간 : 기억 장소 할당 ALGOL60 integer x 1) 컴파일시간 2) 실행시간 x 정수

8.2 정적 영역과 동적 영역 정적 영역 규칙 (static scope rule) 영역이 블록의 정적 내포 관계로 결정 식별자 영역과 수명 8.2 정적 영역과 동적 영역 정적 영역 규칙 (static scope rule) 영역이 블록의 정적 내포 관계로 결정 : 컴파일러 언어 most closely nested 동적 영역 규칙 (dynamic scope rule) 영역을 프로그램의 실행 순서에 의해 결정 : 인터프리터 언어 most recently initiated

비지역 변수 : 현재 블록에서 사용되나 바깥 블록에서 선언된 변수 식별자 영역과 수명 변수의 종류 지역 변수 : 현재 블록에서 선언된 변수 비지역 변수 : 현재 블록에서 사용되나 바깥 블록에서 선언된 변수 전역 변수 : 모든 블록에서 사용 가능한 변수 영역 구멍 (hole-in-scope) 내포된 블록 사이에 동일 지역 변수 선언하면 바깥 블록의 지역 변수는 내부 블록 구간에서 사용 할 수 없는 현상

정적 영역 규칙 (Algol) 식별자 영역과 수명 1 a:begin integer i, j; real x, y; 2 3 4 5 6 7 8 ··· 9 10 11 12 13 14 15 16 17 18 ··· 19 end a; 변수 자료형 integer boolean real i j 1, 2, 8, 18~19 3~7 9~17 1~8, 18~19 11~15 9~10, 16~17 x y <각 변수 영역 줄번호> 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;

동적 영역 규칙 (APL) 식별자 영역과 수명 Z 5 주프로그램 7 SUB 2 : 2 는 실매개 변수 Z FUN Y SUB I; Y : I는 형식 매개 변수 Z FUN N; X X Y R FUN N; X : N은 형식 매개 변수 Z 5 7 SUB 2 Z FUN Y : 2 는 실매개 변수 : Y는 실매개 변수, 결과를 Z에 배정 주프로그램 부프로그램 SUB 함수 FUN X는 지역변수 Y는 지역변수 1) 주프로그램에서 “SUB 2” 호출 <SUB > X, Z : 전역변수(주프로그램) Y : 지역변수 1-1) SUB에서 “FUN N” 호출 <FUN > Y : 비지역변수(SUB) N, X : 지역변수 2) 주프로그램에서 “FUN Y” 호출 <FUN> Y : 전역변수(주프로그램)

정적, 동적 영역 규칙의 예 식별자 영역과 수명 실행과정 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 : 함수 q, b : 함수 q, p : 함수 q 결과 : 3, 4, 5 function p : integer; var a : integer; begin a :=0; b :=1; p :=2 end p; procedure print; write(a); write(b); writeln(p) end print; procedure q; var b, p : integer; a :=3; b :=4; p :=5; print end q; program scope; var a, b : integer; begin a :=p; q; end scope

Scoperule.java public class ScopeRule{ int a,b,p,q; public ScopeRule() { a = p(); q(); } public int p(){ int a; a = 0; b = 1; p = 2; return p; public void print() { System.out.println("a="+a); System.out.println("b="+b); System.out.println("p="+p); public int q() { int b,p; a = 3; b = 4; p = 5; print(); return q; public static void main (String args[]) { new ScopeRule();

8.3 언어에서의 영역 FORTRAN 지역 변수 프로그램(SUBROUTINE 또는 FUNCTION) 내에 식별자 영역과 수명 8.3 언어에서의 영역 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 .... SUBROUTINE A2(P, Q) COMMON /A/ X, Y, Z(10) X, Y, Z(10)은 A2와 공유 GD, IRED, TEMP는 A1과 공유

주요 언어 영역 규칙 (JOVIAL, PL/I) 식별자 영역과 수명 주요 언어 영역 규칙 (JOVIAL, PL/I) JOVIAL ALGOL 58의 후계자 미국방성에서 주로 사용 정적 영역 규칙(블록 중심) 분리 컴파일 허용 COMPOOL(각 모듈에게 자료, 프로시져. 정의 등의 공유를 제공) 실행시간 매개 변수 간의 형 검사, 전역 변수의 정의 / 사용 검사 가능

PL/I ALGOL 60의 후계자 BEGIN, END 도입 (블록 개념) 묵시적 선언 가능 -> 문제점 발생 식별자 영역과 수명 PL/I ALGOL 60의 후계자 BEGIN, END 도입 (블록 개념) 묵시적 선언 가능 -> 문제점 발생

PL/I 영역 문제 식별자 영역과 수명 PEC:PROCEDURE A:BEGIN; ··· B: BEGIN; J = X; ① END PEC; A:BEGIN; ··· END A; B: BEGIN; J = X; ① END B; C: BEGIN J = Y; ② END C; D:/* J 사용 */ ③ ① : 프로시져 PEC에서 선언(묵시적, 시스템) ② : C 믈록에서 선언(묵시적, 프로그래머) ③ : J의 해석 1) ②의 J가 지역변수 -> J == Y 2) ②의 J가 전역변수 -> J == X 묵시적 선언 => 변수 선언의 혼동 초래

주요 언어 영역 규칙 (ALGOL 68, Pascal) 식별자 영역과 수명 자 료 형 주요 언어 영역 규칙 (ALGOL 68, Pascal) ALGOL 68 begin … end 도입 (블록 개념) 선언문 블록 입구에서 선언 블록 끝에서 해제 => 영역 : 블록 단위 예) if-fi, then-else, else-fi, begin-end 등

Pascal begin … end 도입 (복합문 개념) 선언 프로시져, 함수 시작부 => 프로시져/ 함수가 영역 단위 식별자 영역과 수명 Pascal begin … end 도입 (복합문 개념) 선언 프로시져, 함수 시작부 => 프로시져/ 함수가 영역 단위 프로시져 내포 가능 블록 끝에서 해제 => 영역 : 블록 단위

Pascal 영역 문제 예) Pascal 식별자 영역과 수명 호출 구조 procedure A 1) A : A, B, D 2) B : A, B, C 3) C : A, B, C 4) D : A, B, D 변수 영역 - 정적 영역 규칙 예) B에서 선언된 변수 B : 지역변수 C : 비지역 변수 procedure A procedure B procedure C procedure D

{ int a = 2; /* 외부 영역의 a변수 */ printf(“%d\n”,a); /* 2가 출력 됨 */ int a = 5; /* 내부 영역의 a변수 */ printf(“%d\n”,a); /* 5가 출력 됨 */ } printf(“%d\n”,++a); /* 3이 출력 됨 */

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

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 */ }

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

높은 지역성 => 작은 working set 표준 패키지와 사용자 프로그램 연결 용이 <= 식별자 충돌 제거 식별자 영역과 수명 블록 구조 영역 규칙 사용 장점 지역성 (locality) 증가 높은 지역성 => 작은 working set 표준 패키지와 사용자 프로그램 연결 용이 <= 식별자 충돌 제거 단계적 세분화 (stepwise refinement) 유리

8.4 변수의 수명 수명 (Extent) 또는 (life time) 변수가 기억 장소를 할당 받은 기간 식별자 영역과 수명 8.4 변수의 수명 수명 (Extent) 또는 (life time) 변수가 기억 장소를 할당 받은 기간 FORTRAN, COBOL 정적 메모리 할당 => 변수 수명 = 프로그램 수명

=> 변수 수명 : (블록 시작 - 블록 종료) 식별자 영역과 수명 ALGOL 60 블록 단위 할당 / 해제 => 변수 수명 : (블록 시작 - 블록 종료) own 변수 (static 변수) => 변수 수명 : (주 프로세서 시작 - 주 프로세서 종료) 참고) 변수 영역 : (블록 시작 - 블록 종료) 초기화는 1번 (첫번째 진입시) own 형의 가변 배열 가능?

변수의 수명 (PL/I) PL/I Automatic - 수명 : (블록 입구 - 블록 출구) 식별자 영역과 수명 변수의 수명 (PL/I) PL/I Automatic - 수명 : (블록 입구 - 블록 출구) static - 수명 : (주 프로시져 입구 - 주 프로시져 끝) controlled - 수명 : (allocated() 문 - free() 문) Based (stack 개념) - 수명 : (allocate() 문 - free() 문)

예) 식별자 영역과 수명 DECLARE 1 STUDENT BASED (P) 2 NAME CHARACTER(25) VARYING, 2 SSNUMBER FIXED, 2 AGE FIXED, 2 MAJOR CHARACTER(10), 2 LINK POINTER; STUDENT : 레코드형 이름 P : STUDENT를 가리키는 포인터 ALLOCATE(P) - 메모리 할당 연속적인 ALLOCATE(P) - 스택에 저장 FREE(P) - 메모리 해제(스택에서 POP)

변수 수명 (PL/I) PL/I 기억 장소 요약 식별자 영역과 수명 CONTROLLED AUTOMATIC STATIC BASED 종 류 주 프로시저 시작 기억장소 할당 블록/프로시저 시작 ALLOCATE() 문 기억장소 해제 주 프로시저 종료 블록/프로시저 종료 FREE() 문, 태스크 종료

1) pascal - new(), dispose() 2) PL/I - ALLOCATE(), FREE() 식별자 영역과 수명 동적 수명 실행 시간에 메모리를 할당문에 의해 할당, 해제문에 의해 회수된 예) 1) pascal - new(), dispose() 2) PL/I - ALLOCATE(), FREE() 힙(heap) 기법 이용

C – Type Modifier auto extern register static 자동변수를 선언함. 그러나 모든 지역변수는 자동변수 이므로 불필요한 수정자이다. (C언어의 전신인 B언어와 호환성을 위해 존재) extern extern 변수는 메모리 할당을 받지 않으며 해당 이름의 전역변수를 사용하겠다는 의미. (분리 컴파일 / 링크 시 사용) register 변수의 접근 시 가능한 빠른 접근을 원한다는 것을 컴파일러에게 알려주는 역할을 함. (반드시 CPU 레지스터에 변수를 저장해야 한다는 규정은 없어졌다.) static 전역변수와 static변수는 프로그램이 실행되는 전체시간 동안 존속하게 된다. (전역변수-외부링크, static전역변수-내부링크, static지역변수-링크없음)

static keyword C Java static 변수들은 프로그램 실행 동안 계속 존재하게 된다. 전역변수나 지역변수에 모두 사용 가능하다. 함수 내에(지역변수) 선언 시 함수호출 시 마다 초기화 되지 않고 단 한번만 초기화된다. 전역변수에 사용되면 같은 파일의 함수에서만 알려지고 다른 파일에서는 접근할 수 없게 된다. 명시적으로 초기화 하지 않으면 값이 0이 된다. static member는 클래스 전역에서 사용되며 객체생성 없이 클래스 이름만으로 참조 가능하다. class member에만 static을 사용할 수 있다. 한 객체에서 그 값을 변경하면 같은 클래스로 만들어진 모든 객체의 static 변수의 값도 함께 변경된다. final keyword와 함께 쓰여서 class constant 정의 시 사용된다. Java에서는 main() 메소드도 클래스 내에 존재해야 하므로 static으로 선언된다.

variable.c #include <stdio.h> int i; // 전역변수 void other(); void main(){ static int a; // static변수(0으로 초기화) register int b=3; // register변수 int c=4; // 지역변수(자동변수) printf("%d\t%d\t%d\t%d\n", i, a, b, c); other(); i++; a++; } void other(){ int i=16; // 지역변수(자동변수) static int a=0; // static변수(한번만 초기화) a+=2; printf("%d\t%d\n", i, a);

Variable.java class Variable{ public int i; // 멤버변수(0으로 초기화) static int a; // static변수 public static void main(String args[]){ // static메소드 Variable v=new Variable(); int b=3; // 지역변수 int c=4; // 지역변수 System.out.println(v.i+"\t"+Variable.a+"\t"+b+"\t"+c); other(); v.i++; Variable.a++; } static void other(){ // static메소드 int i=16; // 지역변수 a+=2; System.out.println(i+"\t"+a);

8.5 Ada의 영역 Ada 영역 단위 부 프로그램 (procedure, function) 패키지 (package) 태스크 (task)

영역 단위 구조 식별자 영역과 수명 프로시져, 함수 procedure NAME(parameter) is 선언부 begin 문장부 end; package package NAME is package body NAME is task task NAME is task body NAME is

내포된 부프로그램과 자격 부여 예 (Ada) 식별자 영역과 수명 지역/비지역 식별자 구분 - 지역/비지역 식별자가 procedure HERE is procedure THEN is A:REAL; B:REAL; procedure NOW is B:REAL; -- THEN.B가 숨겨짐 C:REAL; begin B :=A; -- NOW.B :=THEN.A C :=THEN.B; -- NOW.C :=THEN.B end NOW; ··· end THEN; end HERE; 지역/비지역 식별자 구분 - 지역/비지역 식별자가 같은 경우 지역식별자를 한정하여 표현 블럭 이름.식별자

Qualification.java public class Qualification{ public static double a =10.0, b = 20.0; public Qualification() { new now(); } class now extends Object { public double b = 30.0, c = 40.0; public now() { b = a; c = Qualification.b; System.out.println("b = "+b); System.out.println("c = "+c); public static void main (String args[]) { new Qualification();

식별자 자격 부여 사용 예(Ada) 식별자 영역과 수명 package LOGICS is begin A, B, C:BOOLEAN; end LOGICS; procedure MAIN is package NUMBERS is C, D, E:INTEGER; end NUMBERS; procedure DOSOMETHING is A, F:REAL; use LOGICS, NUMBERS; begin -A는 DOSOMETHING.A -B는 LOGICS. B -D는 NUMBERS.D -E는 NUMBERS.E -F는 DOSOMETHING.F -C는 LOGICS.C 또는 NUMBERS.C end end DOSOMETHING ··· end MAIN