• 검색 결과가 없습니다.

6. 프로그래밍 식과 제어문

N/A
N/A
Protected

Academic year: 2022

Share "6. 프로그래밍 식과 제어문 "

Copied!
28
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

대 구 가 톨 릭 대 학 교 I T 공 학 부

Ⓒ2014 소프트웨어공학연구실

6. 프로그래밍 식과 제어문

(2)

목 차

2

6.1 개요

6.3 조건문 6.2 제어문

6.4 반복문

6.5 분기문

(3)

6.1 식(1)

식(expression)

프로그래밍 언어에서 계산을 표현하는 기본적인 수단

연산자, 피연산자, 괄호, 함수 호출 등으로 구성

연산자 (피연산자의 수에 따라)

단항 연산자 : 한 개의 피연산자를 가짐

이항 연산자 : 두 개의 피연산자를 가짐

삼항 연산자 : C 기반 언어에서 지원 => 식1 ? 식2 : 식3

예: (a % 2) ? “odd” : “even”

대부분의 프로그래밍 언어에서 이항 연산자는 피연산자들 사이에 위치 : x + y

LISP는 연산자가 피연산자들보다 앞에 위치 : (+ x y)

3

(4)

6.1 식(2)

연산자 표기 방법

전위 표기법(prefix notation)

연산자가 피연산자들보다 앞에 위치하는 표기법

예) 함수 호출 표기 : add(1, mul(2,3))

=> 함수 이름을 연산자로, 실매개변수를 피연산자로 볼 때,

중위 표기법(infix notation)

연산자가 피연산자들 사이에 위치하는 표기법

계산 순서의 모호성 : 연산자 우선순위, 연산자 결합법칙 <- 괄호사용 제한

후위 표기법(postfix notation)

연산자가 피연산자들보다 뒤에 위치하는 표기법

예)

4

표기법 예_1 예_2

중위표기법 2 * 3 1 * 2 -3

전위표기법 * 2 3 - * 1 2 3

후위표기법 2 3 * 1 2 * 3 -

(5)

식의 평가 순서(1)

연산자 평가 순서

여러 개의 연산자로 이루어진 식에서는 연산자 평가 순서가 중요

어떤 연산자가 먼저 평가되느냐에 따라 연산 결과가 달라짐

연산자 평가 순서는 우선순위, 결합 규칙, 괄호에 의해 결정

1)

우선순위

일반적인 프로그래밍 언어의 우선순위

높은 우선순위의 연산자가 먼저 평가

2)

결합법칙

좌결합법칙 : 왼쪽에서부터 오른쪽으로 평가 -> 대부분의 언어에서 적용(지수 연산 자 제외)

우결합법칙 : 오른쪽에서부터 왼쪽으로 평가 -> 지수 연산자

예) FORTRAN : 지수 연산자는 우결합법칙을 적용 x ** y ** z

3)

괄호

우선순위와 결합법칙에 관계없이 괄호 안의 연산이 먼저 평가

예) APL : 우선순위를 두지 않고 평가 순서는 괄호를 사용하여 나타냄

장점 : 모든 연산자의 평가 순서를 괄호로 표현하면 우선순위나 결합법칙을 기억할 필요 없음

단점 : 식의 작성을 지루하게 함, 판독성 떨어뜨림

5

(6)

식의 평가 순서(2)

연산자 우선순위

일반적으로 관계 연산자와 불린 연산자는 산술 연산자에 비해 우선순 위가 낮음

6

FORTRAN C Ada 우선순위

**

*, / +, -

.EQ., .NE., .LT., .LE., .GT., .G E.

.NOT.

.AND.

.OR.

후위 ++, -- 전위 ++, --, !

*, /, % +, -

<, <=, >, >=

==, !=

&&

||

**

*, /, mod, rem +, -, not

=, /=, <, <=, >, >=

and, or, not

낮음 높음

(7)

식의 평가 순서(3)

피연산자 평가 순서

식의 평가는 피연산자에 해당하는 값을 구하여 주어진 연산을 행함으로써 이루어짐

이상적인 식의 평가는 오직 값만을 생성해야 함, 환경을 변경시켜서는 안 됨 –> 참조투명성

