본문 바로가기
Study/JAVA

[Java] 4. 조건문과 반복문

by jeongwle 2022. 8. 31.
728x90
반응형

 

코드의 실행흐름이 위에서 아래로 흐르지만 않고 조건에 따라 문장을 건너뛰기도 하고, 같은 문장을 반복해서 수행해야할 경우도 있다. 이처럼 프로그램의 흐름을 바꾸는 역할을 하는 문장들을 제어문(control statement)이라 한다. 제어문에는 조건문과 반복문이 있다. 조건문은 조건에 따라 다른 문장이 수행되도록 하고, 반복문은 특정 문장들을 반복해서 수행한다.

 

조건문 - if, switch

조건문은 조건식과 문장을 포함하는 블럭({})으로 구성되어 있다. 조건식의 연산결과에 따라 실행할 문장이 달라져 프로그램의 실행흐름을 변경한다. if문과 switch문이 조건문이다. 처리할 경우의 수가 많은 경우 switch문이 효율적이지만 if문보다 사용에 제약이 많아서 if문이 주로 사용된다.

 

1. if문

if문의 조건식이 참이면 괄호{} 안의 문장이 실행된다.

if (조건식) {
    // 조건식이 참(true)일 경우 실행되는 문장
}​


조건식
일반적으로 if문에 사용되는 조건식은 비교연산자와 논리연산자로 구성된다. 조건식의 결과는 반드시 true 또는 false이어야 한다는 것을 기억해두자.

블럭{}
괄호{}를 이용해서 여러 문장을 하나의 단위로 묶을 수 있는데 이것을 블럭(block)이라 한다. 블럭 내에는 보통 여러 문장을 넣지만 한 문장만 넣거나 아예 빈 채로 둘수도 있다. 블럭 내의 문장이 하나 뿐일 때는 괄호{}를 생략할 수 있다. 하지만 가능한 생략하지 않는 것이 바람직하다고 한다.

 

2. if-else문

if문의 변형인 if-else문의 구조는 다음과 같다. if문의 조건식의 결과가 참이 아닐 경우 else 블럭의 문장을 실행하라는 뜻이다.
if (조건식){
  // 조건식이 참일 경우 실행되는 문장
} else {
  // 조건식이 거짓일 경우 실행되는 문장
}​

 

3. if-else if문

처리해야할 경우의 수가 세가지 이상인 경우 사용되는 조건문이다.

if (조건식 1) {
  // 조건식 1이 참일 경우 실행되는 문장.
} else if (조건식 2) {
  // 조건식 2가 참일 경우 실행되는 문장.
} else if (조건식 3) {
  // 조건식 3이 참일 경우 실행되는 문장.
} else {
  // 위의 조건식 모두를 만족하지 않을 경우 실행되는 문장.
}​

 

4. 중첩 if문

if문 블럭 내에 또 다른 if문이 있는 경우로 중첩의 횟수는 제한이 없다.

if (조건식 1) {
  // ...
  if (조건식 2) {
    // 조건식 1과 2 모두 참일 경우 실행되는 문장.
  }
}​

 

5. switch문

switch문은 단 하나의 조건식으로 많은 경우의 수를 처리한다. switch문은 조건식을 먼저 계산한 후 그 결과와 일치하는 case문으로 이동하여 case문에 있는 문장을 실행하며 break문을 만나면 전체 switch문을 빠져나간다.

switch (조건식) {
  case 값1 :
    // 조건식의 결과가 값1일 경우 실행되는 문장
    break;
  case 값2 :
    // 조건식의 결과가 값2일 경우 실행되는 문장
    break;
  // ...
  default :
    // 조건식의 결과와 일치되는 값이 없을 경우 실행되는 문장
}​

default문의 위치에는 제약이 없지만 보통 맨 마지막에 놓기 때문에 break문을 쓰지 않아도 된다. 경우에 따라서 break문을 고의적으로 생략하는 경우도 있지만, break문을 생략하면 case문 사이의 구분이 없어져 다른 break문을 만나거나 switch문의 끝을 만날 때 까지 나오는 모든 문장을 실행시키기 때문에 주의하여야 한다.

switch문의 제약조건
switch문의 조건식은 결과값이 반드시 정수이어야 한다. 이 값과 일치하는 case문으로 이동하기 때문에 case문의 값 역시 정수이어야 한다. case문 또한 중복되면 안된다. 같은 값의 case문이 여러 개일 경우 어디로 이동해야할 지 알 수 없기 때문이다. 그리고 case문의 값은 반드시 상수이어야 한다. 변수나 실수, 문자열은 case문의 값으로 사용할 수 없다.

switch문의 중첩
switch문도 중첩이 가능하다.

switch (조건식) {
  case 1: case 3:
    switch (조건식) {
      case 1:
        // 실행될 문장
        break;
      case 3:
        // 실행될 문장
    }
    break;
  case 2: case 4:
    //...
}​

 

반복문 - for, while, do-while

반복문은 어떤 작업을 반복적으로 실행시킨다. 반복문의 종류로는 for문, while문, while문의 변형인 do-while문이 있다. for문과 while문은 조건식에 따라 단 한 번도 실행되지 않을 수 있으나 do-while문은 무조건 최소한 한 번은 실행이 된다. if문과 마찬가지로 조건식은 true 또는 false로 평가된다. for문과 while문은 구조와 기능이 유사하여 서로 대체가 가능하다. 다만 for문은 주로 반복횟수를 알고 있을 때 사용한다.

 

