본문 바로가기

Java

Java (각 반복문 종류와 응용)

If, Else, ElseIf, SwitchCase, For, While, DoWhile, Break, Continue 를 알아볼 것이다. 각각은 반복문을 나타내기도 하고 그 반복문을 더 응용하기 위한 메서드도 존재한다. 또한 같은 반복문이더라도 각 상황에 맞는 반복문을 쓰는 것이 중요하다.

 

반복문은 백준을 비롯하여 다양한 코드에서 많이 쓰이니 반드시 숙지하고 있어야 한다.

 

1. IF, Else, Else If, Switch Case, For, While, Do While = 각 종 반복문

// 조건문 If
int hour = 15; // 오후 3시

// if 문 내에서 하나의 문장을 실행할 때는 { } 생략 가능
if(hour < 14)
    System.out.println("아이스 아메리카노 +1");

// if 문 내에서 2개 이상의 문장을 실행할 때는 { } 생략 불가
if (hour < 14) {
    System.out.println("아이스 아메리카노 +1");
    System.out.println("샷추가");
}
System.out.println("커피 주문 완료 #1");

 

만약이라는 뜻을 가진 If 사용 시, {} 중괄호로 덮어주는 것이 일반적이지만, 하나의 문장을 실행 시 생략은 가능하다. 하지만 문장을 통일성을 유지하기 위해 본인은 다 덮는 편이다.

 

코드를 보면 hour 변수의 값이 14보다 적으면 println하도록 되어있지만, 괄호 안의 답은 거짓이니 중괄호 내에 있는 코드들은 실행이 되지않는다. 물론 ! 를 써서 if 조건문을 좀 더 응용하거나 && (AND 연산자), || (OR 연산자)를 사용하여서 작성하여도 좋다,

 

hour = 15;
boolean morningCoffee = false; // 모닝 커피
if (hour < 14 && !morningCoffee) {
    System.out.println("아이스 아메리카노 +1");
}
System.out.println("커피 주문 완료 #2");

 

AND 연산자를 사용하여 if의 조건문을 좀 더 응용해보았다. 조건문 내에서는 변수가 14보다 작아야 하며 boolean 값이 true여야 한다. boolean 값은 참을 만족하지만 hour 변수는 조건을 만족하지 못하므로 || (OR 연산자) 였으면 if문 중괄호를 실행하였겠지만 둘 다 참을 만족하지 못하므로 밖의 코드를 실행하여 단순 커피 주문 완료 #2만 출력이된다  

 

hour = 15;
morningCoffee = false;
if (hour >= 14 || morningCoffee) {
    System.out.println("아이스 아메리카노 (디카페인) +1");
}
System.out.println("커피 주문 완료 #3");

 

OR 연산자를 사용한 것으로 조건문 내에서 hour 변수가 참을 만족하므로 if 내 중괄호 코드를 실행하게 된다.

int hour = 10;
if (!(hour < 14)) {
    System.out.println("hour is not less than 14");
} else {
    System.out.println("hour is less than 14");
}

 

마지막으로 ! 를 응용을 해보겠다. 다음의 코드를 보게되면 hour이 14보다 작기에 (hour < 14)는 참이 되지만 앞에 !가 붙어 있게 되므로 참은 반대인 거짓으로 변하게 되어, 중괄호 안에 코드를 실행하는 것이 아닌 else 문을 실행하게 된다.  

 

else를 소개해보자면, 한국말 그대로 그 외 나머지 즉 if의 조건문에 만족하지 않는 나머지들은 else의 중괄호에 있는 코드를 실행하게 된다.

 

int hour = 10;
if (hour < 14) {
    System.out.println("아이스 아메리카노 +1");
}
else {
    System.out.println("아이스 아메리카노 (디카페인) +1");
}
System.out.println("커피 주문 완료 #1");

// 오후 2시 이후이거나 모닝 커피를 마신 경우?
hour = 15;
boolean morningCoffee = true;
if (hour >=14 || morningCoffee) {
    System.out.println("아이스 아메리카노 (디카페인) +1");
} else { // 그 외의 경우
    System.out.println("아이스 아메리카노 + 1");
}
System.out.println("커피 주문 완료 #2");

 

 

