[JAVA] 제어문

728x90

제어문에는 조건문, 반복문 등이 있습니다.

1.조건문

1) if-else문

if-else문은 조건의 참과 거짓을 판단하여 실행문을 실행할지 말지를 결정하는 제어문입니다.

boolean result = true;
int a = 10, b = 20;
int c = 15;

//  if : 괄호 안의 값이 true면 다음 명령 실행
// 조건문 다음에 실행해야할 문장이 하나라면 {}를 사용하지 않아도 됨
if (result) System.out.println("참"); //출력: 참
if (!result) System.out.println("거짓");

// 실행할 명령이 한 줄 이상일 경우 블록 사용
if (c >= a && c <= b) {
    System.out.println(c+"는"+a+"보다 크거나 같다"); //출력: 15는10보다 크거나 같다
    System.out.println(c+"는"+b+"보다 작거나 같다"); //출력: 15는20보다 작거나 같다
}

System.out.println("---------------------------");
//else는 if 조건문이 거짓일 때 실행되는 부분 -> 여러줄인 경우 실행블록을 넣어야 함
if(!result) System.out.println("참이다"); //조건이 거짓이므로 출력되지 않음
else System.out.println("거짓이다."); //출력: 거짓이다.

System.out.println("---------------------------");
//조건문이 여러개일 경우 else if 사용(여러번 사용 가능) -> 여러 줄인 경우 실행블록을 넣어야 함
if(!result) System.out.println("참이다"); //조건이 false이므로 출력되지 않음
else if (a < b) System.out.println(a+"가"+b+"보다 작다"); //출력: 10가20보다 작다
else System.out.println("위 조건 모두 틀림"); //위 조건중 하나가 true이므로 출력되지 않음

System.out.println("---------------------------");

if(!result) System.out.println("참이다"); //조건이 false이므로 출력되지 않음
else if (a > b) System.out.println(a+"가"+b+"보다 작다"); //조건이 false이므로 출력되지 않음
else System.out.println("위 조건 모두 틀림"); //출력: 위 조건 모두 틀림 -> 위 조건 모두 false이므로 출력됨

System.out.println("===============================");

//실행블록 안에서도 조건문 사용가능
boolean aa = true;
boolean bb = false;
boolean cc = true;
boolean dd = false;
boolean ee = false;
int ff = 2;

// 중첩 사용
if (aa) {
    // 블록 내에서만 사용되는 변수 (이후 스코프에서 배움)
    String str1 = "";

    //  필요에 따라 적절한 것 사용
    str1 = bb ? "라떼" : "아메리카노"; //bb가 거짓이므로 str1 = "아메리카노"
    if (cc) str1 = "아이스 " + str1; //cc가 참이므로 str1 = "아이스 " + "아메리카노"
    if (!dd) str1 += " 안단티노"; //!dd가 참이므로 str1 = "아이스 아메리카노" + " 안단티노"

    System.out.printf("저는 %s 할게요%n", str1); //출력: 저는 아이스 아메리카노 안단티노 할게요
} else { //aa가 거짓일 경우 출력되는 부분 -> aa가 참이므로 아래 조건문들은 참이든 거짓이든 실행되지 않음
    String str1 = "";
    if (!ee || ff > 3) { 
        str1 = "No";
    } else {
        str1 = "refuse";
    }
    System.out.println(str1);
}

2) switch문

switch문은 조건의 값의 경우의 수를 정해 놓고 조건의 값과 일치하는 부분을 실행하는 제어문입니다.

byte fingersOut = 5;

//  switch : 괄호 안에 기준이 될 변수를 받음
//  가능한 자료형: byte, short, int, char, String, enum

switch (fingersOut) {

    //  case : 기준에 일치하는 case로 바로 이동
    //  break : switch문 실행을 종료
    //  default: 해당하는 case가 없을 때 - 마지막에 작성

    case 2:
        System.out.println("가위");
        break;
    case 0:
        System.out.println("바위");
        break;
    case 5:
        System.out.println("보"); //출력 -> break를 걸지 않으면 일치하는 조건 아래 문장이 모두 실행됨
        break;
    default:
        System.out.println("무효");
}