But, 수식에서 함수가 변수 값을 변경 -> 환경을 변경시킬 가능성 존재

예) C 프로그램

x + fuc()

왼쪽 피연산자 x가 먼저 평가되는 경우, 결과 : 40

오른쪽 피연산자가 fun() 함수 먼저 평가 되는 경우, 결과 : 20 fun 함수에서 x의 값을 변경하기 때문에 이러한 일이 발생 =>

함수의 부작용

7

#include <stdio.h>

int x = 10;

int func(void)

{

x = 20;

return 30;

}

int main(void)

{

printf("%d\n", x + func() );

return 0;

}

(8)

식의 평가 순서(4)

부작용(side effect)

수식 안의 요소들의 반환값을 계산하는 중에 묵시적으로 다른 요 소의 값을 변경시키는 것

함수의 부작용(functional side effect)

피연산자 평가 순서에 따라 다른 결과가 나오는 문제

함수가 자신의 매개변수나 전역변수를 변경시킬 때 발생

피연산자의 평가 순서에 따라 다른 결과가 나오는 문제를 해결 하기 위한 방법

1)

함수에서 부작용을 일으키지 못하도록 하는 것

함수의 기능을 지극히 제한하는 것으로, 적용하기가 쉽지 않음

2)

피연산자의 평가 순서를 정해놓는 것

Java 언어에서 적용 : 피연산자의 평가 순서를 왼쪽에서 오른쪽으로 정해놓고 있음

8

(9)

6.1 식(3)

단락회로(short circuit, 조건부) 평가

모든 피연산자와 연산자를 평가하지 않고서도 식의 결과가 결정되는 것

식의 값을 계산하는 중에 식의 나머지 부분을 평가하지 않고도 결과가 결 정되어 계산을 중지하는 것

예)

(B *A )*(B /13 - 1) : A가 zero이면 second part를 평가할 필요가 없음

(A>=0) and (B<10) : first part가 false이면 second part를 평가할 필요가 없음

각 언어별 단락회로 지원 사항

Pascal의 and, or은 단락회로 평가를 지원하지 않음

C, C++, Java의 &&, ||는 단락회로 평가를 지원

Ada는 단락회로 평가를 지원하는 연산자((and then, or else)와 지원하지 않는 연산자(and, or)를 구분

9

if x != 0 and y/x > 1 then z: = 10; if x != 0 and then y/x > 1 then z: = 10;

(10)

6.1 식(4)

중복 연산자

하나의 기호가 두 가지 이상의 목적으로 사용되는 연산자

산술 연산자는 여러 목적으로 사용

Java

+ : 정수 및 부동소수점 덧셈, 문자열 연결

C

& : bitwise AND, 주소 연산자

* : 곱셈, 역참조 연산자

C++와 Ada는 프로그래머가 중복 연산자를 직접 정의해서 사용 할 수 있음

10

10 + 20;

1.2 + 3.14;

“Hello” + “world”

(11)

6.1 관계식

관계식(relational expression)

두 피연산자의 값을 비교하는 식

두 피연산자와 한 관계 연산자로 구성되고 결과는 논리값(불리언 값)

관계 연산자는 산술 연산자보다 낮은 우선순위를 가짐

일반적인 프로그래밍 언어의 관계 연산자 (p.178)

11

(12)

6.1 논리식

논리식(logical expression)

논리형 변수, 논리형 상수, 관계식, 논리 연산자로 구성되고 결과는 논리값

논리 연산자

AND, OR, NOT, exclusive OR, equivalence 등

예) C언어에서의 우선순위

1. ( ), [ ], ->, .

2. !, ~, +, -, ++, --, &, * 3. *, /, %

4. +, - 5. <<, >>

6. <, <=, >, >=

7. ==, !=

8. &

9. ^ 10. | 11. &&

12. ||

13. ?:

14. =, *=

15. , 12

(13)

6.2 제어문

프로그램은 위에서부터 아래로 한 문장씩 순차적으로 실행됨

제어문을 이용하면 프로그램 실행 순서에 변화를 가져올 수 있음

제어문 종류

조건문, 반복문, 분기문

조건문(선택문, selection statement)

조건에 따라 둘 또는 그 이상의 실행 경로 중에서 하나를 선택할 수 있는 수단을 제공하는 문장