1. for문

for문은 반복 횟수를 알고 있을 때 적합하다. 구조가 조금 복잡하지만 직관적이어서 이해하기 쉽다.

// 5번 I can do it을 출력하는 for문
for (int i = 1; i <= 5; i++) {
  System.out.println("I can do it");
}​

for문의 구조와 수행순서
for문은 초기화, 조건식, 증감식, 블럭{} 4부분으로 이루어져 있다. 조건식이 참일 동안 블럭 내의 문장이 실행되고 거짓이 되면 반복문을 벗어난다. 제일먼저 초기화가 수행되고 그 다음 부터는 조건식, 증감식, 실행될 문장 순서로 반복된다.

초기화
반복문에 사용될 변수를 초기화 하는 부분이며 처음 한번만 수행된다. 둘 이상의 변수가 필요할 때는 콤마로 구분하여 초기화 하면 된다. 단 두 변수의 타입은 같아야 한다.

조건식
조건식이 참이면 계속 반복되고 거짓일 경우 for문을 벗어난다.

증감식
반복문을 제어하는 변수를 증가 혹은 감소시키는 식이다. 초기화를 둘 이상의 변수를 했을 경우 증감식도 콤마로 구분하여 두 문장 이상을 사용할 수 있다.

중첩 for문
for문도 블럭 내에 또 다른 for문을 사용할 수 있다.

향상된 for문(enhanced for statement)
JDK1.5부터 배열과 컬렉션에 저장된 요소에 접근할 때 기존보다 편리한 방법으로 처리할 수 있도록 for문의 새로운 문법이 추가되었다.

for (타입 변수명 : 배열 또는 컬렉션) {
  // 반복할 문장
}​

int[] arr = {10, 20, 30, 40, 50};

// 일반 for문

for (int i = 0; i < arr.length; i++) {
  System.out.println(arr[i]);
}

// 향상된 for문

for (int tmp : arr) {
  System.out.println(tmp);
}​

향상된 for문은 일반적인 for문과 달리 배열이나 컬렉션에 저장된 요소들을 읽어오는 용도로만 사용할 수 있다는 제약이 있다.

 

2. while문

while문은 if문과 구조가 유사하다
while (조건식) {
  // 조건식의 결과가 참일 동안 반복될 문장.
}​

while문은 조건식을 평가하여 참일 경우 블럭 내의 문장을 실행하고 다시 조건식으로 돌아간다. 조건식이 거짓이 될 때 까지 계속 반복된다. while문은 조건식을 생략할 수 없다.

 

3. do-while문

do-while문은 블럭{}을 먼저 수행한 후에 조건식을 평가한다. 그렇기 때문에 최소한 한번은 실행되는 것이다.

do {
  // 조건식의 결과가 참일 경우 실행될 문장
} while (조건식); // 끝에 세미콜론을 잊지 말자​

자주 사용되지는 않는다.

 

4. break문

반복문에서도 break문을 사용할 수 있다. break문은 가장 가까운 반복문을 벗어난다. 주로 if문과 함께 사용되어 특정 조건을 만족하면 반복문을 벗어나도록 한다. 

public class FlowEx30 {
    public static void main(String[] args) {

        int sum = 0;
        int i = 0;

        while (true) {
            if (sum > 100) {
                break;
            }
            ++i;
            System.out.print(" " + i + " ");
            sum += i;
        }
        System.out.println();
        System.out.println("i = " + i);
        System.out.println("sum = " + sum);
    }

}​

 

5. continue문

continue문은 반복문 내에서만 사용할 수 있다. 반복이 진행되는 동안 continue문을 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어간다. for문의 경우 증감식으로 이동하며, while문과 do-while문의 경우 조건식으로 이동한다. if문과 함께 사용되어 특정 조건일 경우 continue문 이후의 문장들을 수행하지 않고 다음 반복으로 넘어가서 계속 진행하도록 한다. 

public class FlowEx31 {
    public static void main(String[] args) {
        for (int i = 0; i <= 10; i++) {
            if (i % 3 == 0) {
                continue;
            }
            System.out.println("i = " + i);
        }
    }
}​

 

6. 이름 붙은 반복문

break문은 근접한 단 하나의 반복문만 벗어난다. 여러 개의 반복문이 중첩된 경우에는 break문으로 중첩 반복문을 완전히 벗어날 수 없다. 이 때는 중첩 반복문 앞에 이름을 붙이고 break문과 continue문에 이름을 지정해 줌으로써 하나 이상의 반복문을 벗어나거나 반복을 건너뛸 수 있다.

public class FlowEx33 {
    public static void main(String[] args) {
        // for문에 이름 붙이기

        jeongwle :
        for (int i = 2; i <= 9; i++) {
            for (int j = 1; j <= 9; j++) {
                if (j == 5) {
                    break jeongwle;
                }
                System.out.println(i + "*" + j + "=" + i * j);
            }
            System.out.println();
        }
    }
}​

 

 

 

728x90
반응형

댓글