//문자열을 이용한 스위치문 예제
String direction = "north";
String dirKor;

switch (direction) {
    case "north":
        dirKor = "북";
        break;
    case "south":
        dirKor = "남";
        break;
    case "east":
        dirKor = "동";
        break;
    case "west":
        dirKor = "서";
        break;
    default:
        dirKor = null;
}

System.out.println(
        dirKor != null ? dirKor : "무효"
); //출력: 북

//분기 확인
byte month = 1;
byte season;

switch (month) {
    case 1: case 2: case 3: //case 1,2,3에는 똑같은 값이 실행 -> 사이에 break가 걸려있지 않기 때문에
        season = 1;
        break;
    case 4: case 5: case 6: //case 4,5,6에 똑같은 값이 실행
        season = 2;
        break;
    case 7: case 8: case 9: //case 7,8,9에 똑같은 값이 실행
        season = 3;
        break;
    case 10: case 11: case 12: //case 10,11,12에 똑같은 값이 실행
        season = 4;
        break;
    default:
        season = 0;
}

System.out.println(
        season > 0
                ? "지금은 %d분기입니다.".formatted(season)
                : "무효한 월입니다."
); //출력: 지금은 1분기입니다.

byte startMonth = 1;
String holidays = "";

switch (startMonth) {
    case 1:
        holidays += "설날, ";
    case 2:
    case 3:
        holidays += "3·1절, ";
        break;
    case 4:
    case 5:
        holidays += "어린이날, ";
    case 6:
        holidays += "현충일, ";
        break;
    case 7:
    case 8:
        holidays += "광복절, ";
    case 9:
        holidays += "추석, ";
        break;
    case 10:
        holidays += "한글날, ";
    case 11:
    case 12:
        holidays += "크리스마스, ";
        break;
    default:
        holidays = null; // 휴일이 없는 분기와 구분
}

String result = holidays == null
        ? "(잘못된 월입니다)"
        : "분기 내 휴일: " + holidays
        .substring(0, holidays.lastIndexOf(", "));

System.out.println(result); //출력: 분기 내 휴일: 설날, 3·1절

2. 반복문

1) for문

for문의 기본 사용법은 아래와 같습니다.

for(타입 변수=초기화;범위;증감){
	//실행문
}

 

예제를 통해 확인해보겠습니다.

for (int i = 0; i < 10; i++) {
    System.out.print(i+" "); //출력: 0 1 2 3 4 5 6 7 8 9
}
System.out.println("\n--------------------");
//  루프 블록 안에서 변수값을 바꾸는 것으로 4번 과정 대신 가능
for (int i = 0; i < 10;i+=2) {
    System.out.print(i+" "); //출력: 0 2 4 6 8

}

System.out.println("\n---------------------");
//같은 결과를 아래처럼 할 수도 있음
for (int i = 0; i < 10;) {
    System.out.print(i+" "); //출력: 0 2 4 6 8
    i+=2;
}

System.out.println("\n---------------------");
//정수 타입이 아니라도 가능
for (double d = 123.45; d > 0; d -= 32.1) {
    System.out.print(d+" "); //출력: 123.45 91.35 59.24999999999999 27.14999999999999
}

System.out.println("\n---------------------");

for (String s = ""; s.length() < 11; s += s.length()) {
    System.out.print(s+" "); //출력:  0 01 012 0123 01234 012345 0123456 01234567 012345678 0123456789
}

System.out.println("\n---------------------");

// 쉼표로 구분하여 여럿 사용 가능
// 변수의 자료형은 한 종류만 가능 (혼용 안 됨)
for (byte a = 0, b = 10; a <= b;) {
    System.out.printf("a: %d, b: %d%n", a++, b--);
    //출력:
    //a: 0, b: 10
    //a: 1, b: 9
    //a: 2, b: 8
    //a: 3, b: 7
    //a: 4, b: 6
    //a: 5, b: 5
}

