Chapter 6 – 변수, 바인딩, 식 및 제어문 Outline 6.1 변수 6.2 바인딩 6.3 선언 6.4 배정문 6.5 상수 및 변수 초기화 6.6 표현식 6.7 조건문 6.8 반복문 6.9 GOTO 문
<D.W.Barron의 변수정의> 식별자(identifier) : 변수의 한 요소(component) 6.1 변수 (variables) 변수란? 이름, 속성(attribute)의 집합, 참조(reference), 값(value)의 4요소로 구성 변수 (variables) 이름 속성들 값 주소(참조) <D.W.Barron의 변수정의> 식별자(identifier) : 변수의 한 요소(component)
6.1 변수 (variables) 예) X :=3.14159의 의미 x 이름:X 속성 : 원주율, 실수 참조 : 값이 저장된 위치 값 : 3.14159 x 실수 3.14159 위치 이름 속성
6.2 바인딩 바인딩(binding) 개념 기본적인 추상화 메커니즘 – 이름(name) 또는 식별자(identifier) 사용 바인딩이란 ? 이름에 어떤 속성을 연결하는 과정 프로그램의 기본 단위에 이 단위가 택할 수 있는 여러 속성 중에서 일부를 선정하여 결정하는 행위 바인딩 예 constant num5 = 5 ; 이름 num에는 두 개의 속성인 상수와 값 5가 바인딩 int x = 100 ; 이름 x에 변수, 정수 속성과 초기값 100 이 바인딩 x := 2 ; 변수 x에 새로운 속성으로 값 2가 바인딩
6.2 바인딩 바인딩 시간 바인딩 시간의 종류 언어정의시간, 언어 구현시간, 번역시간, 실행 시간 실행 시간 바인딩이 발생되는 시간 바인딩 시간의 종류 언어정의시간, 언어 구현시간, 번역시간, 실행 시간 실행 시간 프로그램 실행 시간에 발생되는 바인딩 동적 바인딩(dynamic binding) 예) 변수 값 배정, 변수에 기억 장소 할당 등 ① 모듈 프로그램 실행 시작 시간에 발생하는 바인딩 예) 형식 매개 변수와 실매개 변수간의 바인딩 지역 변수에 대한 기억 장소 할당 ② 프로그램 실행시 사용 시점에서 수시로 발생하는 바인딩 예) 배정문으로 값을 변수에 저장하는 바인딩 빠른 바인딩 늦은 바인딩
6.2 바인딩 바인딩 시간의 종류 (1 of 2) 번역 시간 언어의 구현 시간 언어를 번역하는 시점에서 발생되는 바인딩 정적 바인딩(static binding) (번역시간 - 컴파일 시간, 링크 시간, 로드 시간) 예) 변수의 형, 자료 구조의 형과 크기, 레코드 항목들의 형을 확정 언어의 구현 시간 언어 정의 시 일부 특성을 한정하지 않고, 언어를 컴퓨터에서 구현할 때 특성의 일부를 확정하는 바인딩 예) 정수의 자릿수, 실수의 유효숫자 개수, 수의 기계 내에서의 표기법
6.2 바인딩 정적 (static) 동적 (dynamic) 번역시간에 속성이 확정될 수 있는 성질 전체 프로그램이 실행되는 동안 유지 동적 (dynamic) 실행시간에야 속성이 확정될 수 있는 성질
6.2 바인딩 바인딩 시간의 종류 (2 of 2) 언어 정의 시간 언어를 정의할 때 확정되는 바인딩 예) 언어 구문 정의(반복문, 허용되는 자료 구조, 연산 종류 등) 혼합형 연산(덧셈, 곱셈)에서 두 피연산자의 형 결정에 관한사항 예 4.1 배정문 Y := X + 10 에서 발생되는 바인딩과 시간 변수 x : 현재값, 자료형, 자료형의 종류 상수 10 : 표현 방법과 의미 연산자 + : 성질과 의미 배정문 := : 성질과 의미
6.2 바인딩 바인딩 시간의 중요성 언어들 간의 중요하고, 미묘한 차이점은 바인딩 시간의 차이에서 발생 예) - 큰 배열에 많은 연산이 포함된 문제는 Fortran이 적당 실행시간에 적은 부분만이 바인딩 (실행시간 효율성) - 배열의 크기나 자료형이 실행시 변화되는 자료형의 처리는 Snobol4가 적당 실행 중 자료가 입력되는 순간에 바인딩 발생(자료 처리의 유연성) 빠른 바인딩은 효율성이 증가하고 늦은 바인딩은 유연성이 증가 바인딩 시간과 언어 구현 정의된 언어는 가능한 한 빠른 바인딩 정의된 언어는 유연성이 확정되었기에 효율성만 증가시킬 수 있기 때문
6.2 바인딩 주요 언어에서 식별자의 바인딩 시간 번역 시간 바인딩 (정적 : static binding) 컴파일 시간 (프로그램 작성 시간 포함) (1) Fortran, Algol, PL/I, Pascal, Cobol 등 컴파일러 언어 : 대부분의 변수형 확정 (2) 상수값의 기계 내부 표현이 확정됨 Linkage edit 시간 (1) Fortran:COMMON 문에 주어진 이름의 상대 주소 확정 (2) Fortran, Algol, PL/I 등: 부프로그램 이름에 관한 상대 주소 확정 적재 시간 (load time) (1) Fortran, Cobol: 모든 변수의 기억 장소 할당 (2) PL/I: 정적 변수로 선언된 변수의 기억 장소 할당 (3) Algol, Pascal: 전역(global) 변수의 기억 장소 할당 (4) Fortran: DATA 문에서 정의된 값을 변수에 배정 실행 시간 (동적 dynamic 호출 시간 (또는 모듈 시작 시간) (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) 모든 프로그래밍 언어: 배정문 등에서 변수값을 배정
6.3 선언 (Declarations) 선언문(Declarations) 디폴트 (default) 자료의 속성 실행 시 사용될 자료의 속성을 언어의 번역기에게 알려주는 프로그램 문장(디폴트 선언 포함) 디폴트 (default) 디폴트 선언 : 묵시적 선언 자료의 속성 자료형, 크기, 이름, 생성 시기, 소멸 시기, 참조하기 위한 첨자 등 예) Javal의 선언문 int [ ]x = new int[10] 생성, 소멸 시기 : 블록 시작과 종료 자료형 : 1차원 배열 원소수 : 10 첨자 범위 : 0 ~ 9 원소 자료형 : 정수 배열 이름 : X
6.3 선언 (Declarations) 선언문의 목적 번역기 동작(정적 형 검사) LOAD X 1) 혼합형 연산 발견 주기억 장치 사용과 접근 방법의 효율성 변수, 배열, 레코드 등의 효율적인 접근 가능 (2) 주기억 장치 경영의 효율성 생성과 소멸 시점을 알므로 스택 기반 기억 장소 할당 등을 수행 가능 (3) 정적 형 검사(static type checking) 가능 형고정 연산(type specific operation) : 하드웨어 제공 혼합형 연산(mixed operation) : 프로그래밍 언어 제공 정적 형 검사로 혼합형 연산을 형 고정 연산으로 변환 효율성 추구 혼합형 연산의 동적 형 검사 유연성 추구 선언문의 예 float Y; int X; ... X + Y 번역기 동작(정적 형 검사) 1) 혼합형 연산 발견 2) X : 실수 형 변환 3) 실수 형 덧셈 코드 생성 LOAD X FLOAT FADD Y
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] 차원수와 자료형 선언 번역시간 : 효율적인 코드 생성 실행시간 : 첨자 범위 결정
6.4 배정문 (Assignment statement) 변수 내용을 변경시키는 기본 연산 각종 배정 연산자 C, Java, Fortran A = B Algol, Pascal A := B APL A B Basic LET A = B Cobol MOVE B TO A l-values와 r-values 배정 연산자의 왼쪽(l-value)과 오른쪽(r-value)을 의미 예) A := B r-value l-value
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가 지적하는위치
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 (* y는 integer 상수로 선언 *) ref ref real z (* 변수 z는 real값이 들어있는 위치에 대한 포인터 *) e.g.) ref int x, y ref ref int z . . . . z := t x := y + z + 15 이 경우 변수 x에 배정된 값은 45 * 수식 계산에서 최종 r-value 값을 구하는 dereferencing은 자동 y 10 t 20 z
6.4 배정문 (Assignment statement) 단순 배정문 일반적인 구문 <목적지_변수> <배정_연산자> <식> Fortran, Basic, PL/I, C, C++, Java 배정 연산자 로 동등기호( = ) 사용 관계 연산자로 = 사용될 경우 혼돈을 초래 예) PL/l의 배정문 C, Java등 일부 언어는 동등 연산자를 위해 “==“을 사용 Algol 60, Pascal 배정 연산자로 := 사용 A에 관계식 B=C의 불리언 값을 설정 A = B= C
6.4 배정문 (Assignment statement) 다중 목적지 배정문 값을 하나 이상의 목적지 변수에 배정을 허용 예) PL/I 에서 cf) C, C++, Java : SUM = TOTAL = 0 조건 목적지 배정문 C++, Java : 배정문에 조건 목적지 허용 예) SUM과 TOTAL 모두에 0을 배정 SUM , TOTAL = 0 if (flag) count1 = 0; else count2 = 0; flag ? count1 : count2 = 0
6.4 배정문 (Assignment statement) 복합 배정 연산자 (compound assignment operator) 배정문에 필요한 형태를 축약하여 표현하는 방법 축약되어 표현 될 수 있는 배정문의 형태 : 예 ) C에서의 예 C, C++, Java는 대부분의 이항 연산자에 복합 배정 연산자를 허용 첫 번째 피 연산자로 목적지 변수가 오는 경우 a = a + b sum = sum + value; 와 동일 sum += value ;
6.4 배정문 (Assignment statement) 단항 배정 연산자 C , C++, Java : 증가, 감소 연산을 배정과 결합한 단항 배정 연산자를 허용 증가 연산을 위한 ++ 연산자 감소 연산을 위한 -- 연산자 전위 연산자 (prefix operator) : 예) 후위 연산자 (postfix operator) : 단항 연산자와의 우선순위 : 오른쪽에서 왼쪽의 순서 count값을 1만큼 증가 후 sum에 배정 count = count +1; sum = count; 와 동일 sum = ++ count ; count값을 sum에 배정한 후 count 증가 sum = count; count = count +1; 와 동일 sum = count ++ ; count 증가 후 음수화, 즉 - (count++)로 평가된다. - count ++ ;
6.4 배정문 (Assignment statement) 식으로서의 배정문 C, C++, java : 배정문이 식 또는 피 연산자 사용 가능 배정문 값은 목적지에 배정된 값과 동일 예) Java의 경우 배정 연산자의 우선순위가 관계연산자의 우선 순위보다 낮기 때문에 배정문이 괄호 안에 표현되어야 한다는 것에 유의 C는 다중 목적지 배정문의 효과를 허용한다는 것에 유의 while (( ch = getchar()) != EOF ) { . . . } count에 먼저 0을 배정하고 count값이 sum에 배정된다. sum = count = 0 ;
6.4 배정문 (Assignment statement) 혼합형 배정문 혼합형 배정문 : 배정문의 양편 자료형이 서로 다를 때 Fortran , C, C++ : 묵시적 형 변환 규칙을 혼합형 배정에 사용 Pascal : 몇 개의 묵시적 형 변환 허용 Integer는 real에 배정될 수 있음 (역은 허용되지 않음) Ada와 modula-2 : 혼합형 배정 불허 Java : 요구된 형 변환이 확장 형 변환인 경우에만 혼합형 배정을 허용 혼합형 배정문을 허용하는 언어에서 묵시적 형 변환은 우변 식이 평가 된 후 발생 다른 방법 : 목적지 형으로 우선 형 변환 후 배정 예 ) c가 float형이기 때문에 나눗셈이 이루어지기 전에 a와 b의 값이 float형으로 묵시적 형 변환된다. int a, b; float c; c = a / b;
5.5 상수 및 변수 초기화 상수(Constant ) 상수 (constant) 프로그램이 실행되는 동안 값이 변하지 않는 식별자 상수 개념 제공 : Pascal, Ada, Java 리터럴(literal)과 구별 상수 (constant) 이름 속성들 유일 값 주소(참조)
6.5 상수 및 변수 초기화 상수 표기법 상수 허용 시 고려사항 ① 단순 변수 또는 구조 변수(record, array) 국제 규격에서 유일 값을 갖는다는 의미는 값을 배정하는 l-value의 사용금지의미 상수는 실질적으로 참조 없이 값 만을 보유 상수 허용 시 고려사항 ① 단순 변수 또는 구조 변수(record, array) ② 상수 값 표현 : 수식 가능 여부 ③ 상수 값 배정 시간 (정적, 동적 배정 가능?) ④ predefined constant 제공 여부 이름 속성들 값
6.5 상수 및 변수 초기화 상수와 초기화의 예 Pascal의 상수 Algol68 const 사용 선언 숫자, 스트링, 열거형 허용 (스칼라 형) 예) const pi = 3.14159; 기정의 상수 : true, false, maxint 등 제공 변수 초기화 제공 안 함 Algol68 배정 연산자와 상수 선언 연산자의 구별(:=, =) real root2 := 1.4142135 변수 선언과 초기화 real root2 = 1.4142135 상수 선언
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 ); 상수 선언
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}} ;
static final float pi = 3.1415926 ; 6.5 상수 및 변수 초기화 Java 예약어로서 const 확보 (사용안함) 기억 장소 속성으로 상수를 선언 예) 변수에 초기값 선언 가능 (C언어와 유사) 예) int I = 100 ; 배열 선언 객체로 취급하므로 생성문 new 사용 요구 static final float pi = 3.1415926 ; 첫 선언 : 정수 배열 ia선언과 생성 두 번째 선언 : new가 없어도 정수 배열 ib 선언 및 생성과 초기값 부여 int [ ] ia = new int [3] ; int ib = { 1, 2, 3 } ;
6.6 표현식 (Expression) {표현}식(Expression) 계산을 기술한 문장 피 연산자(상수, 변수, 함수 등)와 연산자로 구성 (일반적) 참조 투명성 (referential transparency) : 식 평가는 환경 변화 없이 값만을 생성 부작용 (side-effect) 제거가 관건
6.6 표현식 (Expression) 연산자 순위 연산자 순위는 언어에 따라 차이가 남(묵시적 순서) 괄호는 언어 제공의 연산 순위를 변화(명시적 순서) 결합법칙은 동 순위 사이에서 발생되며 일반적으로 left-to-right 언어의 연산 순위는 BNF로 제공하기도 함 식의 연산 순위를 표현하기 위해서는 추상 구문 트리를 사용
6.6 표현식 (Expression) 연산자 순위 몇몇 연산자들의 상대적 우선 순위는 표준화 되어 있음 각종 언어에서 연산자 순위는 다음 표에서와 같이 서로 상이
6.6 표현식 (Expression) Fortran PL/1 ALGOL60 PASCAL ADA ** *, / +, - .EQ., .NE., .LT., .LE., .GT., .GE. .NOT. .AND. .OR. PL/1 **, unary +, unary -, ¬ *, / +, - ∥ =, <=, >=, >, < ¬=, ¬<, ¬> ALGOL60 ↑ ×, /, ÷ +, - <,≤,=, ≥, >, ≠ ¬ ∧ ∨ ⊃ ≡ PASCAL not *, /, div, mod, and +, -, or =, <>, <=, >=, <, > , in ADA ** ×, /, mod, rem +, -, not(unary) +, -, & =, /=, <, <=, >, >= and, or, xor
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> C언어의 식에 대한 EBNF
6.6 표현식 (Expression) C언어에서 한 수식의 parse tree
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 사용
6.7 조건문 (Condition Statements) FORTRAN (조건 분기문 임) IF (BCOND) L1 , L2 ; IF (BCOND) <STMT> IF (ACOND) L1 , L2 , L3 Algol60 if cond then S1 else S2 Fortran 77에서는 dangling else의 해결로 ENDIF 사용 if문 (if statement) GOTO문 요구 판독성 저하 택일문 (조건문) dangling else발생
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 ........
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;
6.7 조건문 (Condition Statements) Case 문 If-then-else를 확장한 택일문 Algol-w(Hoare, Wirth) case <integer expression > of begin S1;S2;. . .;Sn end Pascal case < expr > of <case label list>:<stmt> ... <integer expression > : (1 ~ n) 정수 임의 i 이면 Si 실행 열거형 도입 <case label list>는 <expr>의 상수
6.7 조건문 (Condition Statements) 다음 문장이 정의되었다고 가정 type months = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); var thismonth : months; Pascal case문 사용 예 Ada others절 도입 열거형과 부분범위(range)형 예) case thismonth of Feb, Apr, Jun, Jul, Aug : birthday := 4; Sep : birthday := 1; Jan, Mar, May, Oct, Nov, Dec :birthday := 0; end; case thismonth is when Feb|Apr|Jun..Aug ⇒ birthday := 4; when Sep ⇒ birthday := 1; when others ⇒ birthday := 0; endcase;
6.7 조건문 (Condition Statements) case 문 고려 사항 선택자 수식(selector expression)으로 허용된 자료형은 무엇인가? case 레이블에 허용되는 자료형은 무엇인가? case문의 내부 또는 외부로부터 case 레이블로 분기될 수 있는가? 레이블간의 상호 배제를 요구하는가? 수식으로부터 발생되는 모든 경우들을 처리해야 하는가?
6.7 조건문 (Condition Statements) C와 Java에서는 case문이 switch문으로 제공 switch (<정식>) { case <상식1> : <문장 1> case <상식2> : <문장 2> case <상식n> : <문장 n> default : <문장> }
6.8 반복문 (Iterative Statements) 하나 이상의 문장을 0번 이상 실행시키는 문장 반복 수행 컴퓨터 중요 특성 초기언어부터 사용 반복문의 차이 반복의 제어 방법 반복문 어디에서 구체적인 제어가 수행되는가 반복 방법 사용자 지정 반복 ( loop-repeat, goto, exit, break, continue) 논리 제어 반복 ( while, repeat-until, do-while) 제어 변수반복 ( for, do)
6.8 반복문 (Iterative Statements) 종류 (1 of 4) ① 가장 간결한 형태 (괄호 사용 개념) loop-repeat 문 탈출 방법(조건/무조건 분기문 이용) goto(비구조적) -> exit(제한적 goto) Bliss-10 (다양한 exit 제공) exit, exitblock, exitcase, exitcommand, exitselect, exitloop, exitset 사용 Bliss II (label을 사용하므로써 중첩된 scope을 한번에 탈출 가능) exit<label> : label은 scope 이름 반복문 몸체, 복합문, case 문 등 <loop-repeat예> loop if not <조건> then exit <statement> repeat
6.8 반복문 (Iterative Statements) 종류 (2 of 4) ② while문 시작 부분에서 반복 조건 검사 (0번 이상 반복 가능) C 나 Java의 경우 형태) 실행 순서) while (<조건식>) <문장>
6.8 반복문 (Iterative Statements) 종류 (3 of 4) ③ repeat-until 문 마지막 부분에서 반복조건 검사 (1번 이상 반복 가능) 형태) C와 Java에서는 do- while문으로 제공 repeat <statement> until <bcond> until문과 조건이 반대로 작용한다. do <statement> while (<조건식>)
6.8 반복문 (Iterative Statements) 종류 (4 of 4) ④ 반복 제어 변수 반복문 (화려한 역사를 갖음) 예) Fortran의 DO문, Pascal, C, Ada, Algol 등등의 for문 for 구성자 (for-construct)
6.8 반복문 (Iterative Statements) for 문에서 고려할 점 반복 변수가 택할 수 있는 값들의 자료형은? 초기값, 최종값, 증분값에 수식의 허용여부와 수식 결과의 자료형은? 반복시 최종값과 증분값은 얼마나 자주 평가되는가? 반복 변수와 최종값은 언제 비교되나? 반복문 내에서 배정문으로 반복 변수가 변경될 수 있나? 반복문 종료 후 반복 변수가 갖는 값은? 반복문 내외로 제어 이동이 허용되나? 반복 변수의 영역(scope)은?
6.8 반복문 (Iterative Statements) Algol60 (Alogol60 보고서 내용) 반복 변수와 최종값 먼저 비교 초기값, 최종값, 증분값(임의 수식) 자료형 : 실수형, 정수형, 혼합형 연산 허용 최종값, 증분값은 비교시 매번 재평가 보고서의 설명 예 반복문 정상 종료시 반복 변수 값 정의되지 않음 goto문 탈출시 반복 변수 값 유지 for 문 내부로 제어 이동시 결과 미정의 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 :
6.8 반복문 (Iterative Statements) Pascal 변수의 초기, 최종값은 동일 자료형 (스칼라형, 실수형 제외) 초기, 최종값은 시작 전 한 번만 계산 변수와 최종값 비교 먼저 종료 후 반복 변수의 값 미정의 반복문 변수 열거형 사용 증분값 : to, downto Fortran II의 DO문 (최초의 반복문) DO문 몸체가 적어도 한 번 수행 초기값, 증분값, 최종값 : 정수형 상수나 변수 반복문 수행 후 반복 변수의 값 무언급 Algol 68의 for문 Exp1, Exp2, Exp3 : 정수 수식, 한 번만 평가 (Algol 60은 임의 수식, 매번 평가) 반복 변수 영역 : 몸체부 국한 (Ada도 동일) <Pascal> 의 for문 for <var> :=<init> to <final> do <stmt> 또는 for <var> :=<init> downto <final> do <stmt> <Algol 68> 의 for문 [for <vble>][from <Exp1>][by <Exp2>][to <Exp3>] [while <Exp4>] do <S> od
6.8 반복문 (Iterative Statements) C와 Java의 for문 형태) 실행 순서) <식1> : 반복 변수의 초기화 식 <식2> : 조건식 <식3> : 제어변수의 값을 수정하는 식 for (<식1> : <식2> : <식3>) <문장>
6.9 GOTO 문 goto문 (goto statement) 레이블 (label) 레이블 제어 모든 문장을 지칭 기계어 특성 그대로 표현 (효율적 실행 보장) 사용 편리 (타 제어문 없이 모든 알고리즘 표현 가능) 레이블 (label)
6.9 GOTO 문 레이블 사용에 따른 분류 레이블을 태그로만 사용 (번역 시) 레이블 기계어 코드의 분기 위치로 번역(Fortran, Basic) 레이블을 제한된 자료 항목으로 간주 (레이블 값을 읽거나 계산하지 못함) 레이블 변수, 레이블 배열, 레이블 매개변수, 비지역 레이블 참조 등 Algol(비지역 레이블, 형식 매개변수 참조) 일반 자료 항목으로 간주(Snobol4, APL) … read X ... goto X
6.9 GOTO 문 GOTO문의 장단점 장점 단점 goto문의 잔존 여부 : 논란의 대상 (모든 알고리즘 표현 가능, 타 순서 제어문은 편의 제공일 뿐) 단점 프로그램 질 저하 유도 판독성 저하(비구조적) 프로그램 유지보수의 난해성 goto문의 잔존 여부 : 논란의 대상 Fortran, Basic의 if문은 goto문임 pure LISP, Bliss : goto문 사용 금지 Pascal : 제한적 사용 goto문 제거 - 다양한 순서 제어문 요구 (택일문, 반복문, 되부름 등)
변수 (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요소로 구성되는데, 주소와 자료값들의 관계는 변할 수 있다. <주> 일부 프로그래밍 언어들에서 주소가 변화될 수 있으며, 이에 따라 그 주소와 관련된 자료값도 변할 수 있다. 다른 프로그래밍 언어들에서는, 주소는 고정되어 있으나, 그 주소와 관련된 자료값은 실행 동안 변할 수 있다.
정적 (static) 용어 국제 표준 규격 15.02.14 static (.adj) 정적 (형용사) 용어 국제 표준 규격 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. 전체 프로그램의 실행 동안 그 값이 존재하고 유지되는 객체들의 속성 <예> 한 실행에서 다음 실행 시까지 그 값이 유지하도록 정적으로 선언된 부프로그램 변수
동적 (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. 프로그램의 전체 또는 일부의 실행 동안만 그 값을 설정할 수 있는 자료의 속성 <예> 가변 길이 자료 객체의 길이는 동적이다.
선언문 (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. 하나 이상의 식별자를 프로그램에 도입시켜 이 식별자들이 어떻게 해석되느냐를 명세하는 명시적인 언어 구성자 <예> 데이터형, 저장 조직, 패키지 또는 태스크 선언문 <주> 선언문이 문장으로 간주되는 프로그래밍 언어도 있다.
default (adj.) 디폴트 (형용사) 용어 국제 표준 규격 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까지 중의 한 문자로 시작되는 이름은 정수형 변수를 나타낸다.
배정문 (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. 수식으로 기술된 새로운 자료값으로 변수의 현재 자료값을 바꾸는 단순문
상수 (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요소로 구성된 것.
초기화하다 (to initialize) 용어 국제 표준 규격 15.10.03 To initialize 초기화하다 To give a data value to a data object at the beginning of its lifetime 자료 객체의 수명이 시작될 때 자료 객체에게 자료값을 주는 것
표현식 (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. 하나이상의 피연산자에서 발생되는 결과로서, 자료값의 계산을 정의하는 언어 구성자 <주> 피연산자는 리터럴, 식별자, 함수호출등이 될 수있다.
operator precedence 연산자 순위 용어 국제 표준 규격 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. 식 내에 연산자들의 적용 순서를 정의하는 순서화 규칙 <주> 순서화 규칙은 계산 방향을 서술할 수 있다.
Conditional statement 조건문 용어 국제 표준 규격 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문이 조건문이다.
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. 조건식의 진리값에 따라, 내포된 문장들의 순서를 실행하거나 건너뛰게 하는 조건문
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. 조건식의 진리값에 따라, 많은 선택 가능한 문장들의 순서들 중에서 하나를 실행하도록 선택하는 조건문
Iteration statement, loop statement 반복문 용어 국제 표준 규격 15.05.17 Iteration statement, loop statement 반복문 A compound statement that includes a mechanism to control repeated execution of its enclosed statements. 내포된 문장의 반복실행을 제어하기 위한 기법을 포함하는 복합문
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. 반복제어를 위한 언어구성자로서 통산 반복제어변수를 가지고 수행할 테스트를 정의한다. 또한 반복 구간들 사이에서 수행되는 반복제어변수의 변화에 대한 처리를 정의한다.
label (in programming languages) 레이블 (프로그래밍 언어에서) 용어 국제 표준 규격 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자리수로 구성되며, 그 문장을 참조하는데 사용 될 수 있다.
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. 단순문으로서 실행순서 내의 한 장소에서, 통상 레이블로 식별되는 목적문으로 프로그램 제어를 명시적으로 전이하도록 기술한다. <주> 프로그램 제어의 전송은 분기와 동등할 수 있다.