원문 : http://chortle.ccsu.edu/java5/Notes/chap12/ch12_1.html
if문만 있으면 프로그램을 만들 수 있다라는 속담이 있을 정도로, if 문은 모든 프로그래밍 언어에 있어서 가장 기본이 되는 문이다. 이번장에서는 if와 관련되어서 다음과 같은 내용들을 다룰 것이다.
두개중 하나 선택하기
if 문
if 문에서의 블럭
Boolean 표현
Relational Operators
예제 프로그램
문제
차를 몰고가는 도중에 비가 내리고 있고, 이 때문에 앞이 잘 보이지 않는다. 이제 자동차 앞유리 와이퍼를 가동시켜야 할것 같다. 가동시키기 위해서 on 버튼을 사용할 것인가 off 버튼을 사용할 것인가.
두개중 하나 선택하기
앞유리 와이퍼는 on과 off 상태를 가지는 스위치로 제어할 수 있다. 옆의 flowchart(흐름도)는 어떻게 스위치를 조작의 결정에 대한 선택의 방향을 보여주고 있다.
옆의 그림에서 가장 먼저 주어지는 것은 아래의 질문이다.
is it raining ? - 비가 오고 있는가 ?
이에 대한 답은 true와 false중 선택할 수 있다. 올것도 같고 오지 않을 것도 같은데요? 같은 답은 없다는 것에 주의 하기 바란다.
만약 (if) true 라면
true 선을 따라간다.
와이퍼의 스위치를 on 으로 한다.
continue 로 간다.
만약 false 라면
False 선을 따라간다.
와이퍼의 스위치를 off로 한다.
continue로 간다.
문제
start 에서 continue 까지 몇개의 길이 있는가
결정하기
자동차 와이퍼는 2개의 길중하나를 선택할 수 있다. 2개가 주어지고 이중 하나만 선택할 수 있으므로 binary decision이라고 하기도 한다. 자동차 와이퍼의 경우에는 단지 한번만의 선택이 존재하지만, 프로그램을 만들경우 수많은 binary decision이 복잡하게 얽혀서 존재하게 된다.
import java.util.Scanner;
class NumberTester
{
public static void main (String[] args)
{
Scanner scan = new Scanner( System.in );
int num;
System.out.println("Enter an integer:");
num = scan.nextInt();
if ( num < 0 ) // is num less than zero?
System.out.println("The number " + num + " is negative"); // true branch
else
System.out.println("The number " + num + " is positive"); // false branch
System.out.println("Good-bye for now"); // always executed
}
}
이러한 선택과 결정을 위해서 자바는 if, else 문을 제공한다. else는 false 선택이 이루어졌을 때를 처리하기 위해서 사용한다. 위의 코드는 num이 0보다 큰지 아니면 작은지를 선택의 기준으로 하고 있다. num < 0 즉, num이 0보다 작다면 true가 되고, num이 0보다 크다면 false가 된다. 아래에 if문의 특징을 정리했다.
if문은 항상 질문을 가진다.
if문은 true 아니면 false 둘중 하나를 선택하게 된다.
if문의 답이 flase 라면 false - branch를 실행한다.
어떤 branch 를 선택하더라도, continue - 코드에서는 always executed - 에 도달하게 된다.
이것은 두개로 나뉘지만 결국 동일한 목적지로 가는 도로를 생각하면 쉽게 이해할 수 있을 것이다. if문을 이용해서 도로가 2개로 나뉘고, 결국은 다시 하나로 합쳐지게 된다.
문제
프로그램을 실행시키고 -5를 입력했다면, 어떤 결과가 출력될 것인가.
시뮬레이션 프로그램
여기에 자바스크립트를 이용한 시뮬레이션 프로그램이 있다. 이 프로그램을 이용하면 if문에 의한 선택과 결정의 과정을 - 별도의 컴파일 과정 없이 - 쉽게 경험할 수 있을 것이다.
이 프로그램은 어디까지나 시뮬레이션일 뿐으로, 실제 컴파일된 자바(:12) 프로그램과는 다른 결과를 보여줄 수도 있다. 너무 심각하게 생각하지는 말기 바란다. 개념을 정리하기 위한 정도로 보기 바란다.
문제
플로우 챠트 상에서 0을 입력하면 어떻게 될까.
하나 이상의 결정을 해야 할 경우
다음 프로그램은 하나 이상의 상태 (statement)를 가지고 있다.
import java.util.Scanner;
class NumberTester
{
public static void main (String[] args)
{
Scanner scan = new Scanner( System.in );
int num;
System.out.println("Enter an integer:");
num = scan.nextInt();
if ( num < 0 )
{
System.out.println("The number " + num + " is negative"); // true-branch
System.out.println("negative numbers are less than zero"); // true-branch
}
else
{
System.out.println("The number " + num + " is positive"); // false-branch
System.out.print ("positive numbers are greater "); // false-branch
System.out.println("than zero "); // false-branch
}
System.out.println("Good-bye for now"); // always executed
}
}
하나 이상의 상태를 가지고 있을 경우에는 각각의 상태에 따른 코드를 {과 }사이에 넣으면 된다. 이렇게 블럭사이에 존재하는 상태를 block statement 라고 한다. - 혹은 줄여서 그냥 블럭 이라고 하기도 한다. - 다양한 상태가 존재한다면, 존재하는 상태의 수만큼 블럭을 사용하면 된다. 모든 블록은 조건이 true가 되었을 때에만 실행이 된다.
물론 상태가 만족하지 않은 경우 즉 false인 경우에 대해서도 블럭을 둘 수 있다. 이 경우에는 else문을 사용하면 된다. 일반적으로 false 블럭은 프로그램의 마지막 상태에 놓이게 한다.
두개중 하나 선택하기
두개의 상태중 하나를 선택하는 일반적인 방법에 대해서 설명하도록 하겠다.
// statements that are executed before the decision
if ( condition )
// true branch
else
// false branch
// statements that are executed after the branches join together again
위의 코드를 자세히 살펴보자.
상태는 true 혹은 false로 평가된다. 많은 경우 변수와 값이 비교된다.
else는 false일 경우 실행되는 블럭이다.
블럭은 내부에 또다른 블럭을 가질 수 있다.
true 일경우 true branch 가 실행된다.
false 일경우 false branch 가 실행된다.
원한다면 더 많은 statements 를 만들 수 있다.
branch 가 끝나면, 코드의 흐름은 다시 하나로 합쳐지게 된다.
상태는 변수와 값을 비교한다. 이러한 비교를 위해서 <, > 등을 이용할 수 있다. - 나중에 더 많은 것들을 배울 것이다. -. 만약 true branch 가 선택되었다면, false branch 는 결코 선택되지 않을 것이다. 반대로 false branch 가 선택되었을 때도 true branch는 선택되지 않을 것이다. 컴퓨터는 2가지 상태만을 가지고 있다는 것을 상기하기 바란다. 이렇게 if - else 를 사용함으로써 분기가 되지만 결국에는 하나로 합쳐지게 된다.
문제
다음 프로그램이 올바르게 실행되도록 수정하라
if ( num < 0 )
System.out.println("The number " + num + " is negative");
else
System.out.println("The number " + num + " is positive");
System.out.print ("positive numbers are greater ");
System.out.println("than zero ");
System.out.println("Good-bye for now");
연습
지금 극장에서 18세 이상가 영화를 상영하고 있다. 이 프로그램은 당신의 나이를 입력하면 입장이 가능한지 그렇지 않은지를 체크한다.
import java.util.Scanner;
class BoxOffice
{
public static void main (String[] args)
{
Scanner scan = new Scanner( System.in );
int age;
System.out.println("Enter your age:");
age = scan.nextInt();
if (<input type=text size=20> )
{
System.out.println("18세 미만으로 입장 불가 입니다.");
}
else
{
System.out.println("재미있게 보세요!!");
}
System.out.println("안녕히 가세요."); // always executed
}
}
문제
위 프로그램에서 공백을 채운다음 직접 컴파일 해서 테스트해보라.
영화 예약 프로그램
여기에 빈칸을 채운 완성된 프로그램이 있다.
import java.util.Scanner;
class BoxOffice
{
public static void main (String[] args)
{
Scanner scan = new Scanner( System.in );
int age;
System.out.println("Enter your age:");
age = scan.nextInt();
if ( age < 17 )
{
System.out.println("Child rate.");
}
else
{
System.out.println("Adult rate.");
}
System.out.println("Enjoy the show.");
}
}
이 프로그램은 다음과 같은 코드 흐름을 가진다.
"Enter your age : "를 출력한다.
예를 들어, 21을 입력시켰다면
21은 숫자로 변환되어서 age변수에 저장된다.
age < 17을 테스트한다.
21 < 17 은 false 이다.
false branch 가 실행된다. "adult rate"가 출력된다.
마지막으로 "Enjoy the show"가 출력된다.
문제
16 을 입력했을 경우의 출력결과를 나타내보라
Boolean Expressions
if 조건문에 대해서 좀더 자세히 살펴보기로 하자. if는 참과 거짓 두개의 상태를 가진다. 이것을 boolean expression이라고 한다. if는 참 아니면 거짓 둘중 하나를 표현할 수 있다.
Boolean expression은 숫자비교에 특히 널리 사용된다. 이러한 비교에 사용되는 연산자를 관계연산자(relational operator)이라고 한다. 관계연산자에는 다음과 같은 종류의 것이 있다.
연산자
설명
a == B
A와 B가 같은가 ?
A < B
A가 B보다 작은가 ?
A <= B
A가 B보다 작거나 같은가 ?
A > B
A가 B보다 큰가 ?
A >= B
A가 B보다 크거나 같은가 ?
A != B
A와 B가 다른가?
문제
다음 표의 빈칸이 true인지 false인지 계산하라.
Boolean Expressions의 사용
if 문안에 있는 boolean expression이 true인지 혹은 false인지에 따라서 true branch 와 false branch 중 어느게 실행될건지가 결정된다. 이쯤에서 새로운 문제를 풀어보도록 하자.
옷가게가 있다. 가게 주인은 각 아이템의 세금을 계산하는 프로그램을 가지길 원하고 있다. 옷의 가격이 100 달러 이상이면 5%의 세금이 부과되고, 100달러 미만이면 세금이 부과되지 않는다. 옷의 가격을 입력하면 세금까지 포함한 총 가격을 출력하는 프로그램을 작성해야 한다.
지금까지 졸지 않았다면, 어렵지 않게 이 프로그램을 작성할 수 있을 것이다. 아래의 코드의 빈칸을 채워서 가게주인이 원하는 프로그램을 만들어보자.
아래에 프로그램을 완성시키기 위한 조각 코드들이 있다. 이 조각코드를 이용해서 빈칸을 채워보도록 하자.
import java.util.Scanner;
class TaxProgram
{
public static void main (String[] args)
{
final double taxRate = 0.05;
Scanner scan = new Scanner( System.in );
double price;
double tax ;
System.out.println("Enter the price:");
price = scan.nextDouble();
if ( price >= 100.0 )
tax = price * taxRate;
else
tax = 0.0;
System.out.println("Item cost: " + price +
" Tax: " + tax + " Total: " + (price+tax) );
}
}
else 문을 이용해서 가격이 100$보다 작을경우 0.0을 더해주고 있다. 그러므로 100달러 보다 작다면 세금이 포함되지 않은 원래 가격이 출력될 것이다.
문제
100$짜리 셔츠를 샀다면 화면에 어떻게 출력될까.
다양한 결정
if문은 2가지중 하나를 결정하기 위해서 사용될 수 있을 것이다. 그러나 결정해야될 사항이 좀 더 많은 경우를 생각할 수 있을 것이다. 위의 세금계산 프로그램은 100달러를 기준으로 세금을 계산하지만, 500달러가 넘을 경우 좀더 높은 세금을 가지도록 하는 프로그램이 필요할 수도 있을 것이다.
Flow Chart
주어진 숫자가 0보다 큰 숫자인지, 0보다 작은 숫자인지 알아내는 프로그램을 만드는건 간단하다. if 와 else 만을 가지고 원하는 프로그램을 작성할 수 있다. 여기에 조건이 하나 더 해져서, 0보다 큰지 혹은 0보다 작은지 혹은 0인지를 알아내는 프로그램을 만들어야 한다고 가정해보자.
이 프로그램은 다음과 같은 Flow Chart를 가질 것이다.
attachment:threeWay.gif
이 프로그램은 주어진 숫자가 3가지 중 어느 상태에 있는지를 확인해야 한다. 그래서 0보다 클경우 0인지를 검사하는 코드가 더 들어갔음을 알 수 있다.
숫자 테스트 프로그램
여기에 위의 Flowchart을 구현한 프로그램이 있다. else문 안에 또다른 if - else 문이 사용되고 있음을 주목자.
import java.util.Scanner;
class NumberTester
{
public static void main (String[] args)
{
Scanner scan = new Scanner( System.in );
int num;
System.out.println("Enter an integer:");
num = scan.nextInt();
if ( num < 0 )
{
System.out.println("The number " + num + " is negative"); // 참일 경우
}
else
{
if ( num > 0 )
{
System.out.println("The number " + num + " is positive"); // 거짓을 만족하고 참일경우
}
else
{
System.out.println("The number " + num + " is zero"); // 거짓을 만족하고 거짓일 경우
}
}
System.out.println("Good-bye for now"); // 항상 실행된다.
}
}
두개중 하나 선택하기
결정하기
시뮬레이션 프로그램
하나 이상의 결정을 해야 할 경우
두개중 하나 선택하기
연습
영화 예약 프로그램
Boolean Expressions
Boolean Expressions의 사용
0을 더하기
다양한 결정
Flow Chart
숫자 테스트 프로그램
Recent Posts
Archive Posts
Tags