조건이 참이냐 거짓이냐에 따라 선택 : if 문

조건에 따라 여러 경로 중 하나를 선택 : case문(switch문)

반복문(iterative statement)

특정 부분을 반복해서 실행되게 하는 문장

while 문, for 문

무조건 분기문(unconditional branch statement)

프로그램의 실행 순서를 (명시적으로) 특정 위치로 변경하는 문장

13

(14)

6.3 조건문(1)

if 문

조건이 참이냐 거짓이냐에 따라 실행되는 문장을 달리하고자 할 때 사용

FORTRAN에서 처음 도입

식이 참이면 레이블 L1로 분기하고, 거짓이면 레이블 L2로 분기

식의 값이 음수이면 레이블 L1로, 0이면 레이블 L2로, 그리고 양수이면 레이블 L3으로 분기

이후 버전, 새롭게 도입된 IF 문

식이 참이면 문장을 실행하고 거짓이면 문장을 실행하지 않음

참인 경우에 한 문장만 실행 가능

조건식이 참인 경우 실행될 문장이 여러 개인 경우에는 GoTo 문을 활용해야 하는 단점이 있음

14

① IF( 식 ) L1, L2

② IF( 식 ) L1, L2, L3

IF( 식 ) 문장

10 IF(식) GO TO 20 문장1

문장2

GO TO 10 20 문장3 IF(I .GT. 10) K =20

(15)

6.3 조건문(2)

FORTRAN 77

Go To 문 사용 문제를 보완 => 블록 if 문 추가

(예)

THEN 다음에 나오는 문장들은 then 절

ELSE 절 다음에 나오는 문장들은 else 절

식이 참이면 then 절을 실행하고 거짓이면 else 절을 실행

C의 if문

식이 참이거나 거짓인 경우에 실행될 문장이 여러 개라면 중괄호로 묶은 복합문을 사용

15

IF(식) THEN 문장들 ELSE 문장들 ENDIF

IF(L .GT. M) THEN ISUM = ISUM + L LCNT = LCNT + 1 ELSE

ISUM = ISUM + M MCNT = MCNT + 1 ENDIF

if (식) 문장 1;

else

문장 2; 옵션

if(식) { 문장1;

문장2;

} else { 문장n;

문장n+1;

}

(16)

6.3 조건문(3)

dangling else 문제 : else가 어떤 if와 연결되는지 모호함

Pascal과 C

‘else는 연결된 else가 없는 가장 가까운 if와 결합한다’는 규칙을 적용 => 예제의 else는 두 번째 if와 연결

만약 예제에서 첫 번째 if와 연결을 시키려면 중괄호로 두 번째 if 문을 묶음

else 뒤에 if 문 사용 가능 : C언어 형식

16

if ( 식 1 ) if ( 식 2 ) 문장 1;

else

문장 2;

if ( 식 1 ) { if ( 식 2 ) 문장 1;

} else

문장 2; if(식 1)

문장 1;

else if (식 2) 문장 2;

else

문장 3;

(17)

6.3 조건문(4)

Ada의 if 문

FORTRAN과 유사하게 if 문 끝에 end if 위치

then 절과 else 절에는 둘 이상의 문장이 올 수 있음

Ada의 else if 문

17

if 식 then 문장들 else

문장들 end if;

if 식1 then 문장들

else if 식 2 then 문장들 else 문장들

end if;

end if;

if 구조의 끝을 의미하는 end if를 if의 개수만큼 마지막 부분에

나타내야만 함

if 식1 then 문장들

elsif 식 2 then 문장들 else 문장들

end if;

예약어 elsif 사용하여 해결할 수 있음, 중첩된 if의 끝을 의미하는 end if는

쓰지 않음

(18)

6.3 조건문(5)

case문(switch문)

조건에 따라 여러 경로 중 하나를 선택할 때 사용

ALGOL W에서 처음 도입

C와 Java의 switch문

18

case 식 of begin

문장 1; 문장 2; …; 문장 n end

switch(식) { case 상수1:

문장들1 case 상수2:

문장들2

default:

문장들n }

식의 값이 1이면 문장1 2면 문장 2, …,

