5장 이름, 바인딩, 영역(2) 2017. 4. 12 순천향대학교 컴퓨터공학과 하상호.

Slides:



Advertisements
Similar presentations
Chapter 7 서브프로그램. Introduction 서브 프로그램의 명시 형식 인자전달 방법 ▫ Call by value ▫ Call by value result ▫ Call by reference ▫ Call by name 구현 방법 2.
Advertisements

제 4 장 변수, 영역, 수명 변수 바인딩 영역 기억장소 할당과 수명 변수와 그 환경 변수 초기화 상수와 변수.
6장 데이터 타입 순천향대학교 컴퓨터공학과 하 상 호.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
최윤정 Java 프로그래밍 클래스 상속 최윤정
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
컴퓨터 프로그래밍 기초 [Final] 기말고사
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
제4장 블록 및 유효범위 Reading Chap. 5 © 숙대 창병모.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용 8.3 인터페이스의 상속 8.4 인터페이스 참조
10장 함수.
제5장 기초 의미론 (Basic Semantics)
제 3장. C보다 나은 C++ II.
프로그래밍 언어론 제 4-1 장(보충 자료) 기억 장소 할당 정적 및 동적 기억 장소 할당 단위 프로그램 정적 기억 장소 할당
Chapter 9 – 기억 장소 배당 Outline 9.1 정적 및 동적 기억 장소 배당 9.2 단위 프로그램
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
6주차: Functions in C and Others
23장. 구조체와 사용자 정의 자료형 2.
Java 6장. 클래스 : 속성 public class SumTest {
자료구조: CHAP 4 리스트 (3) 순천향대학교 컴퓨터공학과 하 상 호.
14장. 포인터와 함수에 대한 이해.
14. 예외처리.
공학컴퓨터프로그래밍 Python 염익준 교수.
11장. 1차원 배열.
C#.
[INA470] Java Programming Youn-Hee Han
13. 연산자 오버로딩.
5장 이름, 바인딩, 영역(2) 순천향대학교 컴퓨터공학과 하상호.
Method & library.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
어서와 C언어는 처음이지 제14장.
27장. 모듈화 프로그래밍.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
메모리 관리 & 동적 할당.
6장 데이터 타입 순천향대학교 컴퓨터공학과 하 상 호.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
프로그래밍 언어론 - 소개 순천향대학교 컴퓨터공학과 하 상 호.
6장 데이터 타입(4) 순천향대학교 컴퓨터공학부 하 상 호.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
10장 부프로그램 구현 순천향대학교 컴퓨터공학과 하 상 호.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
Chapter 4 변수 및 바인딩.
메모리 타입 분석을 통한 안전하고 효율적인 메모리 재사용
6.4 타입 검사 (Type Checking).
9장 부프로그램 (3) 순천향대학교 컴퓨터공학부 하 상 호.
Fucntion 요약.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
함수(Function) ◈ 함수의 개념 및 사용 이유 ◈ 함수 정의, 호출 및 선언 ◈ 지역변수와 전역변수 ◈ return 문
제 6 장 함수(functions).
9장 부프로그램 (3) 순천향대학교 컴퓨터공학부 하 상 호.
Chapter 2 C++ 함수와 네임스페이스. 최호성.
7주차: Functions and Arrays
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
16장. 변수, 연산자, 사용자 정의 함수 변수 배열과 객체 연산자 함수.
Numerical Analysis Programming using NRs
Static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab..
3장 (2) 구문과 의미론 순천향대학교 컴퓨터공학과 하상호.
1. 지역변수와 전역변수 2. auto, register 3. static,extern 4. 도움말 사용법
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
6장 데이터 타입(5) 순천향대학교 컴퓨터공학부 하 상 호.
7 생성자 함수.
제 8장 영역과 수명 8.1 블록과 영역 8.2 정적 영역과 동적 영역 8.3 주요 언어에서의 영역 8.4 변수의 수명
Presentation transcript:

5장 이름, 바인딩, 영역(2) 2017. 4. 12 순천향대학교 컴퓨터공학과 하상호

목차 서론 이름 변수 바인딩개념 영역 영역과 존속기간 참조환경 이름 상수

영역 변수의 영역(scope)은 그 변수가 가시적인 문장들의 범위이다 변수가 어떤 문장에서 참조될 수 있으면, 변수는 그 문장에서 가시적(visible)이라고 함 언어의 영역 규칙은 이름의 참조가 변수와 어떻게 연관되는지를 결정 정적 영역 동적 영역 변수 유형 프로그램 단위의 지역 변수(local variables)는 그 단위에 선언된 변수 프로그램 단위의 비 지역변수(nonlocal variables)는 그 단위에서 가시적이나 그 곳에 선언되지 않은 변수 전역 변수(global variables)는 비 지역 변수의 특정 부류이며, 부 프로그램 외부에 선언된 변수

정적 영역 정적 영역(static scope)은 프로그램 텍스트에 기반 변수의 영역이 실행 전에 결정 프로그램 판독자나 컴파일러가 모든 변수의 타입을 결정 가능 이름을 변수에 대한 참조와 연관하기 위해서 그 선언문을 찾아야 한다 먼저, 지역적으로 선언문을 찾고, 다음에, 그 이름에 대한 선언문이 찾아질 때까지, 현재 영역을 포함한 영역(enclosing scope)에서 점차 더 큰 영역 순으로 선언문을 찾는다. 용어 현재 영역을 포함한 더 큰 영역들을 정적 선조(static ancestors)라 하고, 가장 가까운 정적 선조를 정적 부모(static parents)라 한다.

정적 영역 부프로그램 정의 중첩이 가능한 언어는 중첩 정적 영역을 생성 Ex. Pascal, Python, Ada, JavaScript, Fortran 2003+ 등 그렇지 않는 언어는 중첩된 클래스나 블록에 의해서 중첩된 영역 생성 Ex. C 기반 언어

정적 영역 예제: in JavaScript, sub2의 x에 대한 참조와 연관된 선언문은? sub1에서 big에 선언된 x를 참조 가능한가? function big() { function sub1() { var x = 7; sub2(); } function sub2() { var y = x; var x = 3; sub1();

정적 영역 변수는 동일한 이름을 갖는 정적 선조 영역에 속한 변수로 인해서 프로그램 단위로부터 은폐될 수 있다. 은폐된 변수는 정적 선조 영역의 이름을 포함한 선택적 참조(selective reference)로 접근 가능 function big() { // in Ada function sub1() { var x = 7; x = x + big.x; // 해당 조상 영역의 이름 포함 sub2(); } function sub2() { var y = x; var x = 3; sub1();

블록 블록(blocks)은 프로그램 단위 내부에서 정적 영역을 생성하는 방법 제공 ALGOL 60에서 도입 블록-구조 언어(block-structured language)의 기원 블록에 선언된 변수는 스택-동적 영역이 최소화된 지역 변수 허용 If (list[i] < list[j]) { int tmp; tmp = list[i]; list[i] = list[j]; list[j] = tmp; }

블록 블록에서 더 큰 영역의 이름 재사용 여부? sub의 count는 while 내부에서 은폐 C/C++에서 적법하나 Java/C#에서는 불가 void sub() { int count; while (...) { int count; // 중첩된 블록에서 이름의 재사용 허용 여부? count++; ... } …

LET 구조 대부분의 함수형 언어는 let 구조를 포함 let 구조는 2개 부분으로 구성 Ex: in Scheme, 첫번째 부분은 이름들을 값들에 바인딩 두번째 부분은 첫번째 부분에서 정의된 이름들을 사용 이름들의 영역은 LET에 지역적 Ex: in Scheme, (LET ( (name1 expression1) … (namen expressionn)) expression ) (LET ( (top (+ a b)) (bottom (- c d))) (/ top bottom) )

선언 순서 C89에서 선언은 함수의 시작부분에 위치해야 함 C99, C++, Java, C#는 변수 선언은 문장이 올 수 있는 곳이면 어디든지 올 수 있음 C99, C++, Java에서, 지역 변수의 영역은 선언문부터 그 선언문이 나타난 블록 끝까지 C#에서, 블록에 선언된 변수 영역은 블록 전체(선언문의 위치에 관계없이 블록 전체) 그러나 변수는 사용되기 전에 선언되어야 되고, 따라서 변수는 그 선언문에 앞서 사용될 수 없다.

선언 순서 C++, Java, C#에서, 변수는 for 문에서 선언 가능 이러한 변수의 영역은 for 구조에 제한 count의 영역은? void fun() { … for (int count = 0; count < 10; count++) { }

전역 영역 C, C++, PHP, Python은 한 파일에 일련의 함수 정의들을 포함하는 프로그램 구조 지원 이러한 언어는 함수 외부에 변수 정의를 허용 이러한 정의는 전역 변수를 생성하고, 이는 함수에서 가시적일 수 있다. C, C++는 전역 데이터에 대해서 선언(속성만)과 정의(속성과 기억공간)를 구분 단지 한 개의 정의에 대해서 임의 개수의 선언 가능 함수 정의 외부에 오는 변수 선언은 그 변수가 다른 파일에 정의되어 있다는 것을 명세 C의 전역 변수는 그 이후에 오는 모든 함수에서 가시적

전역 영역 선언과 정의 함수 뒤에 정의된 전역 변수는 그 함수 내부에서 변수를 다음과 같이 선언함으로써 가시적이게 할 수 있다. C99에서, 전역 변수 정의는 초기 값을 가지나 선언은 초기값을 갖지 않는다. 선언이 함수 정의 외부에 오면, 그 선언은 extern을 포함할 필요 없다. 선언과 정의 개념은 함수에도 적용(C/C++) extern int sum;

전역 영역 전역변수는 동일한 이름을 갖는 지역 변수에 의해서 은폐 가능 C++에서, 은폐된 전역변수는 영역 연산자(::)로 접근 가능 // in C++ int i = 1; int main() { int i = 2; cout << i << ::i << “\n”; return 0; }

전역 영역 PHP에서, 전역변수는 함수에서 묵시적으로 가시적이지 않다 전역 변수는 global 선언을 통해서 가시적이게 $day = “Monday”; $month = “January”; function calendar(){ $day = “Tuesday”; global $month; print “local day is $day <br />”; $gday = $GLOBALS[‘day’]; print “global day is $gday <br />”; print “global month is $month <br />”; }

전역 영역 Python에서, 전역 변수는 함수에서 참조될 수 있으나, 그 변수가 global로 선언된 경우에만 값을 할당받을 수 있다. 비적법 day = “Monday” def tester(): print “The global day is:”, day day = “Monday” def tester(): print “The global day is:”, day day = “Tuesday” print “The new value of day is:”, day day = “Monday” def tester(): global day print “The global day is:”, day day = “Tuesday” print “The new value of day is:”, day

정적 영역 평가 많은 상황에서 잘 동작한다. 문제점 대부분의 경우에, 필요 이상의 너무 많은 접근을 허용 프로그램이 수정되면서, 변수와 부프로그램 접근을 제한하는 그 초기 구조는 사라지고, 지역변수와 부프로그램들이 전역화되어 가는 경향

동적 영역 동적 영역(dynamic scope)은 부프로그램의 호출 시퀀스에 기반하며 실행 시간에 결정 프로그램 텍스트에 기반하지 않음 Ex. APL, SNOBOL4, LISP 초기 버전 Perl, Common LISP은 디폴트가 정적이나 동적 영역도 허용 변수에 대한 참조는 현 지점의 실행에 이르게 한 부프로그램의 호출 체인의 역순으로 탐색하면서 선언에 연관

Perl에서 영역 묵시적으로 선언된 변수는 전역 변수이다. 지역 변수 선언 가능 my $var => 정적 영역 (디폴트) local $var => 동적 영역

동적영역 예제: Perl $name = "Bill Green"; $you = "Bob Smith"; print "In main script block:\n Name is $name and you are $you.\n\n"; &printstuff; # call subroutine print "Back in main script block:\n Name is $name and you are $you.\n\n"; sub printstuff{ my $name = "Joe Brown"; local $you = "Jim White"; # assign in dynamic scope print "In 1st level1 sub:\n Name is $name and you are $you.\n\n"; &printmorestuff; # call subroutine $you = "Mary Jones"; # set $you to local/global value &printevenmorestuff($name); # call subroutine, pass value } sub printmorestuff{ print "In 1st level2 sub:\n Name is $name and you are $you.\n\n”; sub printevenmorestuff{ my $name = @_; # locally assign passed value to $name print "In 2nd level2 sub:\n Name is $name and you are $you.\n\n";

동적 영역 예제 다음 호출 시퀀스를 고려하라. big => sub1 => sub2 big => sub2 sub2()에서 x의 의미는? function big() { function sub1() { var x = 7; } function sub2() { var y = x; var z = 3 var x = 3;

동적 영역 평가 장점: 편의성(convenience) 단점 부프로그램이 실행중일 때, 그 변수들은 그가 호출하는 모든 부프로그램에 가시적 => 비 신뢰적 정적 타입 검사 불가 낮은 판독성: 변수의 참조 의미를 파악하기 위해서 호출 시퀀스 파악 필요 비 지역변수에 대한 접근이 비 효율적

영역과 존속기간 영역과 존속기간의 차이는? 공간적 개념 vs. 시간적 개념 C/C++의 함수에 선언된 static 변수의 영역과 존속기간은? void printheader() { … } void compute() { int sum; printheader(); sum의 영역과 존속기간은?

참조 환경 어떤 문장의 참조 환경(referencing environment)은 그 문장에서 가시적인 모든 이름들의 집합 정적 영역에서 참조 환경은 그 지역 영역에 선언된 변수와 그 조상 영역에 속한 가시적인 모든 변수들로 구성 문장의 참조 환경은 컴파일 과정에서 필요 동적 영역에서 참조 환경은 지역 변수와 현재 활성화된 모든 다른 부 프로그램들에게 속한 모든 변수들로 구성 최근에 활성화 부프로그램의 변수는 그 이전에 활성화된 부프로그램의 동일이름의 변수를 은폐 활성화된 부 프로그램 (active subprogram)은 실행이 시작되었으나 아직 종료되지 않은 상태

예제: 참조 환경 (정적 영역) Program example; var a, b: integer; … procedure sub1; var x, y: integer; begin …. ----- 1 end; procedure sub2; var x: integer; procedure sub3; … ------ 2 end … ------ 3 … ----------- 4 end. 지점 참조환경 1 2 3 4

예제: 참조환경 (정적 영역) 지점 참조환경 1 2 3 # in Python g = 3; # 전역 변수 def sub1(): a = 5; b = 7; … ---------- 1 def sub2(): global g; c = 9; … ---------- 2 def sub3(): nonlocal c: g = 11; … ---------- 3 지점 참조환경 1 2 3 Python에서, 함수 정의는 새로운 영역을 생성 문장의 참조환경은 그 지역변수들과 그 문장을 내포한 함수들에 선언된 모든 변수들을 포함 전역변수는 함수 내부에서 가시적이나 배정을 위해서는 global로 선언되어야 함 비지역 변수 참조를 위해서 그러한 변수는 nonlocal로 선언되어야 함

예제: 참조 환경(동적 영역) void sub1(void) { int a, b; … ---------- 1 } void sub2(void) { int b, c; … ----------- 2 sub1(); void main() { int c, d; … ------------3 sub2(); 지점 참조환경 1 2 3

이름 상수 이름 상수(named constant)는 단지 한번만 값에 바인딩 되는 변수 판독성, 신뢰성 향상 pi = 3.14159265

이름 상수 이름 상수를 프로그램 매개변수로 사용 프로그램 수정(modifiability) 지원 void example() { final int len = 100; int[] intList = new int[len]; String[] strList = new String[len]; … for (index = 0; index < len; index++) { } average = sum / len;

이름 상수 예제: const int result = 2 * width + 1; // in C++ // 동적 바인딩 허용 final … // in Java const … // in C#: 정적 바인딩 readOnly… // in C#: 동적 바인딩