학습목표
- 순차 실행을 변경하는 제어문을 실습한다.
흐름제어
- 흐름 제어(flow control): 프로그램 내의 명령문들이 실행되는 순서
- 본래 순차적으로 실행되는 명령문들의 순서를 바꿀 수 있게 해주는 것은 조건문과 반복문(loop)이다.
조건문은 어느 문을 다음에 실행할지를 선택할 수 있게 한다. 각 선택은 조건(condition)이라고도 불리는 부울 연산식 (boolean expression) 에 기초한다 이 연산식의 연산 결과는 참(true) 혹은 거짓(false) 이다. 이 결과가 어느 문이 다음에 실행될 지를 결정한다. 이와 같은 결정을 하는 일들은 프로그래밍을 할 때 아주 많이 일어난다. 예를 들면 영화관의 입장료를 계산하는 프로그램에서 입장료는 고객이 성인이냐 아니냐에 따라 다를 수 있다. 고객이 성인이면 일반 요금이 부과된다. 그렇지 않으면 할인 요금이 부과된다. 이 경우에 사용되는 문이 조건문이다. 조건문은 어느 문이 다음에 실행될지를 결정한다. 따라서 조건문은 때로 선택문이라고 부른다. 조건문은 우리들에게 기본적인 선택 기능을 제공한다. 자바에서 제공하는 조건문은 if 문과 switch 문이다. 반복문은 우라가 문(들)을 반복적으로 실행하는 것을 가능하게 한다. 조건문과 같이 반복문은 계속 실행할 지의 여부를 결정하기 위해 부울 연산식에 기초한다. 반복문은 5장에서 다루어진다.
부울 연산식
모든 조건문은 다음에 실행할 문을 결정하기 위해 관계 연산자와 논리연산자를 사용하는 부울 연산식을 이용한다.
관계연산자
관계 연산자는 두 피연산자들의 값을 서로 비교하여 그들 시 이의 관계를 결정한다‘ 연산결과는 true나 false이다. 자바에서 사용하는 관계 연산자들은 다음과 같다.
- >> : 첫 번째 피연산자의 값이 두 번째 피연산자의 값보다 큰 지 비교
- << : 첫 번째 피연산자의 값이 두 번째 피연산자의 값보다 작은 지 비교
- >= : 첫 번째 피연산자의 값이 두 번째 피연산자의 값보다 크거나 같은 지 비교
- <= : 첫 번째 피연산자의 값이 두 번째 파연산자의 값보다 작거나 같은 지 비교
- == : 두 피연산자들의 값들이 같은 지 비교
- != : 두 피연산자들의 값들이 같지 않은 지 비교
다음 관계 연산식들의 연산 결과는 아래와 같다.
- 3 > 4 : false (3이 4보다 크지 않다)
- 3 < 4 : true (3이 4보다 작다)
- 3 >= 3 : true (3이 3과 같다)
- 3 <= 3 : true (3이 3과 같다)
- 3 == 4 : false (3과 4는 같지 않다)
- 3 != 4 : true (3과 4는 같지 않다)
시험 점수가 90 점 이상인 조건을 관계 연산자를 이용하여 나타내보자. 시험 점수를 저장하는 변수가 testscore라고 가정하자. 그러면 이 조건은 다음과 같이 나타낼 수 있다.
논리연산자
자바에서 제공하는 논리 연산자는 모두 3개이다. 이 연산자들의 모든 피연산자는 boolean 유형을 갖고 논라 값은 true 혹은 false이다. 논리 연산자는 &&(논리 AND), II(논리 OR), !(논리 NOT) 등이 있다. 이 연산자들의 의미는 다음과 같다.
- && : 두 개의 피연산자가 모두 true면 결과는 true, 아니면 false
- || : 두 개의 피연산자 중 적어도 어느 하나가 true면 결과는 true, 아니면 false
- ! : 피 연산자가 true면 false, false면 true
다음 논리 연산식들의 연산 결과는 다음과 같다.
연산식 | 설 명 | 결 과 |
---|---|---|
(4==4) && (8==4) | true && false | false |
(8==4) || (4<10) | false || true | true |
!(5 == 5) | !(true) | false |
논리 연산식은 보통 복잡한 조건을 나타내기 위해 사용된다. 점수가 90점 이 상이고 출석률이 100%인 조건을 나타내 보자. 점수와 출석률은 각각 변수 score와 attendanceRate에 저장되어 있다고 가정하자. 그러면 이 조건은 다음과 같이 나타낼 수 있다.
조건연산자
조건 연산자는 두 개의 연산식들 중 어느 연산식을 결정하기 위해 조건식을 사용하는 연산자이다. 이 연산자의 구문법과 의미는 다음과 같다.
연산자의 구문법과 의미
• 구문법: (조건식) ? 연산식 1 : 연산식 2
여기서 조건식은 부울 연산식이고 연산식 1과 연산식 2는 연산식이다.
• 의미 : 조건식의 논리 값에 따라 연산식 l 혹은 연산식 2를 계산한다. 즉 조건식의 연산 결과가
참(true) 이면 연산식 1 거짓 (false) 이면 연산식 2 의 값을 계산한다.
이 연산자를 사용한 예들은 다음과 같다.
첫 번째 배정문은 변수 X의 값이 변수 y의 값보다 작으면 y 값을, 아니 면 x 값을 변수 max에 저장한다. 따라서 max에는 X와 y 중 큰 값이 저장된다. 두 번째 배정문은 변수 x 의 값과 변수 y의 값 중에 작은 값을 변수 min에 저장한다.
연산자 우선 순위 및 결합 순서
여러 종류의 연산자가 있는 복잡한 연산식은 연산자의 우선 순위를 알지 못하면 연산의 결과를 알기가 쉽지 않다. 그러므로 여러 연산자를 이 용하는 경우 연산자의 우선 순위와 결합 순서에 대한 이해가 반드시 필요하다. 연산자들의 우선 순위는 한 연산식에 여러 연산자들이 있을 때 이 연산자들을 적용하는 순서이다. 연산자들의 결합 순서는 같은 우선순위를 갖는 연산자들이 연속되어 나올 때 왼쪽부터 수행할지 아니면 오른쪽부터 수행할지를 결정한다. 자바 연산자들의 우선 순위와 결합 순서는 〈표 4 .1) 에 보여진다. 왼쪽 칸의 숫자가 우선 순위를 나타내며 작은 것이 우선 순위가 높다. 오른쪽 칸은 결합 순서를 나타낸다. ‘왼쪽에서 오른쪽으로’는 똑같은 연산자가 연속해서 나오는 경우에 왼쪽부터 연산을 한다는 의미이고 ‘오른쪽에서 왼쪽으로’는 그 반대의 의미이다. 이 책에서 다루지 않는 비트 논라 연산자와 비트 이 동 연산자도 포함되어 었다.
표 자바 연산자 우선순위와 결합 순서
우선순위 | 연산자 | 결합순서 |
---|---|---|
1 | [], ., (메소드 매개변수들), ++(후행), --(후행) | 왼쪽에서 오른쪽으로 |
2 | !, ~(비트 NOT), ++(선행), --(선행), +(단항), -(단항), (), (데이터형), new | 오른쪽에서 왼쪽으로 |
3 | (데이터 형), new | 오른쪽에서 왼쪽으로 |
4 | *, /, % | 왼쪽에서 오른쪽으로 |
5 | +, - | 왼쪽에서 오른쪽으로 |
6 | <<, >>, >>> (비트 이동 연산자) | 왼쪽에서 오른쪽으로 |
7 | <, <=, >, >=, instanceof | 왼쪽에서 오른쪽으로 |
8 | ==, != | 왼쪽에서 오른쪽으로 |
9 | & (비트 AND) | 왼쪽에서 오른쪽으로 |
10 | ^ (비트 XOR) | 왼쪽에서 오른쪽으로 |
11 | | ( 비트 OR) | 왼쪽에서 오른쪽으로 |
12 | && (논리 AND) | 왼쪽에서 오른쪽으로 |
13 | || (논리 OR) | 왼쪽에서 오른쪽으로 |
14 | ?: (조건 연산자) | 오른쪽에서 왼쪽으로 |
15 | =, +=, - =, *=, /=, %=, &=, 1=, ^=, >>=, <<=, >>>= | 오른쪽에서 왼쪽으로 |
단항 연산자는 모두 이항 연산자보다 우선 순위가 앞선다. 단항 연산자 중에서도 후행 연산자(exp++, exp--)가 선행 연산자(++exp, --exp)보다 앞서며 이항 연산자들은 산술, 비트 이동, 관계, 비트 논리, 논리 연산자 순으로 우선 순위를 갖는다. 연산 순위가 가장 낮은 연산자는 배정 연산자이다. 예를 들면
위 연산식의 우선 순위는 ++ * + 그리고 마지막으로 배정 연산자인 + = 이다. 따라서 이 연산식이 수행되는 순서는 다음과 같다.
if 문
if 문은 조건식의 논리 값에 따라 문의 실행 여부를 결정한다. if 문의 구문법과 의미는 다
음과같다.
if문의 구문법과 의미
• 구운법: if (조건식) 문:
여기서 조건식은 부울 연산식 이어야 하고 연산 결과는 참(true) 혹은 거짓(false)이어야 한다.
• 의미: 조건식이 참이면 문을 실행하고 거짓이면 실행하지 않는다.
위의 구문에서 문 대신에 복합문(compound statement) 이 나올 수 있다. 복합문은 여러 개의 문들이 합쳐져 하나의 문으로 간주되는 문이다. 복합문은 중괄호로 시작과 끝을 표시 한다. 복합문은 문이 냐올 수 있는 어느 곳에 서든지 사용될 수 있다. 복합문에 나오는 문들은 일반적인 경우에 나온 순서대로 실행된다. 복합문의 예는 다음과 같다.
if 문의 흐름도는 다음과 같다.
if 문을 사용하는 간단한 프로그램 이 다음과 같다. 이 프로그램에서는 입력받은 평점 (gpa) 이 4,0 이상이면 ‘장학금 대상자입 니 다’를 출력한다. 이를 수행하는 if 문은 다음과 같다.
이 문에서는 먼저 조건식 gpa >= 4.0을 계산한다. 이 연산 결과는 변수 gpa의 값이 4.0보다 크면 참이고 그렇지 않으면 거짓이다. 따라서 gpa의 값이 4.0보다 크거나 같은 경우에만 출력문이 수행되어 ‘장학금 대상지입니다’가 출력된다. gpa의 값이 4.0보다 작은 경우에는 아무것도 출력되지 않는다.
if-else 문
우리는 때때로 어떤 조건이 만족되면 어떤 일을 하고 만족되지 않으면 다른 일을 한다. 예를 들면, 날씨가 좋으면 운동하러 가고 좋지 않으면 영화 보러 가는 경우이다. 이런 경우를 위한 조건문이 if- else 문이다. if- else 문은 if 문에 else 절을 추가한 문이다. 이 문은 조건식의 논리 값에 따라 실행되는 문이 결정된다. if-else 문의 구문법과 의마는 다음과 같다.
if-else 문의 구문법과 의미
• 구문법: if (조건식) 문1;
else 문2;
• 의미: 조건식이 참이변 문1을 실행하고 거짓이면 문2를 수행한다.
위 구문에서도 문 대선에 복합문이 나올 수 있다. if-else 문의 흐름도는 다음과 같다.
if- else 문을 사용하는 간단한 프로그램이 다음에 보여 진다. 이 프로그램에서는 입력 받은 시 험 점수(t estScore)가 80 이 상이 고 면접 점수(i nterviewScore)가 60점이상이면 ‘합격을 축하합니다’를 출력 하고 아니면 ‘아쉽지 만 불합격입 니다’를 출력 한다. 이를 수행하는 if-else 문은 다음과 같다.
이 문에서는 먼저 조건식 testScore >= 80 && interviewScore >= 60을 계산한다. 이 연산결과는 변수 testScore의 값이 80보다 크거나 같고 동시에 변수 interviewScore의 값이 60보다 크거나 같으면 참이고 그렇지 않으면 거짓이다. 따라서 testScore의 값이 80보다 크거나 같고 동시에 interviewScore의 값이 60보다 크 거냐 같으면 ‘합격을 축하합니다’가 출력 된다. testScore의 값이 80보다 작거나 interviewScore의 값이 60보다 작은 경우에는 ‘아쉽지만 불합격입니다’가 출력된다.
정수형 변수 n의 값이 짝수이 먼 ‘짝수이다’를 출력하고 홀수이면 ‘흘수이다’를 출력하는 문을 작성해 보자. n의 값이 찍수인지는 n을 2로 나눈 나머지가 0인지 확인하면 된다. 따라서 이 문은 다음과 같이 작성할 수 있다.
중칩된 if 문
우리가 어떤 조건에 따라 일을 할 때 조건이 두 가지 이상인 경우가 자주 있다. 예를 들면 점수에 따라 학점을 부여하는 경우이다. 학점 부여 기준은 〈표 4.2) 에 보여진다. 이 경우에는 다섯 가지 조건에 따라 학점 이 다르게 부여된다. 중첩된 if 문은 이런 경우를 처리하기 위해 제공된다.
표 학점 부여 기준
점수범위 | 학점
------|------
점수≥90 | A
90>점수≥80 | B
80>점수≥70 | C
70>점수≥60 | D
점수<60 | F
중첩된 if 문은 if 문의 결과로서 실행되는 문이나 else 절의 문이 또 다른 if 문인 경우이다. 이 문은 한 조건에 따른 선택을 한 후에 또 다른 조건에 따른 선택을 할 수 있게 한다. 이 문의 구문법과 의미는 다음과 같다.
else 문의 구문법과 의미
• 구문법 : if (조건식 1)
문1;
else if (조건식 2)
문2;
else if (조건식 3)
문3;
else
문4;
• 의미: 먼저 조건식1이 참이면 문1을 실행하고 거짓이면 조건식2를 계산한다. 그 결과가 참이면 문2를 수행하고 거짓이면 조건식 3을 계산한다. 그 결괴가 참이면 문3을 수행하고 거짓이면 문4를 수행한다.
위의 중첩된 if 문의 흐름도는 다음과 같다.
중첩 된 if-else문을 사용하는 간단한 프로그램이 [프로그램 4.3] 에 보여 진다. 이 프로그램은 점수에 따라 학점을 부여한다. 점수는 변수 score에 저장되어 있다. 학점은 grade에 저장된다. <표 4 . 2) 에 보여진 학점 부여기준에 따라 학점을 부여하는 코드는 다음과 같다.
위 문은 변수 score의 값이 90 이상이면 변수 grade에 꾀를 저장한다. score의 값이 90 미만이고 80 이상이면 변수 grade에 ‘B’를 저장한다. score의 값이 80 미만이고 70 이상이면 변수 grade에 ‘C’를 저장한다 score의 값이 70 미만이고 60 이상이면 변수 grade에 ‘D’를 저장한다. score의 값이 60 미만이면 변수 grade에 ‘F’를 저장한다.
다음 중첩된 if 문을 고려하라.
위 문에서 else 절은 들여쓰기 때문에 첫 번째 if 문에 대응하는 것으로 생각할 수 있다. 그러나 자바 컴파일러는 두 번째 if 문에 대응하는 것으로 해석한다. 즉 자바 컴파일러는 중첩된 ìf 문에서 else 절은 바로 전에 나온 짝이 없는 if 문에 대응시킨다.
4.4 데이터 비교
부울 연산식을 사용하여 데 이 터를 비교할 때 비 교하는 데이터의 유형에 따라 발생하는 몇 가지 유의사항들을 이 해하는 것이 중요하다.
실수들의 비교
실수 데이터를 비 교할 때 유의해야 할 경우가 자주 발생한다. 두 개의 실수 값들은 이진수로 표현했을 때 모든 비트(b펴가 서로 같을 때 그 값들은 같다. 그러나 비교되는 값들이 계산 결과라면 그 값들이 정확히 같은 경우는 아주 드물다. 그러므로 우리는 실수 값들을 비교하기 위해 동등 연산자(==)를 사용할 때 주의해야 한다. 두 개의 실수 값들이 같다는 것을 확인하는 더 나은 방법은 그 값들의 차를 계산하고 그 차가 주어진 허용 한계치 내에 있다면 같다고 간주하는 것이다. 예를 들면 우리는 허용 한계치로 0.00001을 선택할 수 있다 그러면 두 개의 실수 값들의 차의 절대값이 이 허용 한계치보다 작다면 그 값들이 같다고 여긴다. 두 실수 값들이 변수 numberl과 number2에 저장되어 있고 허용 한계치가 상수 TOLERANCE(O. OOOOl)~1 저장되어 있다고 가정하면 number1과 number2가 같다는 것을 다음과 같이 작성할 수 있다.
문자들의 비교
우리는 한 숫자가 다른 숫자보다 작다고 할 때 그 의미를 정확히 안다. 그러나 한 문자가
다른 문자보다 작다는 것은 무엇을 의미하는가? 자바에서 모든 문자는 유니코드로 나타내
진다. 유니코드 문자 집합은 모든 문자들의 순서를 정의한다. 문자 ‘a’가 유니코드에서 문
자 ‘b’ 전에 나오기 때문에 우리는 ‘a’가 ‘ b ’보다 작다고 말할 수 있다.
문자 데이 터에 동등 연산자외- 같은 관계 연산자를 사용할 수 있다. 예를 들면 두 개의 문
자 변수들 charl과 char2가 있다면 우리는 다음과 같이 그 변수들의 순서를 확인할 수
있다.
유니코드에서 모든 영문 소문자들은 알파뱃 순서로 연속적으로 저장된다. 모든 영문 대문자들과 숫자들ω부터 9까지)도 마찬가지이다. 숫자들은 대문자들을 앞서고 대문자들은 소문자들을 앞선다.
문자열들의비교
문자열 상수들과 문자열 변수들을 비교하기 위해 관계 연산자를 사용하면 안 된다. String 클래스는 두 개의 문자열 변수들이 같은 지를 비교하기 위해서 equals라는 메소드를 제공한다, 이 메소드는 두 개의 문자열 객체들을 가리키는 변수들이 정확히 같은 문자들을 포함하고 있다면 true를 반환하고 아니라면 false를 반환한다, 예 를 들면 [프로그램 4.4J는 두 개의 이름을 입력 받아 그 이름들이 서로 같은지를 비 교한다. 첫 번째 이름(namel)과 두 번째 이름(name2) 이 서로 같은지를 비교하는 if- else 문은 다읍과 같다.
namel이 가리키는 문자열과 name2가 가리키는 문자열이 똑같으면 조건식 name1.equals (name2) 의 결과가 참이 되고 아니면 거짓이 된다.
4.5 switch 문
중첩된 if-else 문이 두 가지 이상의 조건을 냐타낼 수 있지만 이해하기가 어려울 수 있다. 만약 선택이 정수형(혹은 문자형) 연산식에 기초하여 이루어진다면 switch 문이 답이 될 수 있다. 스위치 (switch) 문은 또 다른 조건문이다. 이 문은 한 값에 기초하여 여러 개의 경우들 중의 하나를 선택하게 한다. 스위치 문은 어느 문이 다음에 수행될 지를 결정하는 또 다른 방법을 제공한다. 스위치 문의 구문법과 의미는 다음과 같다.
switch 문의 구문법과 의미
구문법: switch(연산식)
{
case 값1: 문 목록1
case 값2: 문 목록2
case 값3: 문 목록3
...
default: 문 목록X
}문 목록은 문들의 나열이다. default 경우는 선택 사항이다.
의미:
1. 연산식을 계산하여 결과 값이 여러 case 값들 중의 하나와 같은지 확인한다.
2. 각 case는 하나의 값과 문들의 목록을 포함한다.
3. 연산자의 결과 값이 여러 case 들의 값들 중의 하나와 같다면 그 첫 번째 case 값에 대응하는 문 목록을 수행한다.
4. 연산자의 결과 값이 모든 case의 값들과 같지 않다면 default 다음에 나오는 문 목록 x를 수행한다.
자주 break 문이 각 case의 문 목록의 마지막 문으로 사용된다. break 문은 제어 흐름을 switch 문의 다음 문으로 이동하게 한다. break 문이 사용되지 않는다면 제어 흐름은 다음 case의 문 목록으로 이동한다. 때때로 이것이 적절할지 모른다. 그러나 우리는 자주 각 case에 대응된 문들만 실행하기를 원한다. 또한 switch 문은 선택사헝으로 기본(default) case를 가질 수 있다. 이 case는 대응된 값을 가지지 않고 단순히 default라는 예약어를 사용한다. 기본 case가 있다면 switch 문의 연산식의 결과 값이 여러 case 들의 값과 같지 않다면 기본 case에 대 응되는 문 목록을 수행한다 기본 case가 없고 연산식의 결과 값이 어느 case의 값과도 같지 않다면 제어 흐름이 switch 문의 다음 문으로 이동하게된다. switch 문의 연산식의 결과 값은 int 형이나 char 형 값이어야 한다. 그 결과 값은 boolean 값, 실수형 값 혹은 다른 정수형 값이어서는 안 된다. 각 case의 값은 상수여야 하고 변수이거나 연산식일 수 없다. switch 문의 연산식의 결과 값이 각 case의 값과 같은지를 시험한다. 다른 관계는 적용할 수 없다. 다음은 switch 문의 사용 예이다.
위 switch 문에서 aCount. bCount. cCount. dCount외- fCount는 각각 A 학점들의 수 B 학점들의 수, C 학점들의 수, D 희점들의 수와 F 학점 들의 수를 저장하는 정수형 변수이다. 이 문이 하는 일은 변수 grade가 ‘A’와 같다면 aCount를 1 만큼 증가시키고, ‘B’ 와 같다면 bCount를 1 만큼 증가시킨다. 나머 지 경우도 비슷하다. 위 switch 문은 다음과 같은 중첩된 if-else 문과 같은 결과를 가진다.
위 예를 통해 중첩된 if- else 문보다 switch 문이 이해하기가 쉽다는 것을 확인할 수 있다.
4.6 예제 프로그램 작성
세 개의 정수 값을 입력 받아 최대값을 구하는 프로그램을 작성하자. 이 문제에서 세 개의정수와 최대값을 나타내는 변수들이 필요하다. 세 개의 정수를 나타내는 변수들을 각각numberl, number2와 number3라고 하자. 최대값을 나타내는 변수를 maximum 이라고 하자. 이 문제를 풀기 위한 알고리즘은 [그림 4.5] 에 보여 진다.
변수들의 선언문은 다음과 같이 작성할 수 있다.
알고리즘의 정수들을 읽어드리는 과정을 수행하기 위해서는 Scanner 클래스의 nextInt 메소드를 사용해야 한다. 이 메소드를 호출하기 위해서는 Scanner 객체를 만들어야 한다. 이를 위해 프로그램의 맨 앞에 다음과 같은 import 문을 넣어야 한다.
Scanner 객체를 만드는 문은 다음과 같이 작성할 수 있다.
그러면 알고리즘의 세 개의 정수 값들을 읽어드라는 과정을 다읍과 같이 구현할 수 있다.
알고리즘에서 세 개의 정수들을 비교하여 최대값을 찾는 과정은 다음과 같이 중접된 if-else 문으로 구현할 수 있다.
알고리즘의 최 대값을 출력하는 과정 은 다음과 같이 작성할 수 있다.
지금까지 작성한 것을 결합한 다음 프로그램은에 보여진다.
No discussion