ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 - 제어문(if, switch/case, while, for, for each
    자바/Java 공부 2018. 1. 19. 20:44

    -if 문

    다음과 같은 상상을 해 보자.

    "돈이 있으면 택시를 타고 가고 돈이 없으면 걸어 간다."

    위와 같은 상황을 자바에서는 다음과 같이 만들 수 있다.

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

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

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

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

    따라서 위의 예에서 보았던

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

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


    • 비교연산자

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

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


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

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


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

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


    • contains

    List 자료형에는 해당아이템이 있는지 조사하는 contains라는 메소드가 있다. 

    조건문에 많이 활용되는데 어떻게 활용이 되는지 살펴보도록 하자.

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

    ArrayList<String> pocket = new ArrayList<String>();
    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라는 것을 사용한다.

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

    boolean hasCard = true;
    ArrayList<String> pocket = new ArrayList<String>();
    pocket.add("paper");
    pocket.add("handphone");
    
    if (pocket.contains("money")) {
        System.out.println("택시를 타고 가라");
    }else if(hasCard) {
        System.out.println("택시를 타고 가라");
    }else {         
        System.out.println("걸어가라");
    }



    -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 문이 실행되게 된다.


    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); } }


    만약 month에 1에서 12사이의 숫자가 아닌 다른 값이 저장되어 있다면 default: 문장이 수행될 것이다.



    -while


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


    “열 번 찍어 안 넘어 가는 나무 없다” 라는 속담을 적용시켜 보면 다음과 같이 될 것이다.


    int treeHit = 0; while (treeHit < 10) { treeHit++; System.out.println("나무를 " + treeHit + "번 찍었습니다."); if (treeHit == 10) { System.out.println("나무 넘어갑니다."); } }


     treeHit < 10라는 조건문이 거짓이 되어 while문을 빠져 나가게 된다.





    무한루프(Loop)

    while (true) {

    <수행할 문장1> <수행할 문장2> ... }


    예) break의 사용

    int coffee = 10;
    int money = 300;
    
    while (money > 0) {
        System.out.println("돈을 받았으니 커피를 줍니다.");
        coffee--;
        System.out.println("남은 커피의 양은 " + coffee + "입니다.");
        if (coffee == 0) {
            System.out.println("커피가 다 떨어졌습니다. 판매를 중지합니다.");
            break;
        }
    }


    while문 안의 문장을 수행할 때 어떤 조건을 검사해서 조건에 맞지 않는 경우 while문을 빠져나가는 것이 아니라 다시 while문의 맨 처음(조건문)으로 돌아가게 하고 싶을 경우가 생기게 된다.

    예) continue의 사용

    int a = 0;
    while (a < 10) {
        a++;
        if (a % 2 == 0) {
            continue;
        }
        System.out.println(a);
    }


    -for 문

    예 1) 전형적인 for문

    String[] numbers = {"one", "two", "three"};
    for(int i=0; i<numbers.length; i++) {
        System.out.println(numbers[i]);
    }
    for (초기치; 조건문; 증가치)
    

    위 예에서 초기치는 i=0이 되고 조건문은 i<numbers.length 그리고 증가치는 i++ 이 된다. 즉 i값이 numbers의 갯수보다 적을 동안 계속 i값을 1씩 증가시킨다는 의미이다. 

    int[] marks = {90, 25, 67, 45, 80}; for(int i=0; i<marks.length; i++) { if (marks[i] >= 60) { System.out.println((i+1)+"번 학생은 합격입니다."); }else { System.out.println((i+1)+"번 학생은 불합격입니다."); } }


    continue

    위의 예제를 그대로 이용해서 60점 이상인 사람에게는 축하 메시지를 보내고 나머지 사람에게는 아무런 메시지도 전하지 않는 프로그램을 만들어 보자.

    int[] marks = {90, 25, 67, 45, 80};
    for(int i=0; i<marks.length; i++) {
        if (marks[i] < 60) {
            continue;
        }
        System.out.println((i+1)+"번 학생 축하합니다. 합격입니다.");
    }


    for를 이용하면 아주 간단하게 구구단을 출력해 볼 수가 있다.

    for(int i=2; i<10; i++) {
        for(int j=1; j<10; j++) {
            System.out.print(i*j+" ");
        }
        System.out.println("");
    }


    for each


    for each는 J2SE 5.0 부터 추가되었다. for each 라는 키워드가 따로 있는 것은 아니고 동일한 for를 이용한다. 하지만 조건식 부분이 조금 다르다. 보통 다른 언어에서 for each 라고 많이 하므로 자바에서도 보통 for each문이라고 말한다.


    for each 구조로 변경하면 다음과 같다.

    String[] numbers = {"one", "two", "three"};
    for(String number: numbers) {
        System.out.println(number);
    }


    for (type var: iterate) {
        body-of-loop
    }
    

    위 iterate는 루프를 돌릴 객체이고 iterate 객체에서 한개씩 순차적으로 var에 대입되어 for문을 수행하게 된다. iterate부분에 들어가는 타입은 루프를 돌릴수 있는 형태인 배열 및 ArrayList등이 가능하다.

    단, foreach문은 따로 반복회수를 명시적으로 주는 것이 불가능하고, 1스탭씩 순차적으로 반복될때만 사용가능하다는 제약이 있다.