JAVA 반복문

금송·2024년 9월 4일
0

이론

목록 보기
12/17
post-thumbnail

조건문 if switch / case

반복문 Array(배열) for while do-while

조건문

if문

조건을 따지는 작업을 반복적으로 수행하는 것

+=은 오른쪽 값을 더해준 값을 다시 넣어준다는 의미

if-else문

if문의 조건식이 true이면 if문의 블록이 실행되고, false면 else 블록 실행

if (조건식) {
	실행문;
} else {
	실행문;
}

if / else if / else

조건문이 여러개인 if문인 경우 if - else if - else 문으로 조건절 처리 가능

if(조건식) {
	실행문;
} else if (조건식) {
	실행문;
} else { // 앞의 if, else if 조건식 모두 false일 경우 실행되는 else 코드블록
	실행문
}

// 실습

int score = 80;
char grade = ' ';

if (score >= 90){
    grade = 'A';
} else if (score >= 80){
    grade = 'B';
} else if (score >= 70){
    grade = 'C';
} else {
    grade = 'D';
}
System.out.println("Your score is " + grade);

args를 외부에서 받아서 사용하는 방법.

실습 했을 때 잘 나오고 있음

조건문에서 &&를 &로 썼을 때

결과는 동일하지만 내부 동작은 &&가 조금 더 빠르다.

switch/case문

switch/case문은 if문과 비슷한 조건-판단문

switch문은 if문처럼 조건식이 true일 때 블록 내부를 실행하는게 아니라, 변수가 어떤 값을 갖느냐에 따라 실행문이 분기 처리됨.

switch(변수) {
    case 입력값1: 
				 실행문1; 
				 ...
         break; // 여기서 break가 없으면 아래로 쭉 실행이 된다.
    case 입력값2: 
				 실행문2; 
				 ...
         break;
    ...
    default: ... // 위의 조건문이 다 실행이 안되고 내려오면 실행 되는 문.
				 디폴트_실행문;
         break;
}

변수에 들어갈 수 있는 타입 : byte(정수), short(정수), char(문자열), int, enum(참조 자료형, 상수값을 저장할 수 있는 Class, 열거형 타입, JAVA 5 이후로 추가), String

(Java 17버전 부터는 객체 변수를 입력하고 특정 자료형을 확인할 수 있음. - Pattern matching for switch)

object - 가장 기본적인 클래스

  • Pattern Matching for switch 테스트 이제 switch문에서 객체를 전달하여 기능을 전환하고 특정 자료형을 확인할 수 있다.
    // Pattern Matcing for Switch 적용된 코드 
    public String test(Object obj) {
        return switch(obj) {
          case Integer i -> "An integer";
          case String s -> "A string";
          case Cat c -> "A Cat";                 // Cat 이라는 클래스를 선언했을 경우
          default -> "I don't know what it is";
        };
    }
    // JDK 17 이전 코드 
    public String test2(Object obj) {
    		if (obj instanceof Integer) {
            return "An integer";
        } else if (obj instanceof String) {
            return "A string";
        } else if (obj instanceof Cat) {         // Cat 이라는 클래스를 선언했을 경우
            return "A Cat";
        } else {
            return "I don't know what it is";
        }
    }

int month = 12;
String monthString;
switch (month) {
    case 1:                                  // == case 1 -> monthString = "January";
        monthString = "January";
        break;
    case 2:
        monthString = "February";
        break;
    case 3:
        monthString = "March";
        break;
    case 4:
        monthString = "April";
        break;
    case 5:
        monthString = "May";
        break;
    case 6:
        monthString = "June";
        break;
    case 7:
        monthString = "July";
        break;
    case 8:
        monthString = "August";
        break;
    case 9:
        monthString = "September";
        break;
    case 10:
        monthString = "October";
        break;
    case 11:
        monthString = "November";
        break;
    case 12:
        monthString = "December";
        break;
    default:
        monthString = "Invalid month";   // 유효하지 않은 범위의 값을 입력받았을 때 예외처리
        break;
}
System.out.println(monthString);

