Java

4주차 - 제어문

voider 2020. 12. 11. 00:54

https://github.com/whiteship/live-study/issues/4

제어문

제어문이란 말 그대로 코드를 '제어'해야 할 때 쓴다. 이를테면 어떤 조건(if-else/switch)에 따라 다르게 동작해야 할 때라든가, 같은 코드를 반복(loop)해야 할 때 쓰는 문(statement)을 제어문이라고 한다.

조건문(if-else)

  • if-else문의 기본 문법

      if(조건식) {
          //조건에 맞을 때 수행할 문장
      } else {
          //조건에 맞지 않을 경우 수행할 문장(생략 가능)
      }

    조건식의 결과는 반드시 boolean타입(true/false)이어야 한다.

  • if - else if문

    if의 조건식이 맞지 않을 때 다른 조건식을 충족하는지 확인할 때 사용하는 것이 else if절이다.

    if(조건식1) {
        //....
    } else if(조건식2) {
        //...
    } else if(조건식3) {
        //....
    } else {
        //else블럭 생략 가능
    }

    else if문을 활용하면 이런 식으로 여러 조건식을 검사할 수 있다.

  • 중첩 if문

    if-else (if)문 안에 다시 if-else문을 넣을 수 있다. 조건1이 맞으면 조건2도 맞는지 체크하고, 조건 2가 맞으면 조건3도 맞는지 체크할 수 있다.

    if(조건식1) {
        if(조건식2) {
            if(조건식3) {
                 //...   
            } else{
                //생략가능
            }
        } else {
            // 생략 가능
        }
    } else if {
        if(false) {
           //....
        }
    } else {
        if(false) {
            //...
        } else {
            //...
        }
    }

    이렇게 복잡하게 쓸 일은 별로 없지만, 이런 식으로 사용하는 것도 불가능한 것은 아니다.

선택문(switch)

소위 switch문이라 불리는 선택문이 하는 일은 if-else문과 다르지 않다. 처리해야 하는 조건이 많다면 switch문으로 좀 더 보기 좋게 코드를 짤 수 있다. 이를테면 학년 마다 다른 작업을 수행해야 하는 경우 if문이 늘어나면서 코드의 가독성이 떨어질 수도 있다. 그럴 때 switch문을 사용하면 좀 더 읽기 쉬운 코드를 짤 수 있다.

  • 기본 문법

    switch(조건식) {
        case 값1 :
            //실행 내용
            break;
        case 값2 :
            //실행 내용
            break;
        case 값3 :
            //실행 내용
            break;
        default : 
            // 맞는 조건이 없을 때 실행할 내용
    }

    주의해야 할 것이 몇 가지 있다.

    1. switch문의 조건식에는 정수 또는 문자(열)만 들어갈 수 있다.
    2. case문의 값으로는 상수(final)인 정수 또는 문자(열)만 올 수 있다.
    3. break로 case문의 끝을 맺어주지 않으면 다음 break를 만날 때까지 다음 case문으로 계속해서 넘어간다. 의도적으로 빼는 경우도 있다.

    if-else문에서 설명한 것처럼 swtich문 또한 중첩해서 사용할 수 있다.

반복문(loop)

반복문은 어떤 일을 반복해야 할 때 사용한다. 넓게는 for문과 while문으로 나눠볼 수 있다.

for

  • 문법

    for(변수 초기화; 조건식; 증감식;) {
        //내용
    }
    
    for(int i; i<10; i++) {
        //반복할 내용
    }
    
    for(;;) { //무한 반복. 조건을 맞춰 break/return해줘야 한다.
      //,,,   
    }

    반복문이 동작하는 순서는

    1. 변수 초기화 (시작할 때 한 번만 초기화 된다.)
    2. 조건식
    3. 반복할 내용
    4. 증감
    5. 다시 조건식부터 반복

    필요하다면 콤마(,)를 구분자로 해서 변수를 두 개 이상 넣을 수도 있지만 그렇게는 잘 사용하지 않는다.

    당연히 for문 또한 여러 번 중첩해서 사용할 수 있다.

    breakreturn 키워드를 사용해서 for문을 빠져나올 수 있다. 보통 어떤 조건문과 결합해서 반복하다가 어떤 조건이 성립되면 반복문을 멈추는 용도로 쓴다.

향상된 for문

만약 배열이나 컬렉션에 든 요소를 전부 출력해야 한다면 stream을 사용할 수도 있겠지만 향상된 for문으로도 편리하게 출력할 수 있다.

  • 문법

    List<Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7,8,9));
    
    for(int number : numbers) {
        System.out.println(number);
    }
    
    //result - 1 2 3 4 5 6 7 8 9

    위처럼 numbers의 요소들을 number에 하나씩 대입해서 출력한다. 반복문에서 변수를 사용할 필요가 없다면 향상된 for문을 사용하는 것도 좋은 방법이다.

while

for문은 얼마나 반복해야 할 지 알고 있을 때 주로 사용한다. while문은 얼마나 반복될지는 알 수 없고 조건식이 맞을 동안만 반복해야 할 때 주로 사용한다.

while(조건식) {
    //반복할 코드
}

더 이상 조건이 맞지 않을 때까지 반복한다. 조건식에 true를 주고 무한 반복을 하면서 어떤 조건에 맞으면 break를 사용해서 while문을 빠져나오기도 한다.

do - while

while문은 조건식이 false라면 단 한 번도 수행되지 않는다. do-while문은 순서를 바꿔서 조건이 맞지 않더라도 반드시 한 번은 수행되어야 할 작업이 있을 때 사용한다.

  • 문법

    do {
        //반드시 한 번은 실행되는 코드
        //조건식이 맞다면 반복한다.
    } while(조건식);

continue

위에서 breakreturn을 사용해서 조건이 맞을 때 반복문을 빠져나오기도 한다고 설명했다. 반복하다가 continue를 만나면 더 이상 작업을 수행하지 않고 다음 반복으로 넘어간다.

  • 문법

    for(int i=0;i<10;i++) {
        if(i%2==0) continue; //실행해야 할 문이 한 줄일 때 {} 생략 가능
        System.out.print(i);
    }
    
    //result : 1 3 5 7 9

이름 붙인 반복문

break를 사용하면 반복문을 벗어날 수 있다고 설명했다. break는 하나의 반복문만 멈출 수 있다. 따라서 중첩된 반복문 안에서 사용한다면 완전히 반복문을 빠져나갈 수 없다. return을 이용해서 해결할 수 있긴 하지만, 반복문에 이름을 붙이는 것으로 해결할 수도 있다.

  • 문법

    hasNameLoop : for(int i = 0; i < 10; i++) {
        for(int j=0; j<i; j++) {
            if(j==5) break hasNameLoop;    //hasNameLoop라는 이름을 가진 반복문 밖으로 나온다.
            System.out.print("*");
        }
    }

    while문 앞에도 이름을 붙일 수 있다.

'Java' 카테고리의 다른 글

6주차 - 상속  (0) 2020.12.25
5주차 - 클래스, 생성자, 객체, this, 메소드  (0) 2020.12.19
자바 람다식(Java Lamda Expression)  (0) 2020.10.29
Hassing & HashFunction  (0) 2020.09.10
예외처리  (0) 2020.09.10