본문 바로가기

Etc../SWExpertAcademy

[Java Programming] 자바언어의 구조와 기본문법 (4)

자바 제어문

■ 조건 제어문

  • if / if-else : 조건에 따른 단순 분기처리

  • if - else if / switch : 조건에 따른 다중 분기 처리

  • if / if-else if / if-else : Ture/False를 리턴하는 조건식 필요

  • switch : case에 해당하는 값 필요

if 문

if(Expression){
    statement1;
}
statement2;

if문 내 조건을 만족하면 statement1 수행 후 다음 구문으로 넘어감.

조건을 만족하지 않으면 statement2 수행

if-else문

if(Expression){
    statement1;
}
else{
    statement2;
}
statement3;

if문 내 조건식이 True라면 statement1 수행 후 statement3 수행

False라면 statement2 수행 후 statement3 수행

if-else if문

if(Expression1){
    statement1;
}
else if(Expression2){
    statement2;
}
else{
    statement3;
}
statement4;

if문 내 조건식1이 Ture라면 statement1 수행 후 statement4 수행

조건식1이 False이고 조건식2가 True라면 statement2 수행 후 statement4 수행

조건식1,2가 모두 False라면 statement3 수행 후 statement4 수행

switch문

switch(Expression){
    case value1: 
        statement1;
        break;
    case value2:
        statement2;
        break;
    default:
        statement3;
        break;
}
statement4;

switch문의 Expression의 결과는 char, byte, short, int형만 가능

Expression의 결과에 해당하는 value의 case문으로 이동 후 statement 수행

break가 있다면 switch문을 빠져나간 후 statement4 수행

결과와 일치하는 value가 없다면 default로 이동함.

만약 break문이 없다면 다음 case문의 value가 일치하지 않더라도 이어서 수행하게 됨.

ex1) case value1의 내부에 break문이 없을 때,

switch(Expression){
    case value1: 
        statement1;
    case value2:
        statement2;
        break;
    default:
        statement3;
        break;
}
statement4;

Expression의 결괏값이 value1이라면 statement1, statement2 수행 후 break를 만나 statement4 수행

import java.util.Scanner;

public class SwitchTest{
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        int month = sc.nextInt();
        switch(month){
            case 3:
            case 4:
            case 5:
                System.out.println(month + "월은 봄입니다.");
                break;
            case 6:
            case 7:
            case 8:
                System.out.println(month + "월은 여름입니다.");
                break;
            case 9:
            case 10:
            case 11:
                System.out.println(month + "월은 가을입니다.");
                break;
            case 12:
            case 1:
            case 2:
                System.out.println(month + "월은 겨울입니다.");
                break;
            default:
                System.out.println("1~12 사이의 숫자만 입력하세요.");
                break;
        }
        sc.close();
    }
}

입력되는 숫자가 어느 계절에 해당하는 월인지 출력하는 코드

만약 9를 입력하면 11에 해당하는 case문을 수행하고 종료하게 된다.

1~12를 벗어나는 수를 입력하면 defalut 내부의 코드를 수행하게 된다.

■ 반복 제어문

  • for / while : 조건에 따라 특정 문장이 수행되지 않을 수 있음
  • do-while : 무조건 한번은 수행됨.

반복 제어문에 사용되는 조건식의 연산 결과는 True/False 이어야 함.

for문

for(초기식; 조건식; 증감식){
    statement1;
}
statement2;
  • 초기식 : 반복횟수 제어, 한번만 실행됨.
  • 조건식 : 조건식이 true일 동안 반복 실행. false일 경우 종료
  • 증감식 : 조건식이 무한반복되지 않도록 함. / statement1이 수행된 후 증감식 실행

for 블록 내 선언된 변수는 for블록 내부에서만 사용 가능함.

//오류 구문
public static void main(string args[]){
    for(int i=0; i<10; i++){
        statement1;
        int i = 20;    // for문 내에 이미 i가 선언되어 있어 같은 이름으로 선언 불가능(error)
    }
    System.out.println("최종 i값 : " +i); // for문 내 선언된 변수는 외부에서 호출할 수 없음.
}

while문

while(조건식){
    statement1;
}
statement2;

조건식이 True일 동안 statement1을 반복 수행함.

무한루프에 빠지지 않도록 내부에 증감식 또는 탈출구문(break) 필요

조건식이 false가 되면 statement2 수행

// while문 활용 예
// 1~100까지 짝수의 합을 출력하는 프로그램

public static void main(String args[]){
    int i = 1, sum = 0;

    while(i<=100){
        if((i % 2) == 0) sum += i;     // i가 짝수일 경우 sum에 i를 더하여 sum에 할당.
        i++;                           // 무한루프에 빠지지 않도록 증감식 설정.
    }
    System.out.println("1~100사이 짝수의 합: " + sum);

}

do-while문

while문과 비슷하나 반복문을 제어하는 식이 반복 블록 다음에 있음.

표현식이 false라도 최소한 한번은 실행함.

while문 뒤에 세미콜론(;) 필요.

do{
    statement1;
}while(조건식);
statement2;

■ 이동 제어문

  • break : 반복문에서 쓰이면 반복문 자체를 종료, switch문에서 쓰일 경우 switch블록을 종료
  • continue : 반복문(for, while)에서 현재단계의 수행을 생략하고 다음 반복구문으로 넘어감
  • return 메서드의 수행을 종료하고 메서드가 호출된 곳으로 제어를 이동시킴.

Label을 사용한 break와 continue

Label이 정의된 영역만큼 break와 continue가 적용됨.

  • break
outer: for(int i=0; i<4; i++){
        for(int j=0; j<3; j++){
            if(i==2) break outer; //outer 레이블이 붙은 for문을 종료함.
            System.out.println(i +" "+ j);
        }
}

Label없이 break문만 쓰였을 경우 : i=2일 때 j가 선언되어있는 반복문을 탈출하고 i=3인 for문을 마저 실행함.

  • continue
outer: for(int i=0; i<4; i++){
        for(int j=0; j<3; j++){
            if(i==2) continue outer;     //outer 레이블이 붙은 for문의 다음 반복을 수행함
            System.out.println(i +" "+ j);
        }
}

∴ Label로 인해 프로그램이 복잡해질 우려가 있으므로 사용을 권장하지 않음


[참고] : SWExpertAcademy