if (조건) {
    // 조건이 참일 때 실행되는 코드
} else {
    // 조건이 거짓일 때 실행되는 코드
}

 

여기서 궁금증이 생긴다. 작성해야 하는 코드가 단순하여 if else만 쓰게 된다면 편하겠지만. 조건문을 다양하게 작성하여 그 조건에 맞는 코드를 반환하여야 할 때가 더 많을 것이다. 그래서 우리는 Else If를 활용하면 된다.

 

if (조건1) {
    // 조건1이 참일 때 실행되는 코드
} else if (조건2) {
    // 조건2가 참일 때 실행되는 코드
} else if (조건3) {
    // 조건3이 참일 때 실행되는 코드
} else {
    // 모든 조건이 거짓일 때 실행되는 코드
}

 

다양한 조건들을 생성하여, if문 만이 조건문을 가지게 하지 않게 하여서 다양한 상황에서 그에 맞는 코드를 제출할 수 있게 하도록 하며, 만일 모든 조건이 참으로 만족하지 못할 시, 마지막 else 구문을 반환하는 구조이다.

 

다음은 Switch Case를 알아보겠다. 우선 Swich Case는 하나의 변수나 표현식의 값에 따라 여러 가지 경우로 분기해야 할 때 사용이 되면 좋다. 예를 들어 A, B 와 같은 성적에 따른 장학금과 같이 명확한 케이스로 나뉘어지는 상황이다.

 

switch (변수 또는 표현식) {
    case 값1:
        // 값1에 해당하는 코드 실행
        break;
    case 값2:
        // 값2에 해당하는 코드 실행
        break;
    // ...
    default:
        // 모든 case에 해당하지 않을 때 실행되는 코드 (선택사항)
}

 

case에 값을 넣고 그 값에 따라 반환하고 싶은 코드를 작성하면 된다. 마지막 default는 else 처럼 모든 case에 해당되지 않을 때 실행되는 코드이다.  이는 다양하게 활용될 수 있다.

 

ranking = 4;
switch (ranking) {
    case 1: // ranking의 값이 1일 경우
        System.out.println("전액 장학금");
        break; // 1일 때는 switch문을 빠져 나옴
    case 2:
        System.out.println("반액 장학금");
        break;
    case 3:
        System.out.println("장학금 대상 아님");
        break;
    default: // 그 외의 경우 일 때 수행
        System.out.println("장학금 대상 아님");
}

 

다음과 같은 경우라면 모든 case에 만족하지 못하므로 마지막 default에서 실행이 된다. 만일 case들 끼리의 통합을 하고싶을 땐 다음의 코드 예시를 보면 된다.

 

ranking = 2;
switch (ranking) {
    case 1: // ranking의 값이 1일 경우
        System.out.println("전액 장학금");
        break; // 1일 때는 switch문을 빠져 나옴
    case 2: // break가 없으니 다음 케이스로 넘어감
    case 3: // 결론 적으로 케이스를 통합 가능
        System.out.println("장학금 대상 아님");
        break;
    default: // 그 외의 경우 일 때 수행
        System.out.println("장학금 대상 아님");
}

 

위의 코드에서 중요한 점은 break의 위치이다. break는 case실행 시, 해당 값에 맞는코드를 반환하고  break를 마주치면 그 아래에 있는 코드를 반환하지 않도록 하는 것인데, break위치를 case 2 에서는 비워두고 case 3에서 break를 작성하였으므로, 변수 값이 2일 경우 case 2 코드가 순차적으로 내려가 case 3의 코드가 반환이 되며 break에서 멈추게 된다.

int grade = 1;
int price = 7000;
switch (grade) {
    case 1:
        price += 1000; // 1등급일 경우가 case1일 텐데, break가 없으니 1000원을 3번 더하게 되어진다.
    case 2:
        price += 1000;
    case 3:
        price += 1000;
        break;
}

 

위의 코드 주석에서 알 수 있듯이, break가 맨 아래에 있으므로 case가 1, 2 일 경우 계속해서 내려가게 되므로 각 case의 코드로 인해 변수가 +1000을 계산하게 된다.

 