실습

public class MonthSwitchCaseExample {
    public static void main(String[] args) {
        String day = args[0];
        String message;
        switch (day) {
            case "월요일" :
                day = "Start of the work week";
                break;
            case "금요일" :
                day = "Almost weekend";
                break;
            default:
                day = "Midweek";
                break;
        }
        System.out.println(day);
    }
}

for문

배열타입

여러 개의 값을 넣어줄 수 있음.

배열은 자료형 바로 뒤, 혹은 변수명 뒤에 대괄호를 붙임.

처음 변수를 할당 해 줄 때 크기를 알려주어야 함.

int[] lottoNumbers; // 정수형만 들어갈 수 있는 배열
int lottoNumbers[];

String[] weeks = {"월", "화", "수", "목", "금", "토", "일"}; // 문자열만 들어갈 수 있는 배열
String[] weeks = new String[7]; // 현재 값이 없는 상태

배열 크기 설정

배열의 크기(길이)를 먼저 설정한 뒤, 배열 변수를 생성하고 그 값을 나중에 대입하는 방법

String[] weeks = new String[7];   // 배열의 크기를 7로 먼저 설정하여 배열 변수 생성
weeks[0] = "월";                   // 각 인덱스에 해당하는 값 대입 
weeks[1] = "화";
weeks[2] = "수";
weeks[3] = "목";
weeks[4] = "금";
weeks[5] = "토";
weeks[6] = "일";

길이 설정을 하지 않으면 해당 오류가 노출됨

배열값에 접근하기

앞서 만든 요일의 배열에서 화요일에 해당하는 값에 접근하기 위해서는 인덱스를 이용해야합니다.

String[] weeks = {"월", "화", "수", "목", "금", "토", "일"};
System.out.println(weeks[1]); // 배열 값 중 ‘화’요일에 접근

// 결과

배열은 첫 번째 인덱스가 0으로 시작한다는것을 잊지 마시고요. 그렇기 때문에 weeks[1] 이면 두 번째 항목을 의미합니다.

5.6.3 배열의 길이 구하기

배열은 보통 for 문과 함께 사용하는데, for 문에 배열을 사용할 때에는 배열의 길이를 알아야 합니다. 왜냐? 배열의 길이만큼 for 문을 반복하기 때문이죠. 이때 배열 길이는 length를 사용하면 됩니다.

String[] weeks = {"월", "화", "수", "목", "금", "토", "일"};
for (int i = 0; i < weeks.length; i++) {
	System.out.println(weeks[i]);
}

//결과
월
화
수
목
금
토
일

위 코드는 weeks 배열의 모든 값을 출력하는 로직입니다. weeks 배열에는 7개의 요소가 있기 때문에 weeks.length는 7 입니다.

5.6.4 배열 관련 오류

배열은 개발자가 초기에 정한 공간만큼 할당이 되는 자료구조입니다. 그렇기 때문에 현재 배열 크기보다 그 이상의 공간에 접근을 한다면 다음과 같은 오류가 발생합니다.

ArrayIndexOutOfBoundsException

위에서 실습했던 weeks라는 요일 배열은 7 만큼의 공간 할당이 되어있는데,

String[] weeks = {"월", "화", "수", "목", "금", "토", "일"};

만약에 weeks[7] 공간에 접근한다면 어떻게 될까요?

코드상에서 컴파일 오류는 발생하지 않지만, main 메서드를 실행했을 때 다음과 같은 오류가 발생합니다.

ArrayIndexOutOfBoundsException 에러는 실무에서도 for문의 인덱스 연산을 잘못하고 배열에 접근했을 때 많이 발생하는 오류입니다. 앞으로도 자바 코드를 작성하면서 많이 볼 수 있는 오류이기 때문에 해당 오류가 발생했을 때 당황하지 않고 원인을 찾아 수정하면됩니다.

for문

