- 자바 반복문 ( 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 |