Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

원문 : 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 ? - 비가 오고 있는가 ?

이에 대한 답은 truefalse중 선택할 수 있다. 올것도 같고 오지 않을 것도 같은데요? 같은 답은 없다는 것에 주의 하기 바란다.
  • 만약 (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문에 의한 선택과 결정의 과정을 - 별도의 컴파일 과정 없이 - 쉽게 경험할 수 있을 것이다.
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
      System.out.println ("The number " + 
           num + " is positive"); 
    System.out.println ("Good-bye for now"); 
  }
}
        Simulated Monitor





2. Click in the "monitor" window after the last line and enter a number

이 프로그램은 어디까지나 시뮬레이션일 뿐으로, 실제 컴파일된 자바(: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로 평가된다. 많은 경우 변수이 비교된다.
  • elsefalse일 경우 실행되는 블럭이다.
  • 블럭은 내부에 또다른 블럭을 가질 수 있다.
  • 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.");    
  }
}
이 프로그램은 다음과 같은 코드 흐름을 가진다.
  1. "Enter your age : "를 출력한다.
  2. 예를 들어, 21을 입력시켰다면
  3. 21은 숫자로 변환되어서 age변수에 저장된다.
  4. age < 17을 테스트한다.
  5. 21 < 17 은 false 이다.
  6. false branch 가 실행된다. "adult rate"가 출력된다.
  7. 마지막으로 "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인지 계산하라.
Expression ValueExpression Value
25 == 25 25 != 25
25 <= 25 25 > 25
25 >= 25 25 = 25
-5 < 7 -305 <= 97

Boolean Expressions의 사용

if 문안에 있는 boolean expression이 true인지 혹은 false인지에 따라서 true branch 와 false branch 중 어느게 실행될건지가 결정된다. 이쯤에서 새로운 문제를 풀어보도록 하자. 옷가게가 있다. 가게 주인은 각 아이템의 세금을 계산하는 프로그램을 가지길 원하고 있다. 옷의 가격이 100 달러 이상이면 5%의 세금이 부과되고, 100달러 미만이면 세금이 부과되지 않는다. 옷의 가격을 입력하면 세금까지 포함한 총 가격을 출력하는 프로그램을 작성해야 한다.

지금까지 졸지 않았다면, 어렵지 않게 이 프로그램을 작성할 수 있을 것이다. 아래의 코드의 빈칸을 채워서 가게주인이 원하는 프로그램을 만들어보자.

 

class TaxProgram
{
  public static void main (String[] args) 
  {
     
     
    double price;
    double tax ;

    System.out.println("Enter the price:");
          

    if (   )

         

    else
       

    System.out.println("Item cost: " + price +
        " Tax: " + tax + " Total: " + (price+tax) );    
  }
}
아래에 프로그램을 완성시키기 위한 조각 코드들이 있다. 이 조각코드를 이용해서 빈칸을 채워보도록 하자.
tax = price * taxRate;          Scanner scan = new Scanner( System.in );
price = scan.nextDouble();      final double taxRate = 0.05;
price >= 100.0               import java.util.Scanner;
tax = 0.0;

0을 더하기

다음은 완성된 프로그램이다.
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보다 작은 숫자인지 알아내는 프로그램을 만드는건 간단하다. ifelse 만을 가지고 원하는 프로그램을 작성할 수 있다. 여기에 조건이 하나 더 해져서, 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");  // 항상 실행된다. 
  }
}

문제 위 프로그램을 수정해서 참일 경우 0인지를 확인하는 코드가 들어가도록 해보자.