제 7 장 문장

28
1 프프프프프 프프프 제 7 제 제제 구구구 구구구 • 구구구 • 구구구 • 구구구 • GOTO 구 • 구구구구구

Upload: sani

Post on 21-Jan-2016

65 views

Category:

Documents


0 download

DESCRIPTION

제 7 장 문장. 구조화 제어문 지정문 조건문 반복문 GOTO 문 비결정적문. 7.2 지정문 (Assignment statement). 지정문 (Assignment statement) 변수 내용을 변경시키는 명령형 언어 (imperative language) 의 기본 연산 지정문에 관한 연구 주제 첫 번째 주제는 =, :=, ← 등의 지정문에서 사용되는 심볼의 선택 . 두 번째 주제는 지정문의 평가 순서 와 부작용 (side effect) . - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 제  7  장  문장

1

프로그래밍 언어론

제 7 장

문장• 구조화 제어문• 지정문• 조건문• 반복문• GOTO 문• 비결정적문

Page 2: 제  7  장  문장

2

7.2 지정문 (Assignment statement)

지정문 (Assignment statement)-변수 내용을 변경시키는 명령형 언어 (imperative language) 의 기본 연산

지정문에 관한 연구 주제

첫 번째 주제는 =, :=, ← 등의 지정문에서 사용되는 심볼의 선택 . 두 번째 주제는 지정문의 평가 순서와 부작용 (side effect). 세 번째 주제는 의미 구조 (semantics).

- 명령형 언어는 지정문을 이용하려 변수의 상태를 변화시킴으로써 기본적인 효과를 달성하는 반면 함수형 ( 적용형 ) 언어는 함수를 재귀적으로 적용하거나 결합함으로써 기본적인 효과를 달성

Page 3: 제  7  장  문장

3

지정문 (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

l-value

r-value

Page 4: 제  7  장  문장

4

단순 지정문

• 일반적인 구문-< 목적지 _ 변수 > < 지정 _ 연산자 > < 식 >

• Fortran, Basic, PL/I, C, C++, Java 에서는 지정 연산자에 대하여 동등 기호 (“=“) 사용 관계 연산자로 사용될 경우 혼돈을 초래

• 예 ) PL/l 의 지정문 A = B = C

• C, Java 처럼 일부 언어들은 동등 연산자를 위해 “ ==“ 등을 사용한다 .

• Agol 60 은 지정 연산자로 “ :=“ 을 사용한다 .

A 에 관계식 B = C 의 불리안 값을 설정 .

A 에 관계식 B = C 의 불리안 값을 설정 .

Page 5: 제  7  장  문장

5

다중 지정문 • 한 개 이상의 변수에 지정을 허용• 예 ) PL/I 에서

SUM , TOTAL = 0

• C, C++, Java 에서는 지정 연산자를 여러 번 사용

조건 지정문 • C++, Java 에서는 지정문에 조건 연산자를 허용• 예 )

flag ? count1 : count2 = 0

다중 지정문

SUM 과 TOTAL 모두에 0 을 지정

SUM 과 TOTAL 모두에 0 을 지정

If (flag) count1 = 0;else count2 = 0; 과 동일하다 .

If (flag) count1 = 0;else count2 = 0; 과 동일하다 .

Page 6: 제  7  장  문장

6

복합 지정 연산자

복합 지정 연산자 (compound assignment operator)• 필요한 형태를 표현하는 축약 방법• 축약되어 표현 될 수 있는 지정문의 형태 :

• 예 ) a = a + b

• C 에서의 예 sum += value ;

• C, C++, Java 는 대부분의 이항 연산자에 대해 복합 지정 연산자를 허용

첫 번째 피 연산자로 목적지 변수가 오는 경우첫 번째 피 연산자로 목적지 변수가 오는 경우

sum = sum + value; 와 동일sum = sum + value; 와 동일

Page 7: 제  7  장  문장

7

단항 지정 연산자

C , C++, Java - 증가 , 감소 연산을 지정과 결합한 단항 지정 연산자를 허용

증가 연산을 위한 ++ 연산자와 감소 연산을 위한 -- 연산자 사용

전위 연산자 (prefix operator) :• 예 )

sum = ++ count ;

후위 연산자 (postfix operator) :• 예 )

sum = count ++ ;

단항 연산자와의 우선순위 : 오른쪽에서 왼쪽의 순서

• 예 ) - count ++;

count 값을 1 만큼 증가 후 sum 에 지정count = count +1;sum = count; 와 동일

count 값을 1 만큼 증가 후 sum 에 지정count = count +1;sum = count; 와 동일

count 값을 sum 에 지정한 후 count 증가sum = count; count = count +1; 와 동일

