본문 바로가기

Java/자바 기초

4. 조건문과 반복문

if문

만일(if) 조건식이 참(true)이면 괄호{} 안의 문장들을 수행하라.

if (조건식) { 
//조건식이 참(true)일 때 수행될 문장들을 적는다. 
}

블럭{ }

괄호{ }를 이용해서 여러 문장을 하나의 단위로 묶는 것

블럭 안에 문장이 하나뿐일 경우, 괄호{ }는 생략가능하다.

if-else문

기존의 if문에 'else{ }'가 추가된 형태이며, 조건식의 결과가 참이 아닐 때, else{ }의 괄호안 문장을 수행하라는 뜻이다.

if (조건식) { 
//조건식이 참(true)일 때 수행될 문장들을 적는다. 
} else {
//조건식이 거짓(false)일 때 수행될 문장들을 적는다. 
}

if-else if문

if-else if문은 한 문장에 여러 개의 조건식을 사용가능하게 한다.

if (조건식1) { 
//조건식1이 참(true)일 때 수행될 문장들을 적는다. 
} else if (조건식2) {
//조건식2가 참(true)일 때 수행될 문장들을 적는다. 
} else {
  //위의 어느 조건식도 만족하지 않을 때 수행될 문장들을 적는다. else는 생략가능하다.
}

switch문

switch문은 단 하나의 조건식으로 많은 경우의 수를 처리할 수 있으며, 간결하여 알아보기 쉬우나, 제약조건이 존재한다.

switch(조건식){
    case 값1 :
        //조건식의 결과가 값1과 같을 경우 수행될 문장들
        break;
    case 값2 :
        //조건식의 결과가 값2와 같을 경우 수행될 문장들
        break;
    default :
        //조건식의 결과와 일치하는 case문이 없을 때 수행될 문장들
}

break문은 각 case문의 영역을 구분하는 역할을 하는데, 만일 break문을 생략하면 case문 사이의 구분이 없어지므로 다른 break문을 만나거나 switch문 블럭{}의 끝을 만날 때까지 나오는 모든 문장들을 수행한다.

switch문의 제약조건

switch문의 조건식 결과는 정수 또는 문자열이어야 한다.

case문의 값은 정수 상수(문자 포함), 문자열만 가능하며, 중복되지 않아야 한다.

개선된 switch문 (JDK 14이후)

1. 새로운 switch 문장은 하나의 case문장에 여러 개의 조건을 담을 수 있다.

아래 코드는 break 문장의 위험성과 중복된 case 조건의 복잡성을 보여준다. 하나의 case 에는 오직 하나의 조건만이 들어가기 때문에 여러 조건에 걸쳐 처리를 하기 위해서는 break 문장을 이용해서 코드를 작성해야 한다.

 

예를 들어 MONDAY, FRIDAY, SUNDAY에 같은 결과 처리를 위해 MONDAY와 FRIDAY에는 break 문장을 생략하고 SUNDAY에서 그 모든 것을 처리하도록 코딩했다. 하지만 이는 코드를 이해하기 어렵게 만들고 break 문장의 잘못으로 버그가 발생할 수 있으며 나중에 문제 시 디버깅하기도 어려운 코드가 되어 버린다.

switch (day) {
	case MONDAY:
	case FRIDAY:
	case SUNDAY:
		System.out.println(6);
		break;
	case TUESDAY:
		System.out.println(7);
		break;
	case THURSDAY:
	case SATURDAY:
		System.out.println(8);
		break;
	case WEDNESDAY:
		System.out.println(9);

아래와 같이 "case 조건들 -> " 문장을 이용하면 여러 개의 조건을 콤마를 이용해서 기술할 수 있고 코드의 가독성 역시 매우 좋아진다. 단, 주의할 점은 새로운 switch 표현식에는 break를 사용할 수 없으며 사용할 경우 컴파일 에러가 발생한다.

switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}

 

2. switch 에서 값을 리턴할 수 있다.

기존 switch 문장을 case, break, default 를 이용해서 로직을 처리하는 것으로 끝난다. 그래서 case에 따라 특정 값을 설정하려면 다음과 같이 코딩 해야 한다.

