Document

1
Chapter 6 – 변수, 바인딩, 식 및 제어문
Outline
6.1 변수
6.2 바인딩
6.3 선언
6.4 배정문
6.5 상수 및 변수 초기화
6.6 표현식
6.7 조건문
6.8 반복문
6.9 GOTO 문
.
2
6.1 변수 (variables)
• 변수란?
– 이름, 속성(attribute)의 집합, 참조(reference), 값(value)의 4요소로
구성
주소(참조)
이름
속성들
<D.W.Barron의 변수정의>
•
변수 (variables)
식별자(identifier) : 변수의 한 요소(component)
.
값
3
6.1 변수 (variables)
• 예) X :=3.14159의 의미
– 이름:X
– 속성 : 원주율, 실수
– 참조 : 값이 저장된 위치
– 값 : 3.14159
이름
x
.
속성
위치
실수
3.14159
4
6.2 바인딩
• 바인딩(binding) 개념
– 기본적인 추상화 메커니즘 – 이름(name) 또는 식별자(identifier) 사용
– 바인딩이란 ?
• 이름에 어떤 속성을 연결하는 과정
•
프로그램의 기본 단위에 이 단위가 택할 수 있는 여러 속성 중에서
일부를 선정하여 결정하는 행위
–
바인딩 예
• constant
num5 = 5 ;
이름 num에는 두 개의 속성인 상수와 값 5가 바인딩
• int x = 100 ;
이름 x에 변수, 정수 속성과 초기값 100 이 바인딩
• x := 2 ;
변수 x에 새로운 속성으로 값 2가 바인딩
.
5
6.2 바인딩
•
바인딩 시간
–
•
바인딩이 발생되는 시간
바인딩 시간의 종류
언어정의시간, 언어 구현시간, 번역시간, 실행 시간
빠른 바인딩
•
늦은 바인딩
바인딩 시간의 종류
–
실행 시간
•
프로그램 실행 시간에 발생되는 바인딩
동적 바인딩(dynamic binding)
예) 변수 값 배정, 변수에 기억 장소 할당 등
① 모듈 프로그램 실행 시작 시간에 발생하는 바인딩
예) 형식 매개 변수와 실매개 변수간의 바인딩
지역 변수에 대한 기억 장소 할당
② 프로그램 실행시 사용 시점에서 수시로 발생하는 바인딩
예) 배정문으로 값을 변수에 저장하는 바인딩
.
6
6.2 바인딩
•
바인딩 시간의 종류 (1 of 2)
–
번역 시간
•
언어를 번역하는 시점에서 발생되는 바인딩
정적 바인딩(static binding)
(번역시간 - 컴파일 시간, 링크 시간, 로드 시간)
예) 변수의 형, 자료 구조의 형과 크기, 레코드 항목들의 형을 확정
–
언어의 구현 시간
•
언어 정의 시 일부 특성을 한정하지 않고, 언어를 컴퓨터에서
구현할 때 특성의 일부를 확정하는 바인딩
예) 정수의 자릿수, 실수의 유효숫자 개수, 수의 기계 내에서의 표기법
.
7
6.2 바인딩
• 정적 (static)
– 번역시간에 속성이 확정될 수 있는 성질
– 전체 프로그램이 실행되는 동안 유지
• 동적 (dynamic)
– 실행시간에야 속성이 확정될 수 있는 성질
.
8
6.2 바인딩
• 바인딩 시간의 종류 (2 of 2)
– 언어 정의 시간
• 언어를 정의할 때 확정되는 바인딩
예) 언어 구문 정의(반복문, 허용되는 자료 구조, 연산 종류 등)
혼합형 연산(덧셈, 곱셈)에서 두 피연산자의 형 결정에 관한사항
– 예 4.1 배정문 Y := X + 10 에서 발생되는 바인딩과 시간
변수 x : 현재값, 자료형, 자료형의 종류
상수 10 : 표현 방법과 의미
연산자 + : 성질과 의미
배정문 := : 성질과 의미
.
9
6.2 바인딩
•
바인딩 시간의 중요성
– 언어들 간의 중요하고, 미묘한 차이점은 바인딩 시간의 차이에서 발생
예) - 큰 배열에 많은 연산이 포함된 문제는 Fortran이 적당
실행시간에 적은 부분만이 바인딩 (실행시간 효율성)
- 배열의 크기나 자료형이 실행시 변화되는 자료형의 처리는 Snobol4가 적당
실행 중 자료가 입력되는 순간에 바인딩 발생(자료 처리의 유연성)
–
빠른 바인딩은 효율성이 증가하고 늦은 바인딩은 유연성이 증가
–
바인딩 시간과 언어 구현
정의된 언어는 가능한 한 빠른 바인딩
정의된 언어는 유연성이 확정되었기에 효율성만 증가시킬 수 있기 때문
.
10
6.2 바인딩
•
주요 언어에서 식별자의 바인딩 시간
번역 시간
바인딩
(정적
바인딩
:
static
binding)
실행 시간
바인딩
(동적
바인딩
:
dynamic
binding)
컴파일 시간
(프로그램 작성 시간
포함)
Linkage edit 시간
(1) Fortran, Algol, PL/I, Pascal, Cobol 등 컴파일러 언어
: 대부분의 변수형 확정
(2) 상수값의 기계 내부 표현이 확정됨
(1) Fortran:COMMON 문에 주어진 이름의 상대 주소 확정
(2) Fortran, Algol, PL/I 등: 부프로그램 이름에 관한 상대
주소 확정
적재 시간 (load time)
(1) Fortran, Cobol: 모든 변수의 기억 장소 할당
(2) PL/I: 정적 변수로 선언된 변수의 기억 장소 할당
(3) Algol, Pascal: 전역(global) 변수의 기억 장소 할당
(4) Fortran: DATA 문에서 정의된 값을 변수에 배정
호출 시간
(또는 모듈 시작 시간)
(1) 실매개 변수를 형식 매개 변수에 연결
① by value: 실매개 변수값을 지역 변수에 배정
② by reference: 실매개 변수를 형식매개 변수로 사용할 수 있도록 주소를
배정
③ by name: 사용할 때 주소와 해당 값을 계산할 수 있는
thunk 루틴의 주소 확정
(2) Algol, Pascal: 지역 변수에 대한 기억 장소 할당(활성
레코드가 만들어짐)
(3) PL/I: AUTOMATIC 변수에 대한 기억 장소 할당
실행 시간
사용 시점
(reference)
.
(1) PL/I: BASED 변수 기억장소(ALLOCATE 문, FREE 문)
(2) APL, Lisp, Snobol4: 변수들의 자료형 배정, 기억 장소 할당
(3) 모든 프로그래밍 언어: 배정문 등에서 변수값을 배정
11
6.3 선언 (Declarations)
• 선언문(Declarations)
– 실행 시 사용될 자료의 속성을 언어의 번역기에게 알려주는
프로그램 문장(디폴트 선언 포함)
• 디폴트 (default)
–
디폴트 선언 : 묵시적 선언
• 자료의 속성
– 자료형, 크기, 이름, 생성 시기, 소멸 시기, 참조하기 위한 첨자 등
– 예)
생성, 소멸 시기 : 블록 시작과 종료
• Javal의 선언문
int [ ]x = new int[10]
자료형 : 1차원 배열
원소수 : 10
첨자 범위 : 0 ~ 9
원소 자료형 : 정수
배열 이름 : X
.
12
6.3 선언 (Declarations)
•
선언문의 목적
(1) 주기억 장치 사용과 접근 방법의 효율성
변수, 배열, 레코드 등의 효율적인 접근 가능
(2) 주기억 장치 경영의 효율성
생성과 소멸 시점을 알므로 스택 기반 기억 장소 할당 등을 수행 가능
(3) 정적 형 검사(static type checking) 가능
•
•
•
•
–
형고정 연산(type specific operation) : 하드웨어 제공
혼합형 연산(mixed operation) : 프로그래밍 언어 제공
정적 형 검사로 혼합형 연산을 형 고정 연산으로 변환
혼합형 연산의 동적 형 검사
유연성 추구
효율성 추구
선언문의 예
float Y;
int X;
...
X +Y
번역기 동작(정적 형 검사)
LOAD X
1) 혼합형 연산 발견
FLOAT
2) X : 실수 형 변환
FADD Y
3) 실수 형 덧셈 코드 생성
.
13
6.3 선언 (Declarations)
•
•
•
정적 형 검사 (static type checking)
–
모든 변수의 형 선언 요구
–
단점 : 자료 생성, 소멸, 내용 변경에 많은 제약 존재
–
장점 : 실행 시간 효율이 높음
–
정적 형 검사 언어 : Java, C, Fortran, Algol, Pascal 등 컴파일러 언어
동적 형 검사 (dynamic type checking)
–
선언문 사용 안 함
–
장점 : 프로그래밍 단순화, 유연성(flexibility) 높음
–
단점 : 프로그램 실행 시간 지연, 자료 표현상의 효율 저하, 복잡한 기억 장소 경영 기법 요구
–
동적 형검사 언어 : Lisp, APL, Snobol 4 등 인터프리터 언어
Algol, Java, Ada
–
약간의 효율성을 상실하여 실질적인 큰 유연성을 얻는 선언문 채택
예) 배열 real array x[m1:n1,m2:n2]
차원수와 자료형 선언
번역시간 : 효율적인 코드 생성
실행시간 : 첨자 범위 결정
.
14
6.4 배정문 (Assignment statement)
• 배정문 (Assignment statement)
– 변수 내용을 변경시키는 기본 연산
•
•
각종 배정 연산자
– C, Java, Fortran
A=B
– Algol, Pascal
A := B
– APL
A
– Basic
LET A = B
– Cobol
MOVE B TO
B
A
l-values와 r-values
– 배정 연산자의 왼쪽(l-value)과 오른쪽(r-value)을 의미
– 예) A := B
r-value
l-value
.
15
6.4 배정문 (Assignment statement)
•
l-value와 r-value
–
l-value
•
–
값이 저장되는 위치(주소, 참조)
r-value
•
–
저장되는 값
예)
.
자료형
l-value
r-value
변수
변수의 주소
변수의 값
배열 “A[i]”
i번째 원소 위치
원소 A[i]의 값
상수 “3.5”
없음
값 3.5
포인터 “P”
P가 저장된 위치
P가 지적하는위치
16
6.4 배정문 (Assignment statement)
Bliss
•
변수 이름 : l-value 뿐임
•
r-value는 변수 앞에 점(.) 사용
•
A←B
:
B의 l-value (주소)를 변수 A에 저장, A가 포인터 역할
•
A ← .B + .C :
B, C의 r-value를 더하여 변수 A (A의 l-value)에 저장
Algol 68
•
선언문에서 “ref” 사용하여 l-value 표현
•
e.g.) ref int x
(* 변수 x를 integer 선언 *)
int y
ref ref real z
(* y는 integer 상수로 선언 *)
(* 변수 z는 real값이 들어있는 위치에 대한 포인터 *)
e.g.) ref int x, y
•
ref ref int z
y
....
z := t
10
t
z
20
x := y + z + 15
이 경우 변수 x에 배정된 값은 45
* 수식 계산에서 최종 r-value 값을 구하는 dereferencing은 자동
.
17
6.4 배정문 (Assignment statement)
•
단순 배정문
–
일반적인 구문
<목적지_변수> <배정_연산자> <식>
–
Fortran, Basic, PL/I, C, C++, Java
•
배정 연산자 로 동등기호( = ) 사용
•
관계 연산자로 = 사용될 경우 혼돈을 초래
•
예) PL/l의 배정문
A에 관계식 B=C의 불리언 값을 설정
A = B= C
•
–
C, Java등 일부 언어는 동등 연산자를 위해 “==“을 사용
Algol 60, Pascal
•
배정 연산자로 := 사용
.
18
6.4 배정문 (Assignment statement)
•
다중 목적지 배정문
–
값을 하나 이상의 목적지 변수에 배정을 허용
–
예) PL/I 에서
SUM과 TOTAL 모두에 0을 배정
SUM , TOTAL = 0
–
•
cf) C, C++, Java :
SUM = TOTAL = 0
조건 목적지 배정문
–
C++, Java : 배정문에 조건 목적지 허용
–
예)
flag ? count1 : count2 = 0
if (flag) count1 = 0;
else count2 = 0;
.
19
6.4 배정문 (Assignment statement)
•
복합 배정 연산자 (compound assignment operator)
–
배정문에 필요한 형태를 축약하여 표현하는 방법
–
축약되어 표현 될 수 있는 배정문의 형태 :
–
예)
–
C에서의 예
a=a+b
sum += value ;
–
첫 번째 피 연산자로 목적지 변수가 오는 경우
sum = sum + value; 와 동일
C, C++, Java는 대부분의 이항 연산자에 복합 배정 연산자를 허용
.
20
6.4 배정문 (Assignment statement)
•
단항 배정 연산자
–
C , C++, Java : 증가, 감소 연산을 배정과 결합한
단항 배정 연산자를 허용
–
증가 연산을 위한 ++ 연산자
–
감소 연산을 위한 -- 연산자
–
전위 연산자 (prefix operator) :
예) sum = ++ count ;
–
후위 연산자 (postfix operator) :
예)
–
count값을 1만큼 증가 후 sum에 배정
count = count +1;
sum = count; 와 동일
count값을 sum에 배정한 후 count 증가
sum = count;
sum = count ++ ;
count = count +1; 와 동일
단항 연산자와의 우선순위 : 오른쪽에서 왼쪽의 순서
예)
- count ++ ;
count 증가 후 음수화,
즉 - (count++)로 평가된다.
.
21
6.4 배정문 (Assignment statement)
•
식으로서의 배정문
–
–
–
C, C++, java : 배정문이 식 또는 피 연산자 사용 가능
배정문 값은 목적지에 배정된 값과 동일
예)
*
while (( ch = getchar()) != EOF ) { . . . }
Java의 경우 배정 연산자의 우선순위가 관계연산자의 우선 순위보다
낮기 때문에 배정문이 괄호 안에 표현되어야 한다는 것에 유의
–
C는 다중 목적지 배정문의 효과를 허용한다는 것에 유의
예)
sum = count = 0 ;
.
count에 먼저 0을 배정하고 count값이
sum에 배정된다.
22
6.4 배정문 (Assignment statement)
•
혼합형 배정문
–
혼합형 배정문 : 배정문의 양편 자료형이 서로 다를 때
•
Fortran , C, C++ : 묵시적 형 변환 규칙을 혼합형 배정에 사용
•
Pascal : 몇 개의 묵시적 형 변환 허용
–
–
Integer는 real에 배정될 수 있음 (역은 허용되지 않음)
•
Ada와 modula-2 : 혼합형 배정 불허
•
Java : 요구된 형 변환이 확장 형 변환인 경우에만 혼합형 배정을 허용
혼합형 배정문을 허용하는 언어에서 묵시적 형 변환은
우변 식이 평가 된 후 발생
•
다른 방법 : 목적지 형으로 우선 형 변환 후 배정
•
예)
int a, b;
float c;
c = a / b;
.
c가 float형이기 때문에 나눗셈이
이루어지기 전에 a와 b의 값이 float형으로
묵시적 형 변환된다.
23
5.5 상수 및 변수 초기화
•
상수(Constant )
–
프로그램이 실행되는 동안 값이 변하지 않는 식별자
–
상수 개념 제공 : Pascal, Ada, Java
–
리터럴(literal)과 구별
상수 (constant)
주소(참조)
이름
.
속성들
유일 값
24
6.5 상수 및 변수 초기화
•
상수 표기법
–
국제 규격에서 유일 값을 갖는다는 의미는 값을 배정하는 l-value의 사용금지의미
–
상수는 실질적으로 참조 없이 값 만을 보유
이름
•
속성들
상수 허용 시 고려사항
① 단순 변수 또는 구조 변수(record, array)
② 상수 값 표현 : 수식 가능 여부
③ 상수 값 배정 시간 (정적, 동적 배정 가능?)
④ predefined constant 제공 여부
.
값
25
6.5 상수 및 변수 초기화
•
상수와 초기화의 예
–
Pascal의 상수
•
const 사용 선언
•
숫자, 스트링, 열거형 허용 (스칼라 형)
예) const pi = 3.14159;
–
•
기정의 상수 : true, false, maxint 등 제공
•
변수 초기화 제공 안 함
Algol68
•
배정 연산자와 상수 선언 연산자의 구별(:=, =)
real root2 := 1.4142135
변수 선언과 초기화
real root2 = 1.4142135
상수 선언
.
26
6.5 상수 및 변수 초기화
초기화하다 (to initialize)
–
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 ); 상수 선언
.
27
6.5 상수 및 변수 초기화
–
C
•
•
#define문으로 기호 상수를 선언(초기 C)
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}} ;
.
28
6.5 상수 및 변수 초기화
–
Java
•
예약어로서 const 확보 (사용안함)
•
기억 장소 속성으로 상수를 선언
예)
•
static final float pi = 3.1415926 ;
변수에 초기값 선언 가능 (C언어와 유사)
예) int I = 100 ;
첫 선언 : 정수 배열 ia선언과 생성
두 번째 선언 : new가 없어도 정수 배열 ib
•
선언 및 생성과 초기값 부여
배열 선언
–
객체로 취급하므로 생성문 new 사용 요구
예)
int [ ] ia = new int [3] ;
int ib = { 1, 2, 3 } ;
.
29
6.6 표현식 (Expression)
•
{표현}식(Expression)
–
계산을 기술한 문장
–
피 연산자(상수, 변수, 함수 등)와 연산자로 구성 (일반적)
•참조 투명성 (referential transparency) : 식 평가는 환경 변화 없이 값만을 생성
•부작용 (side-effect) 제거가 관건
.
30
6.6 표현식 (Expression)
•
연산자 순위
–
연산자 순위는 언어에 따라 차이가 남(묵시적 순서)
–
괄호는 언어 제공의 연산 순위를 변화(명시적 순서)
–
결합법칙은 동 순위 사이에서 발생되며 일반적으로 left-to-right
–
언어의 연산 순위는 BNF로 제공하기도 함
–
식의 연산 순위를 표현하기 위해서는 추상 구문 트리를 사용
.
31
6.6 표현식 (Expression)
•
연산자 순위
–
몇몇 연산자들의 상대적 우선 순위는 표준화 되어 있음
–
각종 언어에서 연산자 순위는 다음 표에서와 같이 서로 상이
.
32
6.6 표현식 (Expression)
Fortran
**
*, /
+, .EQ., .NE., .LT., .LE., .GT., .GE.
.NOT.
.AND.
.OR.
PL/1
ALGOL60
**, unary +, unary -, ¬
*, /
+, -
∥
=, <=, >=, >, <
¬=, ¬<, ¬>
↑
×, /, ÷
+, -
<,≤,=, ≥, >, ≠
¬
∧
∨
⊃
≡
PASCAL
ADA
not
*, /, div, mod, and
+, -, or
=, <>, <=, >=, <, > , in
**
×, /, mod, rem
+, -, not(unary)
+, -, &
=, /=, <, <=, >, >=
and, or, xor
.
33
6.6 표현식 (Expression)
C
++, -- (postfix operator), ->, .
&, *, +, -, ~, ! (unary operator), ++, -- (prefix operator)
*, /, %
+, <<, >> (shift 연산자)
<, >, <=, >= (비교 연산자)
==, != (equality operator)
& (and)
^ (exclusive or)
| (inclusive or)
&& (logical and)
|| (logical or)
? (조건 연산자)
=, +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, |= (배정 연산자)
.
<primary-expression> ::= <identifier> | <constant> | <string-literal> | `('expression`)'
<postfix-expression> ::= <primary-expression> | <postfix-expression>`['expression`]' |
<postfix-expression>`('<argument-expression-list>opt`)' |
<postfix-expression>( . | -> )<identifier> | <postfix-expression>( ++ | -- )
<argument-expression-list> :: =`('<assignment-expression>{,<assignment-expression>}`)'
<unary-expression> ::= <postfix-expression> | ( ++ | -- )<unary-expression> |
<unary-operator><cast-expression> | sizeof(<unary-expression> | `('<type-name>`)')
<unary-operator> ::= & | * | + | - | ~ | !
<cast-expression> ::= <unary-expression> | `('<type-name>`)'<cast-expression>
<multiplicative-expression> ::= <cast-expression> |
<multiplicative-expression>( * | / | % )<cast-expression>
<additive-expression> ::= <multiplicative-expression> |
<additive-expression>( + | - )<multiplicative-expression>
<shift-expression> ::= <additive-expression> |
<shift-expression>( << | >> )<additive-expression>
<relational-expression> ::= <shift-expression> |
<relational-expression>( < | > | <= | >= )<shift-expression>
<equality-expression> ::= <relational-expression> |
<equality-expression>( == | != )<relational-expression>
<AND-expression> ::= <equality-expression> | <AND-expression>&<equality-expression>
<exclusive-OR-expression> ::= <AND-expression> |
<exclusive-OR-expression>^<AND-expression>
<inclusive-OR-expression> ::= <exclusive-OR-expression> |
<inclusive-OR-expression>`|'<exclusive-OR-expression>
<logical-AND-expression> ::= <inclusive-OR-expression> |
<logical-AND-expression>&&<inclusive-OR-expression>
<logical-OR-expression> ::= <logical-AND-expression> |
<logical-OR-expression>`|'`|'<logical-AND-expression>
<conditional-expression> ::= <logical-OR-expression> |
<logical-OR-expression>?<expression>:<conditional-expression>
<assignment-expression> ::= <conditional-expression> |
<unary-expression><assignment-operator><assignment-expression>
<assignment-operator> ::= = | *= | /= | %= | += | -= | <<= | >>= | &= | ^= | `|'=
<expression> ::= <assignment-expression> | <expression>,<assignment-expression>
34
C언어의 식에 대한
EBNF
 2004 Y.H. Won, Hongik University.
All rights reserved.
35
6.6 표현식 (Expression)
•
C언어에서 한 수식의 parse tree
.
36
6.6 표현식 (Expression)
•
논리 조건
–
operand1 op operand2 : 적용순서(applicative order)
평가 순서는 operand1, operand2를 계산한 후 연산자 op를 적용
논리 연산에서는 이 적용 순서를 바꿀 수 있는 특성이 있음
•
예)
(1) x = 0 or y / x < 1
(2) x ≠ 0 and y / x < 1
(1)의 경우 : x가 0 이면 무조건 참
(2)의 경우 : x가 0 이면 무조건 거짓
이 두 경우 x 값이 0 일 때 결과가 존재하나,
위의 적용 순서를 따르면 y / x에서 overflow 발생
이 경우에서 or와 and의 뒷부분을 연산하지 않기 위해 새로운 연산자 단회로 도입
–
단회로(short circuit) : 일부 피연산자만으로 부울 수식을 평가하는 기법
x cand y = if x then y else false
x cor y = if x then true else y
•
ADA - and then, or else 사용
.
37
6.7 조건문 (Condition Statements)
•
조건문
–
FORTRAN (조건 분기문 임)
IF (BCOND) L1 , L2
;
IF (BCOND) <STMT>
GOTO문 요구
IF (ACOND) L1 , L2 , L3
–
Algol60
if cond then S1 else S2
판독성 저하
택일문 (조건문)
dangling else발생
Fortran 77에서는 dangling else의 해결로 ENDIF 사용
•
if문 (if statement)
.
38
6.7 조건문 (Condition Statements)
•
중첩 if 개선
표 5.5 nested if문 구조
if C1 then S1
else if C2 then S2
else if C3 then S3
................
else if Cn then Sn
else Sn+1
end if
........
end if
end if
end if
.
39
6.7 조건문 (Condition Statements)
•
다수의 endif 사용을 줄이고 판독성을 증가시키기 위해 새 구문 형태 도입
예) Algol 68의 elif (최초 시도), Ada의 elsif 도입
Ada의 elsif 사용한 표5.5 개선 예
if C1 then S1
elsif C2 then S2
elsif C3 then S3
…..
elsif Cn then Sn
else Sn+1
endif;
.
40
6.7 조건문 (Condition Statements)
•
Case 문
If-then-else를 확장한 택일문
–
Algol-w(Hoare, Wirth)
<integer expression > : (1 ~ n) 정수
case <integer expression > of
임의 i 이면 Si 실행
begin
S1;S2;. . .;Sn
end
–
열거형 도입
Pascal
case < expr > of
<case label list>:<stmt>
...
<case label list>:<stmt>
end
.
<case label list>는 <expr>의 상수
41
6.7 조건문 (Condition Statements)
•
Pascal case문 사용 예
다음 문장이 정의되었다고 가정
type months = (Jan, Feb, Mar, Apr, May,
Jun, Jul, Aug, Sep, Oct, Nov, Dec);
case thismonth of
Feb, Apr, Jun, Jul, Aug : birthday := 4;
var thismonth : months;
Sep : birthday := 1;
Jan, Mar, May, Oct, Nov, Dec :birthday := 0;
end;
•
Ada
–
others절 도입
–
열거형과 부분범위(range)형
–
예)
case thismonth is
when Feb|Apr|Jun..Aug ⇒ birthday := 4;
when Sep ⇒ birthday := 1;
when others ⇒ birthday := 0;
endcase;
.
42
6.7 조건문 (Condition Statements)
•
case 문 고려 사항
1. 선택자 수식(selector expression)으로 허용된 자료형은 무엇인가?
2. case 레이블에 허용되는 자료형은 무엇인가?
3. case문의 내부 또는 외부로부터 case 레이블로 분기될 수 있는가?
4. 레이블간의 상호 배제를 요구하는가?
5. 수식으로부터 발생되는 모든 경우들을 처리해야 하는가?
.
43
6.7 조건문 (Condition Statements)
•
C와 Java에서는 case문이 switch문으로 제공
switch (<정식>) {
case <상식1> : <문장 1>
case <상식2> : <문장 2>
case <상식n> : <문장 n>
default : <문장>
}
.
44
6.8 반복문 (Iterative Statements)
•
반복문
–
–
하나 이상의 문장을 0번 이상 실행시키는 문장
반복 수행
•
•
•
컴퓨터 중요 특성
초기언어부터 사용
반복문의 차이
–
–
–
반복의 제어 방법
반복문 어디에서 구체적인 제어가 수행되는가
반복 방법
•
•
•
사용자 지정 반복 ( loop-repeat, goto, exit, break, continue)
논리 제어 반복 ( while, repeat-until, do-while)
제어 변수반복 ( for, do)
.
45
6.8 반복문 (Iterative Statements)
•
종류 (1 of 4)
① 가장 간결한 형태 (괄호 사용 개념)
•
loop-repeat 문
–
탈출 방법(조건/무조건 분기문 이용)
<loop-repeat예>
loop
goto(비구조적) -> exit(제한적 goto)
–
if not <조건> then exit
<statement>
Bliss-10 (다양한 exit 제공)
exit, exitblock, exitcase, exitcommand,
repeat
exitselect, exitloop, exitset 사용
–
Bliss II (label을 사용하므로써 중첩된 scope을 한번에 탈출 가능)
exit<label> : label은 scope 이름
반복문 몸체, 복합문, case 문 등
.
46
6.8 반복문 (Iterative Statements)
•
종류 (2 of 4)
② while문
–
시작 부분에서 반복 조건 검사 (0번 이상 반복 가능)
–
–
C 나 Java의 경우
형태)
while (<조건식>)
<문장>
–
실행 순서)
1
while (<조건식>)
3
2 <참>
4 거짓
<문장>
.
47
6.8 반복문 (Iterative Statements)
•
종류 (3 of 4)
③ repeat-until 문
–
마지막 부분에서 반복조건 검사 (1번 이상 반복 가능)
형태)
repeat
<statement>
until <bcond>
–
C와 Java에서는 do- while문으로 제공
형태)
until문과 조건이 반대로
do
작용한다.
<statement>
while (<조건식>)
.
48
6.8 반복문 (Iterative Statements)
•
종류 (4 of 4)
④ 반복 제어 변수 반복문 (화려한 역사를 갖음)
예) Fortran의 DO문, Pascal, C, Ada, Algol 등등의 for문
–
for 구성자 (for-construct)
.
49
6.8 반복문 (Iterative Statements)
•
for 문에서 고려할 점
–
반복 변수가 택할 수 있는 값들의 자료형은?
–
초기값, 최종값, 증분값에 수식의 허용여부와 수식 결과의 자료형은?
–
반복시 최종값과 증분값은 얼마나 자주 평가되는가?
–
반복 변수와 최종값은 언제 비교되나?
–
반복문 내에서 배정문으로 반복 변수가 변경될 수 있나?
–
반복문 종료 후 반복 변수가 갖는 값은?
–
반복문 내외로 제어 이동이 허용되나?
–
반복 변수의 영역(scope)은?
.
50
6.8 반복문 (Iterative Statements)
•
Algol60 (Alogol60 보고서 내용)
–
반복 변수와 최종값 먼저 비교
for <var> :=<init> step <incr> until <final>
–
초기값, 최종값, 증분값(임의 수식)
do <stmt>
–
자료형 : 실수형, 정수형, 혼합형 연산 허용
–
최종값, 증분값은 비교시 매번 재평가
–
보고서의 설명 예
a step b until c
v := a
L1 : if (v - c) * sign(b) > 0 then goto exit ;
<statements>
v := v + b
goto L1;
exit :
–
반복문 정상 종료시 반복 변수 값 정의되지 않음
–
goto문 탈출시 반복 변수 값 유지
–
for 문 내부로 제어 이동시 결과 미정의
.
51
6.8 반복문 (Iterative Statements)
•
•
•
Pascal
–
변수의 초기, 최종값은 동일 자료형 (스칼라형, 실수형 제외)
–
초기, 최종값은 시작 전 한 번만 계산
–
변수와 최종값 비교 먼저
–
종료 후 반복 변수의 값 미정의
–
반복문 변수 열거형 사용
–
증분값 : to, downto
<Pascal> 의 for문
for <var> :=<init> to <final> do <stmt>
또는
for <var> :=<init> downto <final> do <stmt>
Fortran II의 DO문 (최초의 반복문)
–
DO문 몸체가 적어도 한 번 수행
–
초기값, 증분값, 최종값 : 정수형 상수나 변수
–
반복문 수행 후 반복 변수의 값 무언급
Algol 68의 for문
–
Exp1, Exp2, Exp3 : 정수 수식, 한 번만 평가
(Algol 60은 임의 수식, 매번 평가)
–
반복 변수 영역 : 몸체부 국한
(Ada도 동일)
.
<Algol 68> 의 for문
[for <vble>][from <Exp1>][by <Exp2>][to <Exp3>]
[while <Exp4>] do <S> od
52
6.8 반복문 (Iterative Statements)
•
C와 Java의 for문
–
<식1> : 반복 변수의 초기화 식
형태)
<식2> : 조건식
for (<식1> : <식2> : <식3>)
<식3> : 제어변수의 값을 수정하는 식
<문장>
–
실행 순서)
1
2
5
for (<식1> ; <식2> ; <식3>
6 거짓
3참
<문장>
.
4
53
6.9 GOTO 문
•
goto문 (goto statement)
–
레이블 제어 모든 문장을 지칭
–
–
기계어 특성 그대로 표현 (효율적 실행 보장)
사용 편리 (타 제어문 없이 모든 알고리즘 표현 가능)
•
goto문 (goto statement)
•
레이블 (label)
.
54
6.9 GOTO 문
•
레이블 사용에 따른 분류
1)
레이블을 태그로만 사용 (번역 시)
레이블
2)
3)
기계어 코드의 분기 위치로 번역(Fortran, Basic)
레이블을 제한된 자료 항목으로 간주 (레이블 값을 읽거나 계산하지 못함)
•
레이블 변수, 레이블 배열, 레이블 매개변수, 비지역 레이블 참조 등
•
Algol(비지역 레이블, 형식 매개변수 참조)
일반 자료 항목으로 간주(Snobol4, APL)
…
read X
...
goto X
...
.
55
6.9 GOTO 문
•
GOTO문의 장단점
– 장점
• GOTO문 제어구조를 하드웨어가 제공
• GOTO문 제어구조의 완벽한 범용성
• (모든 알고리즘 표현 가능, 타 순서 제어문은 편의 제공일 뿐)
– 단점
• 프로그램 질 저하 유도
• 판독성 저하(비구조적)
• 프로그램 유지보수의 난해성
– goto문의 잔존 여부 : 논란의 대상
– Fortran, Basic의 if문은 goto문임
– pure LISP, Bliss : goto문 사용 금지
– Pascal : 제한적 사용
– goto문 제거 - 다양한 순서 제어문 요구 (택일문, 반복문, 되부름 등)
.
56
변수 (variables)
용어 국제 표준 규격 15.03.03
Variable
변수
A quadruple, established by a declaration or an implicit declaration,
that consists of an identifier, a set of attributes, one or more
addresses, and data values, where the relationship between the
addresses and the data values may vary.
<NOTE> In some programming languages, the addresses may vary, hence the associated
data values may vary. In other programming languages, the addresses remain
fixed, but the associated data values may change during execution.
선언문 또는 묵시적 선언으로 생성되며, 식별자, 자료 속성들의 집합, 하나
이상의 주소, 그리고 자료값들의 4요소로 구성되는데, 주소와 자료값들의
관계는 변할 수 있다.
<주> 일부 프로그래밍 언어들에서 주소가 변화될 수 있으며, 이에 따라 그 주소와 관련된
자료값도 변할 수 있다. 다른 프로그래밍 언어들에서는, 주소는 고정되어 있으나, 그
주소와 관련된 자료값은 실행 동안 변할 수 있다.
 2004 Y.H. Won, Hongik University. All rights reserved.
57
정적 (static)
용어 국제 표준 규격 15.02.14
static (.adj)
정적 (형용사)
Pertaining to objects that exist and retain their values throughout the
execution of the entire program.
<Example> A subprogram * variable that has been declared static to retain its values from
one execution to the next.
전체 프로그램의 실행 동안 그 값이 존재하고 유지되는 객체들의 속성
<예> 한 실행에서 다음 실행 시까지 그 값이 유지하도록 정적으로 선언된 부프로그램 변수
 2004 Y.H. Won, Hongik University. All rights reserved.
58
동적 (dynamic)
용어 국제 표준 규격 15.02.15
dynamic
동적
Pertaining to a data attribute, whose values can only be established
during the execution of all or part of a program.
<Example> The length of a variable-length data object is dynamic.
프로그램의 전체 또는 일부의 실행 동안만 그 값을 설정할 수 있는 자료의
속성
<예> 가변 길이 자료 객체의 길이는 동적이다.
 2004 Y.H. Won, Hongik University. All rights reserved.
59
선언문 (declaration)
용어 국제 표준 규격 15.02.01
declaration
선언[문]
An explicit language construct that introduces one or more identifiers
into a program and specifies how these identifiers are to be
interpreted.
<Example>Declarations of data types, storage organization, packages, or tasks.
<NOTE> In some programming languages, declarations are considered to be statements.
하나 이상의 식별자를 프로그램에 도입시켜 이 식별자들이 어떻게
해석되느냐를 명세하는 명시적인 언어 구성자
<예> 데이터형, 저장 조직, 패키지 또는 태스크 선언문
<주> 선언문이 문장으로 간주되는 프로그래밍 언어도 있다.
 2004 Y.H. Won, Hongik University. All rights reserved.
60
디폴트 (default)
용어 국제 표준 규격 15.02.03
default (adj.)
디폴트 (형용사)
Pertaining to an attribute, data value, or option that is assumed when
none is explicitly specified.
<Example> In Fortran, the default naming convention specifies that names beginning with
one of the letters I through N denote variables of integer type.
속성이나 데이터, 또는 선택에 대해, 명시적으로 어떤 값도 지정되지
않았을 때에 갖게 되는 것
<예> Fortran에서 디폴트로 명명하는 규약에 따르면, I에서 N까지 중의 한 문자로 시작되는
이름은 정수형 변수를 나타낸다.
 2004 Y.H. Won, Hongik University. All rights reserved.
61
배정문 (assignment statement)
용어 국제 표준 규격 15.05.04
assignment statement
assignment
배정문
배정
A simple statement that replaces the current data value of a variable
with a new data value specified by an expression.
수식으로 기술된 새로운 자료값으로 변수의 현재 자료값을 바꾸는 단순문
 2004 Y.H. Won, Hongik University. All rights reserved.
62
상수 (constant)
용어 국제 표준 규격 15.03.05
Constant
상수
A quadruple, established by a declaration or an implicit declaration,
that consists of an identifier, a set of data attributes, one or more
addresses, and only one data value.
선언문 또는 묵시적 선언으로 생성되며, 식별자, 자료 속성들의 집합, 하나
이상의 주소, 그리고 오직 한 개의 자료값의 4요소로 구성된 것.
 2004 Y.H. Won, Hongik University. All rights reserved.
63
초기화하다 (to initialize)
용어 국제 표준 규격 15.10.03
To initialize
초기화하다
To give a data value to a data object at the beginning of its lifetime
자료 객체의 수명이 시작될 때 자료 객체에게 자료값을 주는 것
 2004 Y.H. Won, Hongik University. All rights reserved.
64
표현식 (expression)
용어 국제 표준 규격 15.05.33
Expression
표현식
A language construct that defines the computation of a data value as
a result from one or more operands.
<NOTE> Operands may be literals, identifiers, * function calls.
하나이상의 피연산자에서 발생되는 결과로서, 자료값의 계산을 정의하는
언어 구성자
<주> 피연산자는 리터럴, 식별자, 함수호출등이 될 수있다.
 2004 Y.H. Won, Hongik University. All rights reserved.
65
연산자 순위
용어 국제 표준 규격 15.05.36
operator precedence
연산자 순위
An ordering rule defining the sequence of the application of operators
within an expression.
<NOTE> The ordering rule may specify the evaluation direction.
식 내에 연산자들의 적용 순서를 정의하는 순서화 규칙
<주> 순서화 규칙은 계산 방향을 서술할 수 있다.
 2004 Y.H. Won, Hongik University. All rights reserved.
66
조건문
용어 국제 표준 규격 15.05.13
Conditional statement
조건문
A compound statement that selects for execution one or none of the
enclosed sequences of statements depending on the value of a
conditional expression of one or more corresponding conditions.
<Examples> In Pascal, if statements and case statements are conditional
statements.
일치하는 하나 이상의 조건으로 이루어진 조건식의 값에 따라, 내포된
문장들의 실행 순서 0개 또는 1개를 실행하도록 선택할 수 있는 복합문
<예> Pascal에서 if문과 case문이 조건문이다.
 2004 Y.H. Won, Hongik University. All rights reserved.
67
if 문 (if statement)
용어 국제 표준 규격 15.05.15
if statement
if문
A conditional statement that causes execution of the enclosed
sequences of statements or skips them depending on the truth value of
the conditional expression.
조건식의 진리값에 따라, 내포된 문장들의 순서를 실행하거나 건너뛰게
하는 조건문
 2004 Y.H. Won, Hongik University. All rights reserved.
68
case 문
용어 국제 표준 규격 15.05.16
case statement
case문
A conditional statement that selects for execution one of a number of
alternative sequences of statements depending on the value of a
conditional expression.
조건식의 진리값에 따라, 많은 선택 가능한 문장들의 순서들 중에서 하나를
실행하도록 선택하는 조건문
 2004 Y.H. Won, Hongik University. All rights reserved.
69
반복문
용어 국제 표준 규격 15.05.17
Iteration statement, loop statement
반복문
A compound statement that includes a mechanism to control repeated
execution of its enclosed statements.
내포된 문장의 반복실행을 제어하기 위한 기법을 포함하는 복합문
 2004 Y.H. Won, Hongik University. All rights reserved.
70
for 구성자 (for construct)
용어 국제 표준 규격 15.05.20
for-construct
for-구성자
A language construct for iteration control that defines the test to be
performed for such control, usually based on a loop-control variable,
and the prescription for the changes of that iteration control variable to
be carried out between iteration steps.
반복제어를 위한 언어구성자로서 통산 반복제어변수를 가지고 수행할
테스트를 정의한다. 또한 반복 구간들 사이에서 수행되는 반복제어변수의
변화에 대한 처리를 정의한다.
 2004 Y.H. Won, Hongik University. All rights reserved.
71
레이블 (label)
용어 국제 표준 규격 15.01.10
label (in programming languages)
레이블 (프로그래밍 언어에서)
An identifier for a location in a program.
<NOTE> 1. A Label is frequently used to refer to a statement.
2. In BASIC, a line number can serve as a label, but is not always the target of a
transfer.
3. In Fortran, a label, consisting of up to five digits, that precedes a statement,
may be used to refer to the statement.
프로그램 내의 위치를 나타내는 식별자
<주> 1.레이블은 어떤 문장을 참조하는데 자주 사용된다.
2.Basic에서 줄 번호가 레이블로 사용될 수 있으나, 항상 전이의 목표가 되지는 않는다.
3.Fortran에서 레이블은 문장 앞에 선행되는 최대 5자리수로 구성되며, 그 문장을
참조하는데 사용 될 수 있다.
 2004 Y.H. Won, Hongik University. All rights reserved.
72
goto 문 (goto statement)
용어 국제 표준 규격 15.05.11
goto statement
goto문
A simple statement that specifies an explicit transfer of program control for its place in the
execution sequence to a target statement that usually is identified by a label.
<NOTE> The transfer of program control may be equivalent to a jump.
단순문으로서 실행순서 내의 한 장소에서, 통상 레이블로 식별되는 목적문으로
프로그램 제어를 명시적으로 전이하도록 기술한다.
<주> 프로그램 제어의 전송은 분기와 동등할 수 있다.
 2004 Y.H. Won, Hongik University. All rights reserved.