실행문을 반복적으로 수행할 때 사용

for (초기화식; 조건문; 증감식) { //조건식이 false일 때 for문 끝.
	...
}

for( ; ;) { // 항목을 입력하지 않아도 동작 하지만 무한 반복문에 빠짐.
	// 실행문
}

// 실습
public class ForLoop {
    public static void main(String[] args) {
        // 1. for문으로 1~50까지 출력
        // 2. 1 ~ 50 짝수만 출력
        for(int i = 1; i <= 50; i++){
            System.out.println("숫자 출력" + i);
            if (i % 2 == 0) {
                System.out.println("짝수만" + i);
            }
        }
    }
}

// 배열의 크기를 정하고 그 크기를 변수로 사용하여 푼 방법
int[] array = new int[50];

for (int i = 0; i < 50; i++) {
    array[i] = i+1;
    System.out.println(array[i]);
}
// java arguments로 입력받은 args배열 출력하기
// for문 사용!
public class ArgumentArraySample {
    public static void main(String[] args) {
        for (int i = 0; i < args.length; i++) {
            System.out.println(args[i]); //args[0] ~ args[7]
        }
    }
}

// for each문 사용!
for (String arg : args) {
    System.out.println(arg);
}

// 결과
1
2
2
510
46646
5
2
55

for each문

for문이 살짝 변형된 형태. 향상된 for문.

for(자료형 변수명 : interate(반복 할 수 있는 변수)) {
	body-of-loop
}

// for문
public class ForExample {
	public static void main(String[] args) {
		String[] numbers = {"one", "two", "three", "four"};

		for (int i = 0; i < numbers.length; i++) {
			System.out.println(numbers[i]);
		}
	}
}

// for each문
for (String number : numbers) {
	System.out.println(number);
}

interate 부분 Java에서 제공하는 자료구조 → Collection 관련 클래스들로 설정한 변수들도 사용 가능

ex) ArrayList, LinkedList, HashMap …

for문으로 돌아가기 - continue

for문 수행중에 continue를 만나면 다음 문장이 있어도 수행하지 않고 for문의 증감식으로 돌아감.

가독성이 조금 떨어질 때는 잘 사용하지 않음.

// 0~60까지 숫자 중 3의 배수만 출력, continue 꼭 사용!
for (int index = 1; index <= 60; index++){
    if (!(index % 3 == 0)){
        continue;
    }
    System.out.println(index);
}
for (int index = 1; index <= 60; index++){
    if (index % 3 == 0){
	    System.out.println(index);
    }
}

// 강사님 시연
for (int i = 0; i < 60; i++) { // i = 0 ~ 59
	int value = i + 1; // 중복되는 연산 식이 있다면 변수 설정해주기
	if (value % 3 != 0) {
			continue;
	}
  System.out.println(value + "는 3의 배수 입니다.");	
}

이중 for문

for문 안에 또 다른 for문

중첩 제한은 없지만 성능상 이슈로 단일 또는 이중까지 많이 사용한다.

for (int i = 0; i < 3; i++) {  // i = 0, 1, 2
    for (int j = 0; j < 4; j++) {  // j = 0, 1, 2, 3
        System.out.println("i = " + i + ", j = " + j);
    }
}

// 결과
i = 0, j = 0
i = 0, j = 1
i = 0, j = 2
i = 0, j = 3
i = 1, j = 0
i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 0
i = 2, j = 1
i = 2, j = 2
i = 2, j = 3
// 구구단 실습
/*
* 2 4 6 8 10 ... 18
* 3 6 9 ...      27
* .
* .
* 9 18 ...       81
* */

for (int j = 2; j <= 9; j++){
    for(int k = 1; k <= 9; k++){
        int num = j * k;
        if (k == 9){
            System.out.println(num);
            continue;
        }
        System.out.print(num + " ");
    }
}

// 결과
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81

//강사님 시연
for(int i = 2; i <= 9; i++){ // 2 ~ 9
	for(int j = 1; j <=9; j++){
			System.out.print((i*j) + " ");
	}
	System.out.println();
}