n이면 문장 n이 선택되어 실행

switch(식) { case 상수1:

문장들1 break;

case 상수2:

문장들2 break;

default:

문장들n }

switch 구조에서 break를 만나면 switch 구조를 벗어남

(19)

6.3 조건문(6)

Ada의 case 문

when others는 생략 가능

선택리스트들이 식에서 나타날 수 있는 결과를 모두 포함하고 있어야 함

만약 모든 결과를 선택리스트에 나타낼 수 없으면 others를 이용

C/C++/Java의 switch는 상수만 가능

Ada의 case는 상수는 물론 3|5|7과 같은 상수들의 나열, 90..100과 같은 범 위도 가능

일치하는 선택리스트가 없을 때 아무 작업도 실행하고 싶지 않다면 null을 이용

19

case 식 is

when 선택리스트1 => 문장들1 when 선택리스트2 => 문장들2

when others => 문장들n end case;

case 식 is

when others => null end case;

(20)

6.4 반복문(1)

FORTRAN의 DO문

변수가 초기값을 갖고 한 번씩 반복할 때마다 증가값만큼 증가되면서 종료값보다 작거나 같은 동안 ‘문장들’을 실행

증가값은 생략 가능, 생략하면 반복할 때마다 변수 값은 1씩 증가

20

DO 레이블 변수=초기값, 종료값 [, 증가값]

문장들 레이블 CONTINUE

DO 10 I=1, 5 문장들 10 CONTINUE

DO 10 I=1, 5, 2 문장들 10 CONTINUE

(21)

6.4 반복문(2)

while 문

식이 참인 동안 문장을 반복해서 실행

C/C++/Java의 while 문

Ada의 while 문

while 문은 식이 시작부터 거짓이면 반복 문장이 한 번도 실행되지 않음

식이 시작부터 거짓이더라도 반복 문장을 적어도 한 번은 실행되도록 하는 반복문 -> C/C++/Java의 do-while 문

21

while ( 식 ) 문장 ;

while ( 식 ) { 문장 1;

문장 2;

: }

while 식 loop 문장들

end loop;

with TEXT_IO;

use TEXT_IO;

procedure sum is

package INT_IO is new TEXT_IO.INTEGER_IO (integer);

use INT_IO;

index, result: integer;

begin

index := 1;

result := 0;

while index <= 10 loop

result := result + index;

index := index + 1;

end loop;

put(result);

end sum;

1부터 10까지 합을 구하는 Ada 예제

(22)

6.4 반복문(3)

C/C++/Java의 do-while문

먼저 ‘문장’을 실행하고, 마지막 부분에서 종료 조건인 식을 평가

식이 참이면 반복하고, 거짓이면 do 구조를 종료

반복 내의 임의의 지점에서 종료

C/C++/Java는 break

22

문장; while (식);

문장;

do { 문장 ;

} while (식); do문을 while 문으로 나타내면

while(1) {

if(⋯) break;

}

loop

exit when ⋯;

end loop;

Ada는 exit

(23)

6.4 반복문(4)

for 문

C/C++/Java의 for 문

식1, 식2, 식3은 옵션 -> 모두 생략 가능

23

for (식 1; 식 2; 식 3) 문장;

식1 : 초기화

식2 : 종료 조건을 판단하는 식 식3 : ‘문장’ 실행 후에 평가,

반복 변수의 값을 변환할 때 사용

for ( ; ; ) 문장;

항상 참인 경우

(24)

6.4 반복문(5)

for 문을 while 문으로 표현

for 문의 사용

반복 변수를 사용해서 임의의 횟수만큼 반복할 때 주로 사용

for 문에서의 변수 선언(C, Java, C++)

24

for(i=0; i<size; i++) sum = sum + data[i];

for(int i=0; i<size; i++)

sum = sum + data[i]; 변수 i는 for 구조 내에서만 사용할 수 있는 지역변수

식1;

while(식2) { 문장;

식3;

}

(25)

6.4 반복문(6)

Ada의 for 문

변수가 범위의 하한값을 갖고 시작하여 상한 값이 될 때까지 반복

반복할 때마다 변수의 값은 1씩 증가

범위는 1..10과 같이 정수 또는 열거 타입의 부분 범위

