Java

JAVA - 반복문 ( for )

비망노트 2022. 7. 5. 21:36

- 자바 반복문 ( for )

 

반복문이란?

특정 작업을 반복해서 수행해야할 경우 해당작업 실행코드를 여러번 작성하는게 아닌

반복문을 사용해 해결할 수 있으며

반복문의 종류로는 for문, while문이 대표적이며 for문부터 알아보도록하자.

 

for
for(초기화; 조건식; 증감식){
	실행문;
}

✅ 우선 for문을 반복횟수를 알고있을때 더 적합한 반복문이다.

  • 초기화 : for문이 실행될 때 처음 한번만 실행되며 같은타입이라면 둘이상의 변수를 가질 수 있다.
  • 조건식 : 해당 조건이 참이라면, 참인동안 반복해서 실행한다.
  • 증감식 : 조건식의 조건이 false가 될때까지 초기화된 변수를 증가하거나 감소시킨다.

 

for(int i=0;i<10;i++){
	System.out.print("ABCD ");
}
/* output
ABCD ABCD ABCD ABCD ABCD ABCD ABCD ABCD ABCD ABCD
*/

보통 반복문에서 반복문을 제어할 변수로 정수형 i를 많이 사용한다.

위의 예제를 풀이해보자면

 

1. for문 내에서 사용될 지역변수 정수타입 i 는 0의 값을 갖는다.

2. 이 i를 가운데의 조건식으로 가져가 비교한다.

3. i 즉 첫바퀴때 0이므로 0<10을 비교하면 true 이므로 구현부 { } 내의 문장을 실행시킨다.

4. 구현부 { }코드가 끝났으면 이제 증감식인 i++를 통해 i를 1증가시킨다.

5. 말했다시피 변수의 초기화는 처음 1번에서 했던 초기화 한번만 실행이므로 지금은 1증가한 1이 된다.

6. 1<10 실행문 i++ 반복해준다

7. 9<10 실행문 i++반복 이제 i는 10이 되었고 10<10을 만족시키지 못해 for문이 종료된다.

 

증감식은 i++만 사용 할 수 있는건 아니고

i-- i를 1씩감소 ,  i+=2  i를 2씩 증가,   i *=5 를 5배씩 증가 등등 연산자를 활용할 수 있다.

 

중첩 for문
for(초기화; 조건식; 증감식){
    for(초기화; 조건식; 증감식){
    	    실행문;
    }
}

 

✅ 바깥의 for문이 참인동안 안의 for문은 계속 돌아간다. 말로설명하면 이해가 잘 되지않아서 예제를 보자

인덱스값과 if문을 사용한 별찍기에서 가장 자주 볼 수 있는것같다.

 

 

for(int i=0;i<5;i++){
    for(int j=0;j<5;j++){
    	System.out.print("*");
    }
    System.out.println();
}
/*
*****
*****
*****
*****
*****
*/

✅ 보통 2중첩으로 다양한표현이 가능하므로 2중첩까지 많이 사용하는것같다.

변수는 처음엔 i를 그다음 이너루프에는 j를 보통 사용한다.

 

1. 바깥의 for문이 0으로 초기화되고 i<5를 만족시켰으니 내부 실행문을 실행하러간다.

2. 내부실행문이 또 for문이므로 j 를 0으로 초기화시키고 j<5를 만족시켰으니 내부실행문 실행하러간다.

3. System.out.print(별); 줄바꿈X 1회 실행한뒤 j ++  로 증감식을 실행시키고 j는 1의값을 갖고 j<5를 비교한다

4. 이렇게 j가 5가 된다면 그때 내부의 for문이 끝났다

5. 근데 이게 웬걸 바깥에서 println 줄바꿈을 하고 for문 종료 괄호끝으로갔더니

6. i 가 이제서야 i++돼서 i가 1이 되었다 그럼 i<5를 다시 만족하니까 j는 다시 5바퀴를 굴러야한다.

7. 이렇게 i가 i<5를 만족하지못해 바깥의 for문이 끝나기전까지 반복된다.

8. 즉 바깥for문 1바퀴에 안의 for문5바퀴가 된다.

 

i = 0
j = 0, 1, 2, 3, 4
i = 1
j = 0, 1, 2, 3, 4
i = 2
j = 0, 1, 2, 3, 4
i = 3
j = 0, 1, 2, 3, 4
i = 4
j = 0, 1, 2, 3, 4

 