System.out.println("\n---------------------");

//  윷놀이 예제에 적용
String yuts = "도개걸윷모";
char yut = '모';

boolean isValid = false;
for (int i = 0; i <= yuts.indexOf(yut); i++) {
    isValid = true;
    System.out.println("앞으로");
    //출력:
    //앞으로
    //앞으로
    //앞으로
    //앞으로
    //앞으로
}
if (!isValid) System.out.println("무효");

//  4의 배수 차례로 10개 배열에 담기
int count = 10;
int[] multiOf4 = new int[count];

for (int i = 1, c = 0; c < count; i++) {
    if (i % 4 == 0) {
        multiOf4[c++] = i;
    }
}

//  배열 순환 (기본적인 방법)
for (int i = 0; i < multiOf4.length; i++) {
    System.out.print(multiOf4[i]+" "); //출력: 4 8 12 16 20 24 28 32 36 40
}


System.out.println("\n---------------------");

//  향상된 for문 또는 for-each문
for (int num : multiOf4) {
    System.out.print(num+" "); //출력: 4 8 12 16 20 24 28 32 36 40
}
System.out.println("\n---------------------");

//  다중반복문 - 구구단
for (int i = 1; i < 10; i++) {
    for (int j = 1; j < 10; j++) {
        System.out.printf("%d X %d = %d  ", i, j, i * j);
    }
    System.out.println(" ");
    //출력:
    //1 X 1 = 1  1 X 2 = 2  1 X 3 = 3  1 X 4 = 4  1 X 5 = 5  1 X 6 = 6  1 X 7 = 7  1 X 8 = 8  1 X 9 = 9
    //2 X 1 = 2  2 X 2 = 4  2 X 3 = 6  2 X 4 = 8  2 X 5 = 10  2 X 6 = 12  2 X 7 = 14  2 X 8 = 16  2 X 9 = 18
    //3 X 1 = 3  3 X 2 = 6  3 X 3 = 9  3 X 4 = 12  3 X 5 = 15  3 X 6 = 18  3 X 7 = 21  3 X 8 = 24  3 X 9 = 27
    //4 X 1 = 4  4 X 2 = 8  4 X 3 = 12  4 X 4 = 16  4 X 5 = 20  4 X 6 = 24  4 X 7 = 28  4 X 8 = 32  4 X 9 = 36
    //5 X 1 = 5  5 X 2 = 10  5 X 3 = 15  5 X 4 = 20  5 X 5 = 25  5 X 6 = 30  5 X 7 = 35  5 X 8 = 40  5 X 9 = 45
    //6 X 1 = 6  6 X 2 = 12  6 X 3 = 18  6 X 4 = 24  6 X 5 = 30  6 X 6 = 36  6 X 7 = 42  6 X 8 = 48  6 X 9 = 54
    //7 X 1 = 7  7 X 2 = 14  7 X 3 = 21  7 X 4 = 28  7 X 5 = 35  7 X 6 = 42  7 X 7 = 49  7 X 8 = 56  7 X 9 = 63
    //8 X 1 = 8  8 X 2 = 16  8 X 3 = 24  8 X 4 = 32  8 X 5 = 40  8 X 6 = 48  8 X 7 = 56  8 X 8 = 64  8 X 9 = 72
    //9 X 1 = 9  9 X 2 = 18  9 X 3 = 27  9 X 4 = 36  9 X 5 = 45  9 X 6 = 54  9 X 7 = 63  9 X 8 = 72  9 X 9 = 81
}
System.out.println("\n---------------------");

String[][] quotesInLangs = {
        {
                "아조씨",
                "누군데요",
                "머하세요",
        },
        {
                "나는야",
                "하늘을 하는",
                "슈퍼맨",
        },
};