reverse를 사용하면 범위의 값이 역순으로 변수에 배정

Ada for 문의 특징

반복 변수가 for 구조 내에서만 사용되는 지역 변수

반복 변수는 반복 구조 내부에서 값을 임의로 배정할 수 없음

25

for 변수 in [reverse] 범위 loop 문장들

end loop;

01 for i in 0..size-1 loop 02 sum := sum + data(i);

03 end loop;

Ada의 for문 예

01 i: float := 3.1;

02 for i in 0..5 loop 03 sum := sum + i;

04 end loop;

05 i := 7.9;

01 for i in 0..5 loop 02 sum := sum + i;

03 i := 3;

04 end loop;

01,05행의 i와 03행의 i는 전혀 다른 변수

03행의 i는 02행의 i에 해당, 05행의 i는 01행의 i에 해당

03행과 값이 반복 변수에 값을 임의로 배정하는 것은 문법에 위배됨

(26)

6.4 반복문(7)

사용자 지정 루프 제어 메커니즘

C,C++의 break

break in switch: switch 블럭을 빠져 나와 switch문 다음 문장 수행

break in while: while 블록을 빠져 나와 다음 명령문 실행

Ada의 exit

Exit in loop: loop를 빠져 나와 다음 문장 수행

Loop label 사용: exit 할 loop 이름 지정 가능

C,C++의 continue

블록을 빠져 나오지 않고 다음번 루프 (루프의 처음) 실행

26

(27)

6.5 분기문(1)

goto 사용

1960년대 중반, goto문의 사용을 반대하는 주장이 제기

goto 사용을 엄격하게 제한하는 Pascal의 영향력이 커짐에 따라 점차 goto 문 의 사용이 줄게 됨

goto문을 폐기한 언어 : Modula-2, Java

C 언어를 비롯한 대부분의 언어는 goto 문을 포함하고 있으나 특별한 경우에만 goto 문을 사용하는 것이 바람직

GOTO문이 필요한 경우

여러 개의 while 루프에서 빠져나가야 할 경우

while 루프 중간에서 루프를 빠져나가야 할 경우

오류 발생시 오류 처리 루틴으로 jump 할 경우

27

(28)

6.5 분기문(2)

goto 문 : FORTRAN과 같은 언어에서 중요한 역할

FORTRAN과 같은 초기 언어에서는 goto문이 프로그램 문장의 실행 흐름 을 제어하기 위한 주된 수단으로 사용되었음

장점

작은 프로그램에서 사용하기 간단

이론적으로 모든 제어구조 표현 가능수행이 효율적

goto 문 사용 시 주의할 점

goto 문을 무분별하게 사용하면 프로그램을 판독하기 힘들어짐

프로그램의 신뢰성이 상당히 떨어지므로 특별한 경우에만 사용 권장

10 IF(K(I) .EQ. 0) GO TO 20 I = I+1

GO TO 10 20 ⋮

while(k[i] != 0) i++;

FORTRAN C

if(⋯) {

while(⋯) {

while(⋯) {

if(⋯) goto out;

} } } out: ⋮

참조

관련 문서

여러 실행 경로 중에서 하나의 경로를 선택 IF문 (IF-THEN-ELSE문). 다중

따라서 프로그래밍 언어의 기본 패턴부터 구조 및 의미 그리고 프로그램의 특성을 이해하는 데에 목적을 두고 있으며 또한 문제를 해결하기 위한 , 방법과

프로그래밍

1) 레크리에이션 프로그램은 모든 사람에게 평등한 참여 기회를 주어야 한다. 2) 프로그램이 건설적이며 교육적이어야 한다. 3) 단계적이며 체계적인

프로그래밍

전류가 흐를때 1, 흐르지 않을 때 0으로만 숫자를 표현할 수 있음 이진수 한자리를 bit라 칭하고 8개의 bit는

 클래스계층 공유어프로치에서는, 부모(parent)클래스에 정의되어 있는 정보의 조작은 자식(child)클래스에서 정의되지 않고, 정의되지 않은 나머지 것만을

TransferDatabase 다른 데이터베이스 파일과의 가져오기, 내보내기, 연결 등을 지원한다. TransferSpreadsheet 스프레드시트