1) 조건문

· if문의 기본 구조

 

다음의 구조가 if와 else를 이용한 기본적인 구조이다.

 

if (조건문) {
    <수행할 문장1>
    <수행할 문장2>
    ...
} else {
    <수행할 문장A>
    <수행할 문장B>
    ...
}

 

조건문을 테스트 해서 참이면 if문 바로 다음의 문장들을 수행하고 조건문이 거짓이면 else문 다음의 문장들을 수행하게 된다.

 

· 조건문이란 무엇인가?

 

if (조건문) 에서 사용되는 조건문이란 참과 거짓을 판단하는 문장을 말한다.

 

따라서 위의 예에서 보았던

 


boolean money = true;
if (money) {
...

 

에서 조건문은 money가 되고 money는 true이기 때문에 if문 다음의 문장을 수행하게 되는 것이다.

 

· 비교연산자

 

하지만 조건판단을 하는 경우는 자료형(boolean)보다는 비교 연산자(<, >, ==, !=, >=, <=)를 쓰는 경우가 훨씬 많다.

 

다음은 비교연산자를 잘 설명해 준다.

 

비교연산자 설명
x < y x가 y보다 작다
x > y x가 y보다 크다
x == y x와 y가 같다
x != y x와 y가 같지 않다
x >= y x가 y보다 크거나 같다
x <= y x가 y보다 작거나 같다

 

예를 통해서 위의 연산자들에 대해서 알아보자.

 


int x = 3;
int y = 2;
System.out.println(x > y);

 

x에 3을 y에 2를 대입한 다음에 x > y라는 조건문을 출력하니 true가 출력된다. 그 이유는 x > y라는 조건문이 참이기 때문이다.

 


System.out.println(x < y);

 

위의 조건문은 거짓이기 때문에 false가 출력된다.

 


System.out.println(x == y);

 

x와 y는 같지 않다. 따라서 위의 조건문은 거짓이다.

 


System.out.println(x != y);

 

x와 y는 같지 않다. 따라서 위의 조건문은 참이다.

앞의 경우를 다음처럼 바꾸어 보자.

 

"만약 3000원 이상의 돈을 가지고 있으면 택시를 타고 그렇지 않으면 걸어가라"

 

위의 상황을 다음처럼 프로그래밍 할 수 있을 것이다.

 


int money = 2000;
if (money >= 3000) {
    System.out.println("택시를 타고 가라");
}else {
    System.out.println("걸어가라");
}

 

money >= 3000 이란 조건문이 거짓이 되기 때문에 else문 다음의 문장을 수행하게 된다.

 

· and(&&), or(||), not(!)

 

또다른 조건 판단에 쓰이는 것으로 and, or, not이란 것이 있다.

 

각각의 연산자는 다음처럼 동작을 한다.

 

  • x || y - x와 y 둘중에 하나만 참이면 참이다
  • x && y - x와 y 모두 참이어야 참이다
  • !x - x가 거짓이면 참이다

 

다음의 예를 통해 위의 사항을 반영해 보도록 하자.

 

"돈이 3000원 이상 있거나 풀러줄 시계가 있다면 택시를 타고 그렇지 않으면 걸어가라"

 


int money = 2000;
boolean watch = true;

if (money>=3000 || watch) {
    System.out.println("택시를 타고 가라");
} else {
    System.out.println("걸어가라");
}

 

money는 2000이지만 watch가 true이기 때문에 money >= 3000 || watch라는 조건문이 참이 되어 if문 다음의 문장이 수행된다.

 

· contains

 

List 자료형에는 해당아이템이 있는지 조사하는 contains라는 메소드가 있다. contains메소드는 조건문에 많이 활용되는데 어떻게 활용이 되는지 살펴보도록 하자.

 

다음의 경우를 예제에 적용시켜 보자.

 

"만약 주머니에 돈이 있으면 택시를 타고, 없으면 걸어가라“

 


ArrayList pocket = new ArrayList();
pocket.add("paper");
pocket.add("handphone");
pocket.add("money");

if (pocket.contains("money")) {
    System.out.println("택시를 타고 가라");
}else {
    System.out.println("걸어가라");
}

 

pocket 리스트에 안에 'money'가 있으므로 pocket.contains("money")는 참이 되어서 if문 다음의 문장이 수행되었다.

 

· else if (다중 조건 판단)

 

if와 else만을 가지고서는 다양한 조건 판단을 하기가 어렵다. 다음과 같은 예만 하더라도 if와 else만으로는 조건 판단에 어려움을 겪게 된다.

 

"지갑에 돈이 있으면 택시를 타고, 지갑엔 돈이 없지만 시계가 있으면 택시를 타고, 돈도 없고 시계도 없으면 걸어가라“

 

위의 문장을 보면 조건을 판단하는 부분이 두 군데가 있다. 먼저 지갑에 돈이 있는지를 판단해야 하고 지갑에 돈이 없으면 다시 시계가 있는지를 판단한다.

 

if와 else만으로 위의 문장을 표현 하려면 다음과 같이 할 수 있을 것이다.

 


boolean watch = true;
ArrayList pocket = new ArrayList();
pocket.add("paper");
pocket.add("handphone");

if (pocket.contains("money")) {
    System.out.println("택시를 타고 가라");
}else {
    if (watch) {
        System.out.println("택시를 타고 가라");
    }else {         
        System.out.println("걸어가라");
    }
}

 

언뜻 보기에도 이해하기가 쉽지 않고 산만한 느낌이 든다. 위와 같은 점을 보완하기 위해서 자바는 다중 조건 판단을 가능하게 하는else if라는 것을 사용한다.

 

위의 예를 else if를 이용하면 다음과 같이 할 수 있다.

 


boolean watch = true;
ArrayList pocket = new ArrayList();
pocket.add("paper");
pocket.add("handphone");

if (pocket.contains("money")) {
    System.out.println("택시를 타고 가라");
}else if(watch) {
    System.out.println("택시를 타고 가라");
}else {         
    System.out.println("걸어가라");
}

 

즉, else if는 이전 조건문이 거짓일 때 수행되게 된다. if, else if, else의 기본 구조는 다음과 같다.

 

if (조건문) {
    <수행할 문장1> 
    <수행할 문장2>
    ...
}else if (조건문) {
    <수행할 문장1>
    <수행할 문장2>
    ...
}else if (조건문) {
    <수행할 문장1>
    <수행할 문장2>
    ...
...
} else {
   <수행할 문장1>
   <수행할 문장2>
   ... 
}

 

위에서 보듯이 else if는 개수에 제한 없이 사용할 수 있다.

 

· switch/case 문의 기본 구조

 

switch/case 문은 if 문과 비슷하지만 좀 더 정형화된 모습의 제어문이다.

switch/case 문의 구조는 다음과 같다.

 


switch(입력변수) {
    case 입력값1: ...
         break;
    case 입력값2: ...
         break;
    ...
    default: ...
         break;
}

 

입력변수의 값과 일치하는 case 입력값(입력값1, 입력값2, ...)이 있다면 해당 case문 하위의 문장이 실행된다. case문마다 break 라는 문장이 있는데 해당 case문을 실행 한 뒤 switch문을 빠져나가기 위한 것이다. 만약 break 문이 빠져 있다면 그 다음의 case 문이 실행되게 된다.

switch/case 문을 가장 잘 설명해주는 다음의 예를 보자.

 

SwitchDemo.java


public class SwitchDemo {
    public static void main(String[] args) {
        int month = 8;
        String monthString;
        switch (month) {
            case 1:  monthString = "January";
                     break;
            case 2:  monthString = "February";
                     break;
            case 3:  monthString = "March";
                     break;
            case 4:  monthString = "April";
                     break;
            case 5:  monthString = "May";
                     break;
            case 6:  monthString = "June";
                     break;
            case 7:  monthString = "July";
                     break;
            case 8:  monthString = "August";
                     break;
            case 9:  monthString = "September";
                     break;
            case 10: monthString = "October";
                     break;
            case 11: monthString = "November";
                     break;
            case 12: monthString = "December";
                     break;
            default: monthString = "Invalid month";
                     break;
        }
        System.out.println(monthString);
    }
}

 

switch문의 입력으로 1이라는 숫자가 올 경우 "January"라는 문자열이 12가 입력으로 올 경우 "December"라는 문자열이 출력되는 예제이다. 위의 예는 month가 8로 고정되어 있기 때문에 "August"라는 문자열이 출력될 것이다.

 

위 switch문은 month의 값이 1이면 case 1: 문장이 실행되고 2이면 case 2: 문장이, 3이면 case 3: ... 이런식으로 수행되게 된다. 만약 month에 1에서 12사이의 숫자가 아닌 다른 값이 저장되어 있다면 default: 문장이 수행될 것이다.

 

위와 같이 입력값이 정형화되어 있는 경우 if문보다는 switch/case문을 쓰는것이 가독성에서 좀 더 유리하다.

 

switch/case문은 if else 구조로 변경이 가능하지만 if else 구조로 작성된 모든 코드를 switch 문으로 변경할 수는 없다.

 

이렇게 굳이 switch/case 문 없이도 if/else로 충분히 코드를 작성할 수 있기 때문에 switch/case 문을 지원하지 않는 언어들도 있다. (※ 파이썬은 switch/case문이 없다.)

 

· switch/case 예제를 연습해 봅시다.

· switch/case if 문

 

 

· switch/case 문