다음으로 알아볼 것은 For 반복문이다. 

for (초기화; 조건; 증감식) {
    // 반복해서 실행할 코드
}

 

초기값: 반복문이 시작될 때 한 번만 실행되는 부분으로 주로 반복 변수의 초기값을 설정하는 부분입니다. 

조건: 각 반복마다 검사되는 부분입니다. 조건이 참(True)인 동안 반복문이 계속 실행됩니다. 조건이 거짓(False)이 되면 반복문이 종료 된다.

증감식: 각 반복이 끝난 후에 실행되는 부분으로 주로 반복 변수를 증가 또는 감소시키는 역할을 합니다.

 

// 반복문 사용 For (조건이 거짓이 될 때 까지 반복문은 돌아간다)
for (int i = 0; i < 10; i++) { // i가 10이 되면 조건문은 거짓이 되므로 반복문 종료
    System.out.println("안녕하세요 진영입니다" + i);
}

 

초기값은 i = 0, 조건은 i < 10, 증감식은 i++이다. 즉 i가 값이 만족할 값인 경우에는 중괄호 내의 코드를 실행하고 증감식을 거쳐 i값이 변경되고 그 변경된 값이 조건식에 만족하지 못할 경우에는 반복문이 종료가 되는 구조이다.

 

for 반복문을 응용해보겠다.

// 짝수만 출력 = 0, 2, 4, 6, 8, 10 // fori 단축키 사용시 int i와 중괄호가 자동 설정 됨
for (int i = 0; i <= 10; i += 2) {
    System.out.print(i);
}
// 홀수만 출력 1, 3, 5, 7, 9
for (int i = 1; i <=10 ; i+=2) {
    System.out.print(i);
}

 

초기값을 다르게 함으로써, 홀수와 짝수를 달리 해놓았다.

// 거꾸로 숫자
// 5, 4, 3, 2, 1
for (int i = 5; i > 0; i-=1) { // i가 0이 되면 조건이 만족되지 않으므로 반복문 종료됨
    System.out.print(i);
}

 

증감식이므로 i를 무조건 더하는 것이 아닌 - 값을 넣어줌으로 초기값을 마이너스로 떨어뜨리게 할 수 있다.

    // 1부터 10까지의 수들의 합
    // 1 + 2 + ... + 10 = 55
    int sum = 0;
    for (int i = 1; i <= 10 ; i++) {
        sum +=i;
        System.out.println(sum);
    }
}

 

sum 변수는 for 반복문 중괄호 내에 있으므로, 반복문이 한 번 돌 때마다 실행이 된다. 그러면 각 i 값을 반복문이 실행될 때마다 쌓이게 되므로 합친 값을 쉽게 알아낼 수 있다.

 

마지막으로 while 반복문이 있다. while 반복문은 조건이 참(True)인 동안 코드 블록을 반복해서 실행하는 제어 구조이고 조건이 거짓(False)이 되면 반복문이 종료다. while 반복문은 다음과 같은 기본 구조를 가지고 있다.

while (조건) {
    // 조건이 참일 때 실행되는 코드
}
  // 반복문 While
    int distance = 25; // 전체 거리 25m
    int move = 0; // 현재 이동 거리 0m

    while (move < distance) { // 현재 이동거리가 전체 거리보다 작다는 조건이 참인 동안 반복 수행
        System.out.println("발차기를 계속 합니다");
        System.out.println("현재 이동 거리: " + move);
        move += 3;
    }
    System.out.println("도착하였습니다");
}

 

while의 조건문으로 move가 distance 가 작게 되면 자동으로 반복문은 종료가 된다 정리하자면,

 

while 반복문은 반복 횟수가 정해지지 않은 상황이나 특정 조건을 만족할 때까지 반복해야 할 때 유용하다, 주의할 점은 반복문에서 조건을 항상 종료 조건으로 변경할 수 있도록 하는 것이 중요하며, 무한 루프를 방지하기 위해 조건을 적절하게 제어해야 한다.

 

그런데 만약 조건이 바로 불만족하게 되어서 코드를 실행시키지 못하게 되는 경우인데, 한 번은 코드를 반환하고 싶을 때 쓰이는 메서드가 있다. 바로 do-while 반복문으로 아래의 코드를 참조해보자. 

