ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] #3 제어문(Control statements)
    Software engineer/Java 2023. 4. 28. 21:59

    제어문(Control statements)

    제어문은 프로그램의 흐름을 제어하는 경우에 사용하는 실행문으로 조건문, 반복문, 분기문 등이 포함되어 있다.

     

    조건문(Conditional statements)

    비즈니스 로직을 구현하는 경우 필수적인 요소이다. 조건문을 통해 수많은 조건에 따라 실행하거나 아니거나 또는 서로 다른 기능을 실행하도록 구현할 수 있다.

     

    하지만 오래된 레거시 프로젝트에 경우 수많은 조건문이 코드 곳곳에 숨어 있어 유지보수하는데 큰 어려움을 주기도 하기 때문에 한번 사용할 때도 신중하게 고려하는 마음을 길러보자.

    if문의 잘못된 예...

     

     

    조건문 종류

    if/ if-else/ if-else if

    if(조건){
    	// 코드
    }

    if문 문법은 조건부에는  true or false가 올 수 있으며, 조건부가  true이면 {}(braces) 안에 있는 코드가 실행된다. 만약 true일 때와 false일 때 각각 코드를 실행하고 싶을 경우는 아래와 같이 사용한다.

    if(조건){
    	// 코드1
    } else {
    	// 코드2
    }

    다음으로는 else if문이 있다. 조건이 여러 개일 경우 사용한다.

    if(조건1){
    	//코드1
    } else if(조건2){
    	//코드2
    } else{
    	//코드3
    }

     

    실무에서는 실제로 좀 더 직관적이고 의미를 전달하기 좋다는 생각에 if return을 많이 사용했다.

    // 현금결제의 경우 결제요청없이 결제완료 처리
    if(PayMethod.CASH == order.payMethod){
    	return PayStatus.COMPLTED;
    }
    return van.proc(order);

     

    switch

    if문 대신 switch문을 사용할 수 있다. 조건이 많아질 경우 많이 사용한다.

    switch(order.vanCode) {
        case VanCode.KICC:
          return new Kicc(order);
        case VanCode.NICE:
          return new Nice(order);
        default:
          throw new InvalidVanCodeException();
    }

     

     

    반복문(Loop statements)

    반복문이란 프로그램 내에서 똑같은 명령을 일정 횟수 또는 조건을 충족할 때까지 반복하여 수행하도록 제어하는 명령문입니다. 실제로도 가장 많이 사용 중인 제어문입니다.

    반복문 종류

    for문

    for문은 초기식, 조건식, 증감식을 갖는 반복문이다.

    /**
    * for (초기식; 조건식; 증감식) {
    * 	// 조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
    * }
    **/
    for (int i=0; i<10; i++) {
    	System.out.println(i);
    }

    변수 i를 int 타입으로 선언 후 0으로 초기화, i가 10보다 작을 때 반복문 실행, 명령문 실행 후 i를 1 더한다.

     

    while문

    while문은 특정 조건이 참일 경우 명령문을 계속해서 반복합니다.

    /**
    * while (조건식) {
    * 	// 조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문; 
    * }
    **/
    
    int i = 0; 
    while (i < 5) {
        System.out.println(i);
        i++; // 이 부분을 삭제하면 무한 루프에 빠지게 됨.
    }

    위의 주석에서처럼 i를 1씩 증가시켜주지 않으면, i=0으로 무한하게 명령문을 실행한다.

     

    do-while

    do-while문은 while문과 같지만 다른 점은 무조건 1회 실행한다는 점이다.

    /**
    * do {
    * 	// 조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
    * } while (조건식);
    **/
    int i = 0;
    do {
      System.out.println(i);
      i++;
    } while(i < 10);

     

    Enhanced for문

    JDK 1.5부터 추가된 배열과 컬렉션의 모든 요소를 참조하기 위해 새롭게 추가되었습니다. 배열과 컬렉션 프레임워크에서 유용하게 사용됩니다.

    /**
    * for(타입 변수이름: 배열 or 컬렉션){
    * 	// 배열의 길이만큼 반복적으로 실행하고자 하는 명령문;
    * }
    **/
    int[] items = new int[]{1,2,3,4,5};
    for(int item:items){
    	System.out.println(item);
    }

    간결하면서 가시성도 좋아 자주 사용하지만 무조건적으로 모든 배열 또는 컬렉션의 길이만큼 반복한다. 

     

    반복문 성능

    현대에 와서는 각각의 반복문이 큰 성능차이를 보이진 않지만, 자주 사용되는 만큼 알아두면 좋을 것 같다.

    Java 17, 1.8 반복문 성능 비교 표

    https://tonisagrista.com/blog/2022/java-loop-performance/

     

    Performance analysis of Java loop variants

    From time to time I profile Gaia Sky to find CPU hot-spots that are hopefully easy to iron out. To do so, I launch my profiler of choice and look at the CPU times for the top offender methods. Today I went through such a process and was surprised to find a

    tonisagrista.com

     

     

    분기문(Jump statements)

    분기문은 조건문과 반복문 중간에 주어진 조건의 흐름을 바꿀 수 있는 구문이다. 조건에 따라 프로그램의 실행 내용이 분기되는 것을 의미한다.

     

    break/ break label

    break문은 switch문 또는 반복문을 벗어나는 데 사용된다. 주로 if문과 함께 사용되어 특정 조건을 만족하면 반복문을 벗어나도록 한다. 즉, 반복을 탈출하는 역할을 한다.

    int answer = 32;
    int items[] = new int[]{12, 32, 24};
    for(int item:items){
        if(item == answer) {
            break;
        }
    }

    items의 길이는 3으로 3번 반복해야 하지만, if문에서 item이 answer와 같다면 break를 만나 반복문을 종료한다.

     

    break label은 C언어의 goto와 같은 기능을 한다.

    int i = 0;
    boolean isContinue = false;
    loop:{
        isContinue = isContinue ? false : true;
        while (isContinue){
            System.out.println("i=" + i);
            if(i==2) break loop;
            i++;
        }
    }

    위의 코드는 break label의 동작을 확인하기 위한 코드이다. 기능은 존재하지만 사용하지 않아야 한다. 만약 코드가 길어진다면 label이 어디에 어떻게 정의되어 있고 어디까지 영향을 미칠지 모르기에 예기치 못한 문제가 발생할 여지가 다분하다. C언어에서도 마찬가지로 goto 기능은 금지된 문법으로 불린다. 절대절대 사용하지 않기로!

     

    continue

    continue문은 반복문 내만 사용될 수 있으며, 반복이 진행 중에 continue문을 만나게 되면 반복문의 끝으로 이동하여 다음 반복으로 넘어간다. for문의 경우 증감식으로 이동하며, while문과 do-while문의 경우 조건으로 이동한다. continue문은 반복문 전체를 벗어나는 것이 아니라 다음 반복을 계속 수행한다는 점이 break문과 큰 차이점이 있다. 주로문과 함께 사용되어 특정 조건을 만족하는 경우에 continue문 이후의 문장들을 수행하지 않고 다음 반복으로 넘어가서 계속 진행하도록 한다. 전체 반복 중에 특정 조건을 만족하는 경우를 제외하고자 할 때 유용하다.

    for(int i=0; i<10; i++ ){
        if(i%2 == 0) continue;
        System.out.println("i=" + i);
    }

    이런 식으로 2로 나누어지는 수는 continue를 통해 print문을 실행하지 않고 바로 증감식으로 이동하여 다음 반복을 진행한다. 따라서 홀수만을 print 할 수 있다.

     

    return

    return 문은 메서드를 종료하고 값을 반환하는 데 사용됩니다. 메서드 내부에서 return 문을 만나면, 해당 메서드의 실행을 즉시 종료하고 return 문 뒤에 지정된 값을 반환합니다. return 문은 메서드 내에서 여러 번 사용될 수 있습니다. 하지만, 한 번의 메서드 호출에서는 최대 한 번의 값을 반환할 수 있습니다.

    아래는 return 문을 사용한 예제입니다.

    public class Calculator {
        public int add(int a, int b) {
            return a + b;
        }
    
        public int subtract(int a, int b) {
            return a - b;
        }
    
        public int multiply(int a, int b) {
            return a * b;
        }
    
        public double divide(int a, int b) {
            if (b == 0) {
                throw new IllegalArgumentException("Cannot divide by zero");
            }
            return (double) a / b;
        }
    }

    위 예제에서는 Calculator 클래스에서 네 개의 메서드를 정의하고 있습니다. 각 메서드는 주어진 두 개의 숫자에 대해 각각 덧셈, 뺄셈, 곱셈, 나눗셈 연산을 수행하고 결과 값을 반환합니다. 나눗셈 메서드(divide)에서는 b가 0인 경우 IllegalArgumentException을 발생시키고 있습니다. 이 경우 메서드가 종료되고 호출한 측에서 예외를 처리할 수 있습니다. return 문을 사용하여 메서드에서 값을 반환할 수 있기 때문에, 메서드를 효과적으로 활용할 수 있습니다.

     

Designed by Tistory.