count 값을 sum 에 지정한 후 count 증가sum = count; count = count +1; 와 동일

count 증가 후 음수화 , 즉 “ -(count++)” 로 평가된다.

count 증가 후 음수화 , 즉 “ -(count++)” 로 평가된다.

Page 8: 제  7  장  문장

8

식으로서의 지정문

C, C++, java 에서 지정문은 목적지에 배정된 값과 동일한 결과 생성 지정문은 식 또는 다른 식에 포함된 피연산자로 사용 할 수

있음 • 예 )

while (( ch = getchar()) != EOF ) { . . . }

*Java 의 경우 지정 연산자의 우선순위가 관계연산자의 우선 순위보다 낮기 때문에 지정문이 괄호 안에 표현되어야 한다는 것에 유의

• C 는 다중 지정문의 효과를 낼 수 있다는 것에 유의

예 ) sum = count = 0 ; count 에 먼저 0 을 지정하고 count 값이 sum 에 지정된다.

count 에 먼저 0 을 지정하고 count 값이 sum 에 지정된다.

Page 9: 제  7  장  문장

9

혼합형 지정문

혼합형 지정문 – 지정문의 양쪽 데이터 형이 서로 다를 때 • 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 형으로 묵시적 형 변환된다 .

c 가 float 형이기 때문에 나눗셈이 이루어지기 전에 a 와 b 의 값이 float 형으로 묵시적 형 변환된다 .

Page 10: 제  7  장  문장

10

7.3 조건문 (Conditional Statements)

조건문

• FORTRANIF (BCOND) L1 , L2 IF (BCOND) <STMT>IF (ACOND) L1 , L2 , L3

GOTO 문 요구 판독성 저하

GOTO 문 요구 판독성 저하

Page 11: 제  7  장  문장

11

조건문 (Conditional Statements)(2)

• Dangling else 문제는 if 문의 then 절 (clause) 내의 if 문이 어떻게 취급되는가에 관한 문제로 , if 보다 else 가 더 적을 때 발생

• Algol 60 에서는 if c1 then if c2 then A else B 이 금지 , 다음은 허용if c1 then begin if c2 then A end else B

• Algol 68 에서는 모든 if 는 fi 에 의해 종결if C1 then if C2 then A fi else B fi

• PL/I 과 Pascal 은 가장 내부의 if 와 함께 해석 if C1 then (if C2 then A; else B;) 다양한 의미를 위해서 null ELSE 문이 필요

if C1 then if C2 then A; else; else B;

• Fortran 77 에서는 dangling else 의 해결을 위해 ENDIF 사용

선택문 처리 , dangling else

선택문 처리 , dangling else

Page 12: 제  7  장  문장

12

조건문 (Conditional Statements)(3)

• 중첩 if 문

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

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

Page 13: 제  7  장  문장

13

조건문 (Conditional Statements) (4)

• 다수의 endif 사용을 줄이고 판독성을 증가시키기 위해 새 구문 형태 도입

예 ) Algol 68 의 elif ( 최초 시도 ), Ada 의 elsif

• Ada 의 elsif 사용 예

elsif C2 then S2

elsif C3 then S3

. . . . . . . . . . . elsif Cn then Sn

else Sn+1

end if ;

elsif C2 then S2

elsif C3 then S3

. . . . . . . . . . . elsif Cn then Sn

else Sn+1

end if ;

Page 14: 제  7  장  문장

14

조건문 (Conditional Statements) (5)

CASE 문- if-then-else 를 확장한 선택문

• Algol-w (Hoare, Wirth)case <integer expression > ofbegin S1 ; S2 ; . . . ; Sn

end

• Pascalcase < expr > of <case label list> : <stmt> ... <case label list> : <stmt>end

<integer expression > : (1 ~ n) 정수 임의 i 이면 Si 실행

< expr >: 정수 , 불리안 , 문자 , 열거형 도입<case label list> 는 <expr> 의 상수

Page 15: 제  7  장  문장

15

조건문 (Conditional Statements) (6)

• 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;

다음 문장이 정의되었다고 가정 type months = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); var thismonth : months;

다음 문장이 정의되었다고 가정 type months = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); var thismonth : months;

Page 16: 제  7  장  문장

16

조건문 (Conditional Statements) (7)

case 문 연구 주제

(1) 레이블을 선택하는 식의 형 선택자 식 (selector expression) 으로 허용된 데이터 형은 무엇인가 ?

(2) 레이블의 형 case 레이블에 허용되는 데이터 형은 무엇인가 ?

(3) 레이블로의 분기 가능성 case 문의 내부 또는 외부로부터 case 레이블로 분기될 수 있는가 ?

