280 likes | 554 Views
제 7 장 문장. 구조화 제어문 지정문 조건문 반복문 GOTO 문 비결정적문. 7.2 지정문 (Assignment statement). 지정문 (Assignment statement) 변수 내용을 변경시키는 명령형 언어 (imperative language) 의 기본 연산 지정문에 관한 연구 주제 첫 번째 주제는 =, :=, ← 등의 지정문에서 사용되는 심볼의 선택 . 두 번째 주제는 지정문의 평가 순서 와 부작용 (side effect) .
E N D
제 7 장 문장 • 구조화 제어문 • 지정문 • 조건문 • 반복문 • GOTO 문 • 비결정적문
7.2 지정문(Assignment statement) • 지정문(Assignment statement) • 변수 내용을 변경시키는 명령형 언어(imperative language)의 기본 연산 • 지정문에 관한 연구 주제 • 첫 번째 주제는 =, :=, ←등의 지정문에서 사용되는 심볼의 선택. • 두 번째 주제는 지정문의 평가 순서와 부작용(side effect). • 세 번째 주제는 의미 구조(semantics). • 명령형 언어는 지정문을 이용하려 변수의 상태를 변화시킴으로써 기본적인 효과를 달성하는 반면 함수형(적용형) 언어는 함수를 재귀적으로 적용하거나 결합함으로써 기본적인 효과를 달성
r-value l-value 지정문(Assignment statement)(2) • 각종 지정 연산자 • 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
단순 지정문 • 일반적인 구문 • <목적지_변수> <지정_연산자> <식> • Fortran, Basic, PL/I, C, C++, Java에서는 지정 연산자에 대하여 동등 기호(“=“) 사용 • 관계 연산자로 사용될 경우 혼돈을 초래 • 예) PL/l의 지정문 • A = B = C • C, Java처럼 일부 언어들은 동등 연산자를 위해 “==“등을 사용한다. • Agol 60은 지정 연산자로 “:=“을 사용한다. A에 관계식 B = C의 불리안 값을 설정.
SUM과 TOTAL 모두에 0을 지정 If (flag) count1 = 0; else count2 = 0; 과 동일하다. 다중 지정문 • 다중 지정문 • 한 개 이상의 변수에 지정을 허용 • 예) PL/I 에서 SUM , TOTAL = 0 • C, C++, Java에서는 지정 연산자를 여러 번 사용 • 조건 지정문 • C++, Java에서는 지정문에 조건 연산자를 허용 • 예) flag ? count1 : count2 = 0
복합 지정 연산자 • 복합 지정 연산자 (compound assignment operator) • 필요한 형태를 표현하는 축약 방법 • 축약되어 표현 될 수 있는 지정문의 형태 : • 예 ) a = a + b • C에서의 예 sum += value ; • C, C++, Java는 대부분의 이항 연산자에 대해 복합 지정 연산자를 허용 첫 번째 피 연산자로 목적지 변수가 오는 경우 sum = sum + value; 와 동일
단항 지정 연산자 • C , C++, Java - 증가, 감소 연산을 지정과 결합한 단항 지정 연산자를 허용 • 증가 연산을 위한 ++ 연산자와 감소 연산을 위한 -- 연산자 사용 • 전위 연산자 (prefix operator) : • 예) sum = ++ count ; • 후위 연산자 (postfix operator) : • 예) sum = count ++ ; • 단항 연산자와의 우선순위 : 오른쪽에서 왼쪽의 순서 • 예) - count ++; count값을 1만큼 증가 후sum에 지정 count = count +1; sum = count; 와 동일 count값을 sum에 지정한 후count 증가 sum = count; count = count +1; 와 동일 count 증가 후 음수화, 즉 “-(count++)”로 평가된다.
식으로서의 지정문 • C, C++, java에서 지정문은 목적지에 배정된 값과 동일한 결과 생성 지정문은 식 또는 다른 식에 포함된 피연산자로 사용 할 수 있음 • 예) while (( ch = getchar()) != EOF ) { . . . } *Java의 경우 지정 연산자의 우선순위가 관계연산자의 우선 순위보다 낮기 때문에 지정문이 괄호 안에 표현되어야 한다는 것에 유의 • C는 다중 지정문의 효과를 낼 수 있다는 것에 유의 예) sum = count = 0 ; count에 먼저 0을 지정하고 count값이 sum에 지정된다.
혼합형 지정문 • 혼합형 지정문 – 지정문의 양쪽 데이터 형이 서로 다를 때 • Fortran , C, C++은 묵시적 형 변환 규칙을 혼합형 지정문에서 사용한다. • Pascal은 몇 개의 묵시적 형 변환을 허용 • integer는 real에 배정될 수 있다 (역은 허용되지 않는다.). • Ada와 modula-2는 혼합형 지정을 허용하지 않는다. • Java는 요구된 형 변환이 확장 형 변환인 경우에만 혼합형 지정을 허용 • Case 1) 묵시적 형 변환은 우변 식이 평가된 후에 일어난다. • Case 2) 묵시적 형 변환은 우변의 모든 피연산자를 평가하기 전에 일어난다. • 예) int a, b ; float c ; . . . c = a / b ; c가 float형이기 때문에 나눗셈이 이루어지기 전에 a와 b의 값이 float형으로 묵시적 형 변환된다.
7.3 조건문(Conditional Statements) • 조건문 • FORTRAN IF (BCOND) L1 , L2IF (BCOND) <STMT> IF (ACOND) L1 , L2 , L3 GOTO문 요구 판독성 저하
선택문 처리, dangling else 조건문(Conditional Statements)(2) • Dangling else 문제는 if 문의 then 절(clause) 내의 if 문이 어떻게 취급되는가에 관한 문제로, if 보다 else가 더 적을 때 발생 • Algol 60에서는 if c1 then if c2 then A else B이 금지, 다음은 허용 ifc1 then begin ifc2 thenA end elseB • Algol 68에서는 모든 if 는 fi에 의해 종결 ifC1 then ifC2 thenA fi elseB fi • PL/I과 Pascal은 가장 내부의 if와 함께 해석 ifC1 then(ifC2 thenA; elseB;) • 다양한 의미를 위해서 null ELSE 문이 필요 ifC1 thenifC2 thenA; else; elseB; • Fortran 77에서는 dangling else의 해결을 위해 ENDIF 사용
조건문(Conditional Statements)(3) • 중첩 if 문 nested if 문 구조 • if C1then S1 • else if C2then S2 • else if C3then S3 • ................ • else if Cnthen Sn • else Sn+1 • end if • ........ • end if • end if • end if
조건문(Conditional Statements) (4) • 다수의 endif 사용을 줄이고 판독성을 증가시키기 위해 새 구문 형태 도입 예) Algol 68의 elif (최초 시도), Ada의 elsif • Ada의 elsif 사용 예 • if C1then S1 • elsif C2then S2 • elsif C3then S3 • . . . . . . . . . . . • elsif Cnthen Sn • else Sn+1 • end if;
조건문(Conditional Statements) (5) • 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> ... <case label list>:<stmt> end <integer expression > : (1 ~ n) 정수 임의 i 이면 Si실행 < expr >:정수, 불리안, 문자,열거형 도입 <case label list>는 <expr>의 상수
조건문(Conditional Statements) (6) 다음 문장이 정의되었다고 가정 type months = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); var thismonth : months; • Pascal case문 사용 예 case thismonth of Feb, Apr, Jun, Jul, Aug : birthday := 4; Sep : birthday := 1; Jan, Mar, May, Oct, Nov, Dec :birthday := 0; end; • Ada • others절 도입 (변형된 Pascal에서 도입) • 열거형과 부분 범위(range)형 • 예 case thismonth is when Feb|Apr|Jun..Aug ⇒ birthday := 4; when Sep ⇒ birthday := 1; when others ⇒ birthday := 0; endcase;
조건문(Conditional Statements) (7) • case 문 연구 주제 • 레이블을 선택하는 식의 형 • 선택자 식(selector expression)으로 허용된 데이터 형은 무엇인가? (2) 레이블의 형 • case 레이블에 허용되는 데이터 형은 무엇인가? (3) 레이블로의 분기 가능성 • case문의 내부 또는 외부로부터 case 레이블로 분기될 수 있는가? (4) 레이블이 상호 배타적이어야 할 필요성 • 레이블간의 상호 배제를 요구하는가? (5) 레이블 중 하나가 반드시 선택되어야 할 필요성 • 식으로부터 발생되는 모든 경우들을 처리해야 하는가? • Pascal의 경우는 ?(pp. 207-208)
switch (<식>) { case <상수식1> : <문장 1> case <상수식2> : <문장 2> case <상수식n> : <문장 n> default : <문장n+1> } … 조건문(Conditional Statements) (9) • C와 Java에서는 case문이 switch문으로 제공. • C와 Java의 경우는(연구 주제) ?
조건문(Conditional Statements) (10) • switch 문의 번역 • 조건 구조(conditionals)를 이용 if (상수식1 == 식) thenS1 else if(상수식2 == 식) thenS2 ... • case의 범위가 매우 크지 않으면, 각 case에 대해표를 생성 case1loc1 case2loc2 ... casenlocn 여기에서 loci는 casei에 관한 코드의 위치. 코드로의 분기가 빠르게 진행. • 많은 수의 case들을 위해, 각 case에 대한 해쉬 테이블(hash table)이 생성
7.4 반복문(Iterative Statements) • 반복문 • 반복 수행 - 컴퓨터 고안 목적, 프로그래밍 중요 특성, 초기 언어부터 사용 • 종류 ① 가장 간결한 형태는 괄호 사용이지만, • 가독성을 위해 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
① while ( <조건식> ) ③ ②참 ④거짓 < 문장 > 반복문 (2) ② while 문 - 시작 부분에서 반복 조건 검사 (0번 이상 반복 가능) - C 나 Java의 경우 형태) While ( <조건식>) <문장> 실행 순서)
반복문 (3) ③ repeat-until 문 - 마지막 부분에서 반복 조건 검사 (1번 이상 반복 가능) - 형태) repeat <statement> until <bcond> • C와 Java에서 do- while문으로 제공 • 형태) until문과 조건이 반대로 작용한다. do <문장> while (<조건식>)
반복문 (4) ④ FOR 문: 루프 제어 변수 사용 반복문 예) Fortran의 DO문, Pascal, C, Ada, Algol 등의 for 문 • for<변수> := <초기값> to<최종값> step<변위값> do<문> • for 문의 연구 주제 • <변수>가 택할 수 있는 값들의 데이터 형은? • <초기값>, <최종값>, <변위값>에 수식의 허용 여부와 수식 결과의 데이터 형은? • 반복시 <최종값>과 <변위값>은 얼마나 자주 평가되는가? • <변수>와 <최종값>은 언제 비교되나? • <문> 내에서 지정문으로 <변수>가 변경될 수 있나? • 반복문 종료 후 <변수>가 갖는 값은? • 반복문 내외로 제어 이동이 허용되나? • <변수>의 영역(scope)은?
반복문 (5) for <var> :=<init> step <incr> until <final> do <stmt> • Algol 60 (Alogol60 보고서 내용) • <변수>와 <최종값> 먼저 비교 • <초기값>, <최종값>, <변위값(임의 수식)> • 데이터 형 : 실수형, 정수형, 혼합형 연산 허용 • <최종값>, <변위값>은 비교시 매번 재평가 • 보고서의 설명 예 for v := a step b until c do < stmt> v := a L1 : if (v - c) * sign(b) > 0 then goto out ; <stmt> v := v + b goto L1; out : • 반복문 정상 종료시 <변수> 값 정의되지 않음 • < stmt>에서 goto문 탈출시 <변수> 값 유지 • for 문 내부로 제어 이동시 결과 미정의
반복문 (6) 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
반복문 (7) <식1> : 반복 변수의 초기화 식 <식2> : 조건식 <식3> : 제어변수의 값을 수정하는 식 • C와 Java의 for 문 • 형태) • 실행 순서) for (<식1> : <식2> : <식3>) <문장>
반복문 (8) • FORTRAN 90 • 반복문의 형식 DO 루프제어 블록 END DO • 루프제어가 생략되면 무한 반복, 반복에서 벗어나기 위해 반드시 EXIT 문을 이용 • 다른 언어의 for 문과 같은 고정된 횟수의 반복문 DO <레이블> <변수> = <초기값>, <최종값>, <증분값> • <변수>는 단순한 정수 변수. <초기값>은 반복의 초기값을, <최종값>은 마지막값을 지정한다. <최종값>에 도달하면 반복은 끝남. <증분값>은 매 반복시에 <초기값>에 더해질 값으로,생략되면 1의 의미. • <변수>는 반복의 수행동안 변경될 수 없고, <초기값>과 <최종값>은 반복의 시작에서 한 번만 평가된다.
7.5 GOTO 문 • GOTO문의 장단점 • 장점 • GOTO문 제어구조를 하드웨어가 제공 • 소규모의 프로그램에서는 간단하고 이해하기 쉬움 • 어셈블리어나 기존의 언어에 익숙한 사람들에게 친숙한 구조 • GOTO문 제어 구조의 완벽한 범용성 (모든 알고리즘 표현 가능) • 단점 • 계층적인 프로그램(그룹화) 작성이 방해 받아 프로그램 질 저하 유도 • 프로그램의 문장 순서와 실행 순서가 달라져서 판독성 저하(비구조적) • 프로그램 유지보수의 어려움 • goto문의 잔존 여부 : 논란의 대상 • Fortran, Basic의 if문은 goto문임 • pure LISP, Bliss : goto문 사용 금지 • Pascal : 제한적 사용 • goto문 제거 - 다양한 제어문 요구
GOTO 문 (2) • Exit와 Break 문 • 반복문에서 break 문이 사용되면 현재 break 문을 감싸고 있는 반복문의 루프를 빠져 나오게 한다. 만약 반복문이 여러 개 중첩되어 있다면 break 문은 현재 자신을 포함하고 있는 반복문만을 빠져 나오고 반복문 밖의 다음 명령문으로 제어를 이동한다. • continue 문도 continue 문 이후의 모든 명령문을 실행하지 않고 제어를 반복문의 시작 위치로 이동시킨다. 즉, break는 반복문의 블록을 완전히 종료하게 하지만 continue 문은 반복의 시작 위치로 제어를 이동시킨다는 것이다. • Ada의 exit 문은 end-loop 다음의 문으로 제어를 바로 이동하게 된다. 만일 루프에 X란 레이블이 붙으면, 루프내의 임의의 장소에서 exit X; 라고 기술할 수 있다. • Java의 break 문과 continue 문(pp. 220-221) ?