삼중 for문

for (int a = 0; a <= 3; a++) {
    for (int b = 0; b <= 3; b++) {
        for (int c = 0; c <= 3; c++) {
            System.out.println("a = " + a + ", b = " + b + ", c = " + c);
        }
    }
}
  • 결과값
    a = 0, b = 0, c = 0
    a = 0, b = 0, c = 1
    a = 0, b = 0, c = 2
    a = 0, b = 0, c = 3
    a = 0, b = 1, c = 0
    a = 0, b = 1, c = 1
    a = 0, b = 1, c = 2
    a = 0, b = 1, c = 3
    a = 0, b = 2, c = 0
    a = 0, b = 2, c = 1
    a = 0, b = 2, c = 2
    a = 0, b = 2, c = 3
    a = 0, b = 3, c = 0
    a = 0, b = 3, c = 1
    a = 0, b = 3, c = 2
    a = 0, b = 3, c = 3
    a = 1, b = 0, c = 0
    a = 1, b = 0, c = 1
    a = 1, b = 0, c = 2
    a = 1, b = 0, c = 3
    a = 1, b = 1, c = 0
    a = 1, b = 1, c = 1
    a = 1, b = 1, c = 2
    a = 1, b = 1, c = 3
    a = 1, b = 2, c = 0
    a = 1, b = 2, c = 1
    a = 1, b = 2, c = 2
    a = 1, b = 2, c = 3
    a = 1, b = 3, c = 0
    a = 1, b = 3, c = 1
    a = 1, b = 3, c = 2
    a = 1, b = 3, c = 3
    a = 2, b = 0, c = 0
    a = 2, b = 0, c = 1
    a = 2, b = 0, c = 2
    a = 2, b = 0, c = 3
    a = 2, b = 1, c = 0
    a = 2, b = 1, c = 1
    a = 2, b = 1, c = 2
    a = 2, b = 1, c = 3
    a = 2, b = 2, c = 0
    a = 2, b = 2, c = 1
    a = 2, b = 2, c = 2
    a = 2, b = 2, c = 3
    a = 2, b = 3, c = 0
    a = 2, b = 3, c = 1
    a = 2, b = 3, c = 2
    a = 2, b = 3, c = 3
    a = 3, b = 0, c = 0
    a = 3, b = 0, c = 1
    a = 3, b = 0, c = 2
    a = 3, b = 0, c = 3
    a = 3, b = 1, c = 0
    a = 3, b = 1, c = 1
    a = 3, b = 1, c = 2
    a = 3, b = 1, c = 3
    a = 3, b = 2, c = 0
    a = 3, b = 2, c = 1
    a = 3, b = 2, c = 2
    a = 3, b = 2, c = 3
    a = 3, b = 3, c = 0
    a = 3, b = 3, c = 1
    a = 3, b = 3, c = 2
    a = 3, b = 3, c = 3

while

조건식이 true일 경우에 계속 반복하는 반복문

반복 횟수를 미리 알고 작성하는 for문과는 다르게, 특정 조건이 만족할 때 까지 반복하는 경우에 while문을 사용

int index = 0       // 1. 특정 변수 설정

while (조건문) {
	<수행할 문장1>;
	<수행할 문장2>;
	...               // 2. 내부에 증감식 작성하면 for문과 같음.
}
// 무한루프
while (true) {   // == for(;;){}
	... // 내부에 if() break; 로 무한루프를 막을 수 있음.
}
// while문으로 1~5까지 출력
int i = 1;
while (i <= 5){
    System.out.println(i);
    i++; // 이때 해당 증감식이 없으면 1만 계속 나오는 무한 루프에 빠짐.
}

while문 빠져나가기 - break

while 문은 조건문이 참인 동안 while 문 안의 내용을 반복하여 수행하지만 강제로 while 문을 빠져나가야 할 때도 있는데, 이때 break문을 사용

