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

Slides:



Advertisements
Similar presentations
Copyright © 2015 Pearson Education, Inc. 6 장 : 프로그래밍 언어.
Advertisements

YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
Copyright © 2006 The McGraw-Hill Companies, Inc. 프로그래밍 언어론 2nd edition Tucker and Noonan 5 장 타입 “ 타입은 컴퓨터 프로그래밍의 효소이다 ; 프로그래밍은 타입을 통해 소화할만한 것이 된다.” 로빈.
Chapter 7 서브프로그램. Introduction 서브 프로그램의 명시 형식 인자전달 방법 ▫ Call by value ▫ Call by value result ▫ Call by reference ▫ Call by name 구현 방법 2.
제 4 장 변수, 영역, 수명 변수 바인딩 영역 기억장소 할당과 수명 변수와 그 환경 변수 초기화 상수와 변수.
8장 프로그래밍 언어 8.1 프로그램이란? 8.2 프로그램 언어의 역사 8.3 프로그램 설계 절차
Vision System Lab, Sang-Hun Han
Power C++ 제6장 포인터와 문자열.
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제1장 기초 사항.
C++ Espresso 제2장 제어문과 함수.
9장 부프로그램(2) 순천향대학교 컴퓨터공학부 하 상 호.
제 3장 프로그래밍 언어 설계 3.1 설계 기준의 역사적 변천 3.2 효율성 3.3 일반성, 직교성, 획일성
Chapter 3 – 프로그래밍 언어 설계 Outline 3.1 설계 기준의 역사적 변천 3.2 효율성
Java Presentation 중간 시험2 풀이
강좌명 : C++프로그래밍 (C++ Programming)
제 7 장 문장 구조화 제어문 지정문 조건문 반복문 GOTO 문 비결정적문.
제6장 제어(Control) 6.1 구조적 프로그래밍(Structured Programming)
10장 예외 처리 프로그래밍 언어론 10.6 Pascal과 C의 에러 처리 10.1 설계 주제 10.2 PL/I의 예외 처리
Ruby on Rails – 1. Ruby Aon의 공부하면서 만드는 세미나 1탄.
제 6 장 데이터 타입 6.1 데이터 타입 및 타입 정보 6.2 타입의 용도 6.3 타입 구성자 6.4 사례 연구
Chapter 02 자바 기본구조 자바 프로그래밍의 기초적인 문법을 소개
제7장 제어구조 I – 식과 문장.
바인딩, 메모리 관리 SANGJI University Kwangman Ko
쉽게 풀어쓴 C언어 Express 제9장 함수와 변수 C Express.
프로그래밍언어론 2nd edition Tucker and Noonan
JAVA 프로그래밍 6장 객체지향프로그래밍의 핵심.
Part 08 함수 ©우균, 창병모 이 슬라이드는 부산대학교 우균이 작성하였습니다. 오류나 수정할 사항 있으면 연락 주세요.
제4장 블록 및 유효범위 Reading Chap. 5 © 숙대 창병모.
Chapter 6 – 변수, 바인딩, 식 및 제어문 Outline 6.1 변수 6.2 바인딩 6.3 선언 6.4 배정문
제 1장 프로그래밍 언어 소개 1.1 프로그래밍 언어란 무엇인가 1.2 프로그래밍 언어를 배워야 하는 이유
Chapter 9 – 부 프로그램 Outline 9.1 개요 9.2 매개변수 평가와 전달기법 9.3 형식 매개변수 명세
장. 문법 구조(Syntax) 컴퓨터공학과 권기태 프로그래밍언어론.
3장. 포인터, 배열, 구조체 포인터, 배열, 구조체 학습목표 기본적 데이터 타입
2장 자바환경과 자바 프로그램 2.1 자바 개발 환경 2.2 자바 통합환경 2.3 자바 응용 프로그램과 애플릿 프로그램
윤 홍 란 4 장 클래스 작성 윤 홍 란
18장. 헤더 파일과 구현 파일 01_ 헤더 파일과 구현 파일의 사용.
C ++ 프로그래밍 시작.
Chapter 13 변수 범위.
명품 C++ 프로그래밍 1장. C++ 시작.
5장 이름, 바인딩, 영역(2) 순천향대학교 컴퓨터공학과 하상호.
adopted from KNK C Programming : A Modern Approach
제 10장 부 프로그램 10.1 개요 10.2 매개 변수 평가와 전달 기법 10.3 형식 매개 변수 명세
6장 데이터 타입(2) 순천향대학교 컴퓨터공학부 하 상 호.
자바의 신 Volume 1 1부(1~3장) 자바의 신 메인 홈 : 자바의 신 페이스북: 자바의 신 문제 풀이 :
자전거를 배우려면 안장에 올라가 페달을 밟아라.
알고리즘(Algorithm)  알고리즘 개요 (효율, 분석, 차수) Part 년 봄학기
6장 데이터 타입(2) 순천향대학교 컴퓨터공학부 하 상 호.
함수와 변수 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
프로그래밍 원리 Chapter 04 자료 처리와 연산자 신한대학교 IT융합공학부 박 호 균.
6장 데이터 타입(3) 순천향대학교 컴퓨터공학부 하 상 호.
[INA470] Java Programming Youn-Hee Han
프로그래밍언어론 2nd edition Tucker and Noonan
제 5장 변수, 바인딩, 식 및 제어문 5.1 변수 5.6 표현식 5.2 바인딩 5.7 조건문 5.3 선언 5.8 반복문
Chapter 4 변수 및 바인딩.
C89(C++03) 프로그래밍 (Part 2) 7 배열 8 변수 범위 9 포인터 10 유도 자료형.
9장 부프로그램(2) 순천향대학교 컴퓨터공학부 하 상 호.
Signature, Strong Typing
Signature, Strong Typing
1장 기본적인 사항 순천향대학교 컴퓨터공학부 하 상 호.
세션 (Session) Yang-Sae Moon Department of Computer Science
03. 메모리 관리 C++ 프로그램에서 다룰 수 있는 메모리의 종류
Signature, Strong Typing
Chapter 3 – 프로그래밍 언어 설계 Outline 3.1 설계 기준의 역사적 변천 3.2 효율성
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
제 1장 프로그래밍 언어 소개 1.1 프로그래밍 언어란 무엇인가 1.2 프로그래밍 언어를 배워야 하는 이유
C++ 언어의 특징
프로그래밍 기법 최적화 프로그래밍.
9장 부프로그램 순천향대학교 컴퓨터공학부 하 상 호.
Presentation transcript:

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

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

영역 변수의 영역(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();

정적 영역 변수는 동일한 이름을 갖는 “closer” 변수로 인해서 프로그램 단위로부터 은폐될 수 있다. 은폐된 변수는 조상 영역의 이름을 포함한 선택적 참조(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은 디폴트가 정적이나 동적 영역도 허용 변수에 대한 참조는 현 지점의 실행에 이르게 한 부프로그램의 호출 체인의 역순으로 탐색하면서 선언에 연관

동적 영역 예제 다음 호출 시퀀스를 고려하라. 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#: 동적 바인딩

보고서 #5 (제출기한: 5/4) 5장 연습문제 5장 프로그래밍 연습문제 7, 11 1, 3, 4, 5, 6, 7 위의 문제에 대한 예제 코드를 작성하고, 실행시켜라. 그리고 그 결과를 분석하라.