String result = "";
for (String[] quotes : quotesInLangs) {
    for (String quote : quotes) {
        result += quote + " ";
    }
    result = result.trim().concat("\n"); //양 끝의 공백을 자르고 문자열 연결
}

System.out.println(result);
//출력:
//아조씨 누군데요 머하세요
//나는야 하늘을 하는 슈퍼맨

System.out.println("\n---------------------");

for (int i = 0; i < 100; i++) {

    // continue : 한 루프만 건너뜀
    if (i % 3 == 0) continue; //3의 배수는 건너뜀

    // break : 반복을 종료
    if (i == 10) break; //10일때 종료

    System.out.print(i+" "); //출력: 1 2 4 5 7 8
}

System.out.println("\n---------------------");

//  label : 중첩 루프에서 어느쪽을 continue, break 할 지 구분
outer: //외부 라벨명
for (int i = 0; i < 10; i++) {

    inner: //내부 라벨명
    for (int j = 0; j < 10; j++) {
        if (j % 2 == 0) continue inner; //inner 라벨 continue
        if (i * j >= 30) continue outer; //outer 라벨 continue

        if (j > 8) break inner; //inner 라벨 break
        if (i - j > 7) break outer; //outer 라벨 break

        System.out.printf("i: %d, j: %d%n", i, j);
        //출력:
        //i: 0, j: 1
        //i: 0, j: 3
        //i: 0, j: 5
        //i: 0, j: 7
        //i: 1, j: 1
        //i: 1, j: 3
        //i: 1, j: 5
        //i: 1, j: 7
        //i: 2, j: 1
        //i: 2, j: 3
        //i: 2, j: 5
        //i: 2, j: 7
        //i: 3, j: 1
        //i: 3, j: 3
        //i: 3, j: 5
        //i: 3, j: 7
        //i: 4, j: 1
        //i: 4, j: 3
        //i: 4, j: 5
        //i: 4, j: 7
        //i: 5, j: 1
        //i: 5, j: 3
        //i: 5, j: 5
        //i: 6, j: 1
        //i: 6, j: 3
        //i: 7, j: 1
        //i: 7, j: 3
        //i: 8, j: 1
        //i: 8, j: 3
    }
}

2) while문

while문의 사용법은 아래와 같습니다.

while(조건문){
	//실행문
}

 

while문에서는 조건문이 true일때 실행됩니다. 따라서 while문을 종료하려면 조건문을 false로 만드는 코드가 추가되어야합니다.

 

또한 while문의 이러한 특성때문에 무한히 반복되는 코드에서 사용하기도 합니다.

 

기본예제는 아래와 같습니다.

int i = 0;

// while 문의 괄호에는 조건문이 들어감
while (i < 10) {
    System.out.print(i++); //출력:0123456789

}

 

3의 배수만 출력하는 예제

int i = 1;

while (true) {
    int c = i++;

    if (c == 100) break;
    if (c % 3 != 0) continue;

    System.out.println(c); //3의 배수만 출력

}

3) do-while문

do-while문은 while문과 다르게 먼저 실행하고 조건문을 확인합니다.

//조건문이 거짓이지만 먼저 출력되고 조건문 확인
do {
    System.out.println("do"); //먼저 실행되므로 출력됨

} while (false); //조건문이 거짓이므로 반복문이 종료됨

System.out.println("종료"); //출력됨


System.out.println("---------------");

int i = 0;

do {
    System.out.print(i+" "); //출력: 0 1 2 3 4 5 6 7 8 9
    i++;
} while (i < 10);

System.out.println();

System.out.println("반복문 종료");

 

'JAVA Programming > Java' 카테고리의 다른 글

[JAVA] 키보드 입력 받기(Scanner)  (0) 2024.07.14
[JAVA] 메소드  (0) 2024.07.10
[JAVA] 타입 추론  (0) 2024.07.09
[JAVA] 배열  (0) 2024.07.09
[JAVA] 문자열 메서드  (0) 2024.07.02