// 키가 엄청나게 크다면? // 조건이 거짓이기에 바로 벗어나 반복문을 수행하지 않는다
    move = 0;
    height = 25;

    while(move + height < distance) {
        System.out.println("발차기를 계속 합니다");
        System.out.println("현재 이동 거리: " + move);
        move += 3; // 3m 이동
    }
    System.out.println("도착했습니다");


    // Do while 반복문 // 조건이 바로 거짓이 되어도 한 번은 실행시킴
    do {
        System.out.println("발차기를 계속 합니다");
        System.out.println("현재 이동 거리: " + move);
        move += 3;
    } while (move + height < distance);
    System.out.println("도착했습니다");
}

 

위의 while문은 조건이 바로 거짓이 되기 때문에 애초부터 반복문 자체가 실행이 되지 않는다. 하지만 Do while 반복문사용 시, 위의 조건처럼 바로 거짓이 되어도 do  중괄호 내에 있는 코드들은 실행이 되게 된다.

 

2.Break

int max = 20;
for (int i = 1; i <= 50 ; i++) {
    System.out.println(i + "번 손님, 주문하신 치킨 나왔습니다");
    if (i == max) {
        System.out.println("금일 재료가 모두 소진되었습니다");
        break; // <- if 문 작동시 반복문 종료
    }
}
System.out.println("영업을 종료합니다");

 

break 문은 반복을 강제로 종료시키는 역할을 합니다. if (i == max) 조건이 참이 되면, 즉 i가 max와 같아지면 break 문이 실행되어 반복문이 종료됩니다. 이후의 반복문 내용은 실행되지 않습니다.

int index = 1; // 손님 대기 번호
while (index <= 50) {
    System.out.println(index + "번 손님, 주문하신 치킨 나왔습니다");
    if (index == max) {
        System.out.println("금일 재료가 모두 소진되었습니다");
        break;
    }
    index++;
}
System.out.println("영업을 종료합니다");

 

3. Continue

continue는 반복문 내에서 현재 반복을 중지하고 다음 반복으로 넘어가는 역할을 합니다.

// 치킨 주문 손님중에 노쇼 손님이 있다고 가정
// For
int max = 20;
int sold = 0;
int noShow = 17;
for (int i = 1; i <= 50; i++) {
    System.out.println(i + "번 손님, 주문하신 치킨 나왔습니다");

    // 손님이 없다면??
    if (i == noShow) {
        System.out.println(i + " 번 손님, 노쇼로 인해 다음 손님에게 기회를 넘어갑니다");
        continue; // 즉시 밑에 코드는 작동 시키지 않고 다음 회차로 넘어가게 된다
    }

    sold++; // 판매처리,  continue는 이 코드가 먹히지 않으므로 총 20 번에서 노쇼가 제외된 21번 손님까지 나오게 된다
    if (sold == max) {
        System.out.println("금일 재료가 모두 소진되었습니다");
        break;
    }
}
System.out.println("영업을 종료합니다");

 

i 변수가 noShow와 같을 때 (즉, 노쇼 손님의 경우), continue가 실행되어 현재 반복에서 더 이상 아래 코드를 실행하지 않고 다음 반복으로 넘어갑니다. 따라서 노쇼 손님이 주문을 했을 때, 해당 주문에 대한 처리를 하고 그 아래에 있는 sold++ 코드는 실행되지 않습니다.

 

이렇게 continue를 사용함으로써, 노쇼 손님을 처리하고 나서도 반복문은 중단되지 않고 다음 주문을 처리할 수 있게 된다. 즉, continue를 사용하여 노쇼 손님을 건너뛰고 다음 주문 손님에게 기회를 줄 수 있습니다.

 

 

'Java' 카테고리의 다른 글

Java (배열)  (1) 2023.12.31
Java (이중 반복문)  (0) 2023.12.31
Java (문자열 메서드 및 이스케이프 문자)  (0) 2023.12.30
Java (연산자 정리)  (1) 2023.12.30
Java (타입 및 형 변환)  (1) 2023.12.30