(4) 레이블이 상호 배타적이어야 할 필요성 레이블간의 상호 배제를 요구하는가 ?

(5) 레이블 중 하나가 반드시 선택되어야 할 필요성 식으로부터 발생되는 모든 경우들을 처리해야 하는가 ?

Pascal 의 경우는 ?(pp. 207-208)

Page 17: 제  7  장  문장

17

조건문 (Conditional Statements) (9)

C 와 Java 에서는 case 문이 switch 문으로 제공 .

C 와 Java 의 경우는 ( 연구 주제 ) ?

switch (< 식 >) { case < 상수식 1> : < 문장 1> case < 상수식 2> : < 문장 2>

case < 상수식 n> : < 문장 n> default : < 문장 n+1> }

switch (< 식 >) { case < 상수식 1> : < 문장 1> case < 상수식 2> : < 문장 2>

case < 상수식 n> : < 문장 n> default : < 문장 n+1> }

Page 18: 제  7  장  문장

18

조건문 (Conditional Statements) (10)

switch 문의 번역

• 조건 구조 (conditionals) 를 이용

if ( 상수식 1 == 식 ) then S1 else if ( 상수식 2 == 식 ) then S2 ...

• case 의 범위가 매우 크지 않으면 , 각 case 에 대해 표를 생성

case1 loc1

case2 loc2

... casen locn

여기에서 loci 는 casei 에 관한 코드의 위치 . 코드로의 분기가 빠르게 진행 .

• 많은 수의 case 들을 위해 , 각 case 에 대한 해쉬 테이블 (hash table) 이 생성

Page 19: 제  7  장  문장

19

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

<loop-repeat 예 >

loop if not < 조건 > then exit <statement>repeat

Page 20: 제  7  장  문장

20

반복문 (2)

② while 문 - 시작 부분에서 반복 조건 검사 (0 번 이상 반복 가능 )

- C 나 Java 의 경우 형태 )

While ( < 조건식 >)< 문장 >

While ( < 조건식 >)< 문장 >

실행 순서 )

while ( < 조건식 > )

< 문장 >

② 참

④ 거짓

Page 21: 제  7  장  문장

21

반복문 (3)

③ repeat-until 문 - 마지막 부분에서 반복 조건 검사 (1 번 이상 반복 가능 )

- 형태 )

repeat <statement> until <bcond>

repeat <statement> until <bcond>

-C 와 Java 에서 do- while 문으로 제공-형태 )

do <문장 > while (<조건식 >)

do <문장 > while (<조건식 >)

until 문과 조건이 반대로 작용한다 .

until 문과 조건이 반대로 작용한다 .

Page 22: 제  7  장  문장

22

반복문 (4)

④ FOR 문 : 루프 제어 변수 사용 반복문

예 ) Fortran 의 DO 문 , Pascal, C, Ada, Algol 등의 for 문

• for <변수> := <초기값> to <최종값> step <변위값> do <문>

• for 문의 연구 주제

– < 변수 > 가 택할 수 있는 값들의 데이터 형은 ?– < 초기값 >, < 최종값 >, < 변위값 > 에 수식의 허용 여부와 수식 결과의 데이터

형은 ?

– 반복시 < 최종값 > 과 < 변위값 > 은 얼마나 자주 평가되는가 ?

– < 변수 > 와 < 최종값 > 은 언제 비교되나 ?

– < 문 > 내에서 지정문으로 < 변수 > 가 변경될 수 있나 ?

– 반복문 종료 후 < 변수 > 가 갖는 값은 ?

– 반복문 내외로 제어 이동이 허용되나 ?

– < 변수 > 의 영역 (scope) 은 ?

Page 23: 제  7  장  문장

23

반복문 (5)

• 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 문 내부로 제어 이동시 결과 미정의

for <var> :=<init> step <incr> until <final>

do <stmt>

for <var> :=<init> step <incr> until <final>

do <stmt>

Page 24: 제  7  장  문장

24

반복문 (6)Pascal– < 변수 > 의 < 초기값 >, < 최종값 > 은 동일 데이터 형 (스칼라형 , 실수형 제외 )– < 초기값 >, < 최종값 > 은 시작전 한번만 계산– < 변수 > 와 < 최종값 > 비교 먼저– 종료후 < 변수 > 의 값 미정의– 반복문 < 변수 > 열거형 사용– < 변위값 > : to, downto

Fortran II 의 DO 문 ( 최초의 반복문 )– DO 문 몸체가 적어도 한번 수행– < 초기값 >, < 변위값 >, < 최종값 > : 정수형 상수나 변수– 반복문 수행 후 < 변수 > 의 값 언급 없음