public class MyClass {
    public static void main(String args[]) {
        for(int i=0;i<5;i++){
            for(int j=0;j<5;j++){
                System.out.print("[i:"+i+" j:"+j+"] ");
            }
            System.out.println();
        }
    }
}
/* output
[i:0 j:0] [i:0 j:1] [i:0 j:2] [i:0 j:3] [i:0 j:4] 
[i:1 j:0] [i:1 j:1] [i:1 j:2] [i:1 j:3] [i:1 j:4] 
[i:2 j:0] [i:2 j:1] [i:2 j:2] [i:2 j:3] [i:2 j:4] 
[i:3 j:0] [i:3 j:1] [i:3 j:2] [i:3 j:3] [i:3 j:4] 
[i:4 j:0] [i:4 j:1] [i:4 j:2] [i:4 j:3] [i:4 j:4] 
*/

✅ 보다시피 1행에 바깥for문 한바퀴이고 j가 0부터 4까지 늘어나는동안 i는 계속 0인걸 볼 수 있다.

 

 

응용으로 이렇게 직사각형이 아닌 다른모양으로 출력하고싶다면

인덱스의 위치를 시각화해서 한번 출력해보고 규칙을 찾아 구현하는방법이 좋다

public class MyClass {
    public static void main(String args[]) {
        for(int i=5; i>=1;i--){ 
	    for(int j=i; j>=1; j--){ 
	    	System.out.print("*");
	    }
          System.out.println();
        }
    }
}
/* output
*****
****
***
**
*
// 인덱스 시각화
[i:5 j:5] [i:5 j:4] [i:5 j:3] [i:5 j:2] [i:5 j:1] 
[i:4 j:4] [i:4 j:3] [i:4 j:2] [i:4 j:1] 
[i:3 j:3] [i:3 j:2] [i:3 j:1] 
[i:2 j:2] [i:2 j:1] 
[i:1 j:1] 
*/

1. 바깥 for문 i는 5로 초기화되고 1과 같거나 큰경우 까지 1씩 감소하며 반복한다.

2. 내부 for문 j의 값은 바깥for문의 변수 i를 받아서 i와 마찬가지로 1씩 감소하면서 반복한다.

3. 즉 i가 작아질수록 j반복문의 반복횟수도 줄어드는 코드이다.

 

 

 

향상된 for문

✅ 향상된for문의 대상을 배열 혹은 여러원소를 포함한 자료형이어야한다.

간결하며 가독성이좋고, 배열의 인덱스범위문제를 해결할 수 있지만

인덱스값을 별도로 사용하지 못한다.

for( 변수타입 변수이름 : 배열이름 ){ // 세미콜론이아닌 콜론 :
		반복할 실행코드;
}
1차원 일반배열 원소추출
String[] arr = {"가","나","다","라","마"};
 		
    for(String s : arr) {
        System.out.print(s+" ");
    }
/*
가 나 다 라 마
*/
2차원 배열 원소추출
// 2차원 배열 원소 추출

String[][] arr = {
		   {"가","나","다","라","마"},
		   {"바","사","아","자","차"}
        	 };
 		
for(String[] arrs : arr) {
    for(String s : arrs) {
        System.out.print(s+" ");
    }
    System.out.println();
}
// string 2차원배열 arr의 모든 일반배열 arrs를 반복하고
// 일반배열 arrs의 모든 문자열 s를 출력
/*
가 나 다 라 마
바 사 아 자 차
*/

 

❗ 위의경우 배열 arr은 2차원배열이고  그 안의 arrs가 1차원 배열이다.

String[][] arr = {
		   {"가","나","다","라","마"},
		   {"바","사","아","자","차"}
        	 };
 		
for(String[] arrs : arr) {
    System.out.print(arrs+" ");
}
/* output
[Ljava.lang.String;@16f65612 [Ljava.lang.String;@707f7052 
*/

즉 이런식으로 작성하게된다면 1차원배열 arrs의 모든 원소를 출력해주는게아닌

배열은 참조형 데이터타입이므로 해당 배열이 있는 주소를 출력한다.

 

번외이지만 위의경우 arr.length는 2행이므로 2이고

그중 1행 즉 arr[0].length는 가나다라마 로 5가된다.

'Java' 카테고리의 다른 글

JAVA - 재귀 ( recursion )  (0) 2022.08.13
JAVA - 반복문 ( while, do-while )  (0) 2022.07.06
JAVA - 조건문 ( switch - case )  (0) 2022.07.02
JAVA - 조건문 ( if, else if, else )  (0) 2022.07.02
JAVA - 문자열 분리 ( StringTokenizer )  (0) 2022.06.29