int numLetters;
switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        numLetters = 6;
        break;
    case TUESDAY:
        numLetters = 7;
        break;
    case THURSDAY:
    case SATURDAY:
        numLetters = 8;
        break;
    case WEDNESDAY:
        numLetters = 9;
        break;
    default:
        throw new IllegalStateException("Wat: " + day);
}

개선된 switch expressions에서는 다음과 같이 코드를 변경할 수 있다.

// switch 문장이 값을 리턴
int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY                -> 7;
    case THURSDAY, SATURDAY     -> 8;
    case WEDNESDAY              -> 9;
    default -> 0; // 값을 리턴할 경우 default 문장이 반드시 있어야 한다.
};

값을 리턴할 경우 주의할 점은 default 조건이 반드시 있어야 한다. 값을 리턴하지 않을 경우는 조건에 맞지 않으면 수행하지 않고 종료하면 되지만 리턴의 의미는 경우에 맞지 않더라도 반드시 값을 리턴해야 하기 때문이다.

 

3. yield 키워드

스위치 표현식 및 스위치 문장에서 값을 명시적으로 리턴하기 위해 새로운 키워드인 yield를 도입하였다.

 

대부분의 경우 case에 대한 처리는 하나의 문장으로 처리하지만 여러 문장으로 작성해야 하는 경우도 있다.

"case 조건들 -> " 문장을 사용할 때, 여러 문장으로 case 문장을 작성하기 위해서는 {} 으로 코드 블록을 정의해야 한다.

 

아래 예제는 새로운 스위치 표현식의 default 코드 블록에서 값을 리턴하기 위해 yield 키워드를 사용한 것이다.

// 스위치 표현식에서 int 값을 리턴하는 예
int j = switch (day) {
    case MONDAY  -> 0;
    case TUESDAY -> 1;
    default      -> {
        int k = day.toString().length();
        int result = f(k);
        yield result;
    }
};

다음과 같이 yield를 사용하면 에러가 발생한다.

case Monday -> yield 0; //컴파일 에러

기존 스위치 문장에서는 아래와 같이 값을 반환할 때 사용할 수 있다.

// 스위치 문장에서 값 리턴 예
int result = switch (s) {
    case "Foo": 
        yield 1;
    case "Bar":
        yield 2;
    default:
        System.out.println("Neither Foo nor Bar, hmmm...");
        yield 0;
};

for문

반복횟수를 알고 있을 때는 for문을, 그렇지 않을 때는 while문을 사용한다.

for(초기화;조건식;증감식){
    // 조건식이 참(true)인 동안 수행될 문장들을 적는다.
}

while문

조건식이 ‘참(true)인 동안’, 즉 조건식이 거짓이 될 때까지 블럭{} 내의 문장을 반복한다

while(조건식){
    // 조건식이 참(true)인 동안, 반복될 문장들을 적는다.
}

do-while문

while문과 반대로 블럭{}을 먼저 수행한 후에 조건식을 평가한다.

do{
    //조건식의 연산결과가 참일 때 수행될 문장들을 적는다. (처음 한 번은 무조건 실행)
}while(조건식);

break문

break문은 자신이 포함된 가장 가까운 반복문을 벗어난다.

for(int i=1; i<=9; i++){
    if(i==3)
        break; //i가 3일때 for문 밖을 빠져나간다.
}

continue문

continue문은 반복문 내에서만 사용될 수 있으며, 반복이 진행되는 도중에 continue문을 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어간다. for문의 경우 증감식으로 이동하며, while문과 do-while문의 경우 조건식으로 이동한다.

for(int i=1; i<=5; i++){
    if(i==3)
        continue; //i가 3일 때 for문 증감식으로 간다.

    System.out.println(i); 
    /* 결과 
        1
        2
        4
        5
    */
}

이름 붙은 반복문

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

//for문에 Loop1이라는 이름을 붙였다.
Loop1 : for(int i=2;i<=9;i++){
    for(int j=1;j<=9; j++){
        if(j==5)
            break Loop1;
    **}
}

'Java > 자바 기초' 카테고리의 다른 글

6. 객체지향 프로그래밍 I  (0) 2022.03.11
5. 배열  (0) 2022.03.11
3. 연산자  (0) 2022.03.11
2. 변수  (0) 2022.03.11
1. 자바를 시작하기 전에  (0) 2022.02.14