int coffee = 10;
int money = 300;

while (money > 0) {
    System.out.println("돈을 받았으니 커피를 줍니다.");
    coffee--;
    System.out.println("남은 커피의 양은 " + coffee + "입니다.");
    if (coffee == 0) {
        System.out.println("커피가 다 떨어졌습니다. 판매를 중지합니다.");
        break;
    }
}

while문으로 돌아가기 - continue

이전에 배웠던 for문에서의 continue와 용도가 같음.

while문 안의 문장을 수행할 때 어떤 조건을 검사해서 참이 아닌 경우 while문을 빠져나가는 대신 while문의 맨 처음, 즉 조건문으로 돌아가게 하고 싶은 경우 continue를 사용

int a = 0;
while (a < 10) {
    a++;
    if (a % 2 == 0) {
        continue;  // 짝수인 경우 조건문으로 돌아간다.
    }
    System.out.println(a);  // 홀수만 출력된다.
}
// while 문으로 0 ~ 60까지 숫자 중 3의 배수 출력. continue 사용

int k = 1;
while (k <= 60) {
    k++;
    if (!(k % 3 == 0)){
        continue;
    }
    System.out.println(k);
}

do-while문

while문이 변형된 형태

실행문을 먼저 수행하고 조건식을 계산하여 반복문을 종료할지 실행할지 판단.

처음 실행문은 무조건 한번 실행.

do {
		실행문; -> 조건식의 결과가 true일 때 실행될 문장
		...
} while (조건식);

int l = 1;
do {
    l++;
    if (l % 3 == 0){
        System.out.println(l + "는 3의 배수");
    }
} while (l < 60);
  • 데일리 퀴즈


    💡 조건문, 반복문 1. for문을 이용해서 a배열의 값을 b배열로 복사해보세요.
    public class Question {
        public static void main(String args[]) {
            // for문을 이용해서 a배열의 값을 b배열로 복사해보세요.
            int[][] a = {{1, 2, 3}, {4, 5, 6}};
            int[][] b = new int[3][3];
            
            // for문 작성하는 부분
            // …
            
            // a배열과 b배열 출력
            for (int i = 0; i < a.length; i++) {
                for (int j = 0; j < a[i].length; j++) {
                    System.out.println("a[" + i + "][" + j + "]: " + a[i][j]);
                    System.out.println("b[" + i + "][" + j + "]: " + b[i][j]);
                }
            }
        }
    }
    for (int i = 0; i < a.length; i++) {
        for (int j = 0; j < a[i].length; j++) {
            b[i][j] = a[i][j];  // a 배열의 값을 b 배열로 복사
        }
    }

    2. for문을 이용하여 배열에 있는 숫자들의 최대값과 평균을 구하세요.

    public class Question {
        public static void main(String args[]) {
            // for문을 이용하여 배열에 있는 숫자들의 최대값과 평균을 구하세요.
            int[] array = {12, 4, 7, 20, 1};
            
            // 코드 작성하는 부분
            // ...
            
            // 결과 출력 (최대값: max, 평균: avg)
            System.out.println(max);
            System.out.println(avg);
        }
    }
    int max = array[0];  // 배열의 첫 번째 요소로 초기화
    int sum = 0;  // 총합을 저장할 변수
    
    for (int z = 0; z < array.length; z++) {
        // 최대값 계산
        if (array[z] > max) {
            max = array[z];
        }
        // 총합 계산
        sum += array[z];
    }
    
    // 평균 계산
    double avg = (double) sum / array.length;

    3. 0부터 20까지 짝수만 출력하는 코드를 작성해보세요.

    public class Question {
        public static void main(String args[]) {
            // 0부터 20까지 짝수만 출력하는 코드를 작성해보세요.
        }
    }
    for (int l = 0; l <= 20; l++){
        if (l % 2 == 0){
            System.out.println(l);
        }
    }

    4. 프로그래머스 문제

profile
goldsong

0개의 댓글