Algol 68 의 for 문

– Exp1, Exp2, Exp3 : 정수 수식 , 한 번만 평가 (Algol 60 은 임의 수식 , 매번 평가 )

– < 변수 > 영역 : 몸체부 국한 (Ada 도 동일 )

for <var> :=<init> to <final> do <stmt>

또는for <var> :=<init> downto <final> do <stmt>

for <var> :=<init> to <final> do <stmt>

또는for <var> :=<init> downto <final> do <stmt>

Pascal 의 for 문 구문

[ for <vble> ][ from <Exp1>][ by <Exp2>][ to <Exp3>]

[while <Exp4>] do <S> od

[ for <vble> ][ from <Exp1>][ by <Exp2>][ to <Exp3>]

[while <Exp4>] do <S> od

Algol 68 의 for 문 구문

Page 25: 제  7  장  문장

25

반복문 (7)

C 와 Java 의 for 문• 형태 )

• 실행 순서 )

for (< 식 1> : < 식 2> : < 식 3>)< 문장 >

for (< 식 1> : < 식 2> : < 식 3>)< 문장 >

for ( <식1> ; <식2> ; <식3> )

③참

⑥거짓< 문장>

① ② ⑤

for ( <식1> ; <식2> ; <식3> )

③참

⑥거짓< 문장>

① ② ⑤

< 식 1> : 반복 변수의 초기화 식< 식 2> : 조건식< 식 3> : 제어변수의 값을 수정하는 식

< 식 1> : 반복 변수의 초기화 식< 식 2> : 조건식< 식 3> : 제어변수의 값을 수정하는 식

Page 26: 제  7  장  문장

26

반복문 (8)

FORTRAN 90

• 반복문의 형식 DO 루프제어 블록 END DO

• 루프제어가 생략되면 무한 반복 , 반복에서 벗어나기 위해 반드시 EXIT 문을 이용

• 다른 언어의 for 문과 같은 고정된 횟수의 반복문

DO <레이블 > <변수 > = <초기값 >, <최종값 >, <증분값 >

• < 변수 > 는 단순한 정수 변수 . < 초기값 > 은 반복의 초기값을 , < 최종값 > 은 마지막값을 지정한다 . < 최종값 > 에 도달하면 반복은 끝남 . < 증분값 > 은 매 반복시에 <초기값 >에 더해질 값으로 , 생략되면 1 의 의미 .

• <변수 >는 반복의 수행동안 변경될 수 없고 , <초기값 >과 <최종값 >은 반복의 시작에서 한 번만 평가된다 .

Page 27: 제  7  장  문장

27

7.5 GOTO 문 GOTO 문의 장단점

• 장점– GOTO 문 제어구조를 하드웨어가 제공– 소규모의 프로그램에서는 간단하고 이해하기 쉬움– 어셈블리어나 기존의 언어에 익숙한 사람들에게 친숙한 구조– GOTO 문 제어 구조의 완벽한 범용성 ( 모든 알고리즘 표현 가능 )

• 단점– 계층적인 프로그램 ( 그룹화 ) 작성이 방해 받아 프로그램 질 저하 유도– 프로그램의 문장 순서와 실행 순서가 달라져서 판독성 저하 ( 비구조적 )– 프로그램 유지보수의 어려움

• goto 문의 잔존 여부 : 논란의 대상

• Fortran, Basic 의 if 문은 goto 문임

• pure LISP, Bliss : goto 문 사용 금지

• Pascal : 제한적 사용

• goto 문 제거 - 다양한 제어문 요구

Page 28: 제  7  장  문장

28

GOTO 문 (2)

Exit 와 Break 문

• 반복문에서 break 문이 사용되면 현재 break 문을 감싸고 있는 반복문의 루프를 빠져 나오게 한다 . 만약 반복문이 여러 개 중첩되어 있다면 break 문은 현재 자신을 포함하고 있는 반복문만을 빠져 나오고 반복문 밖의 다음 명령문으로 제어를 이동한다 .

• continue 문도 continue 문 이후의 모든 명령문을 실행하지 않고 제어를 반복문의 시작 위치로 이동시킨다 . 즉 , break 는 반복문의 블록을 완전히 종료하게 하지만 continue 문은 반복의 시작 위치로 제어를 이동시킨다는 것이다 .

• Ada 의 exit 문은 end-loop 다음의 문으로 제어를 바로 이동하게 된다 . 만일 루프에 X 란 레이블이 붙으면 , 루프내의 임의의 장소에서 exit X; 라고 기술할 수 있다 .

Java 의 break 문과 continue 문 (pp. 220-221) ?