본문 바로가기
JAVA/기본 이론

8. 반복문 - for 문

by D.O.T 2024. 2. 10.
반복문이란?

 

프로그래밍 언어에서 반복문이란 말 그대로 반복하는 과정을 수행할 수 있는 문법을 뜻한다.

반복문에는 잘 알려진 for문과 while문이 존재한다.

추가로 do while문도 존재하는데 아직 까지는 특별한 경우를 제외하고는 사용을 하지 않았다.

 

for문

 

for문은 기본적인 문법으로 대부분의 사람이 잘 알고 있다.

하지만, 생각보다 헷갈려하는 포인트들이 있어서 그것을 짚기 위해서 가져왔다.

 

우선, 웬만한 책에서 설명하는 for문의 기본 구성은 아래와 같다.

for (int i = 0; i < 10; i++) {}

 

대부분 여기서 int i = 0 을 초기값, i < 10을 조건식, i++을 증감식이라고 표현합니다.

for (초기값; 조건식; 증감식)

근데 저는 헷갈리던 부분이 좀 있었습니다.

맨 처음 for문을 접했을 때, 조건식이 ' i < 10 ' 이면 i < 10 일 때까지? 인가? 라는 생각 때문에 조금 헤맸었습니다.

 

for문의 뜻 

 

그래서 저는 제가 이해하기 쉬운 방식으로 접근 했습니다.

for라는 뜻은 ~ 동안 이라는 뜻이 있습니다.

이 뜻 그대로 for 문은 '조건식' 동안 수행하겠다. 이 뜻으로 해석해야 합니다.

 

즉, 조건식이 i < 10 이면 변수 i가 10보다 작을 때, 계속 수행한다는 말입니다.

 

 for문의 수행 순서

 

for (int i = 10, j = 20, cnt = 1; i < j; i++, j-=2, cnt++) {
	System.out.printf("for %d번 째 : i = %d, j = %d\n", cnt, i, j);
}

위와 같은 코드를 실행해보겠습니다.

실행 결과

 

첫 번째 수행 (초기값),

먼저, '초기값'에 들어가는 내용은 0개 이상 작성하면 됩니다.

초기값을 설정하지 않아도 수행되는 것이죠.

저는 3개의 변수 i, j, cnt를 초기값으로 특정 값을 할당 했습니다.

 

두 번째 수행 (조건식),

조건동안 for문을 수행할 수 있는지 확인합니다.

조건은 i < j 이므로, (i : 10) < (j : 20) 를 만족합니다.

두 번째 수행에서 조건을 만족하는 경우 세 번째 수행으로 넘어가고,

조건을 만족하지 않는 경우 여기서 for문은 종료됩니다.

※ 조건식은 boolean 값만 됩니다. C++은 다름.

 

세 번째 수행 (문법),

두 번째 수행에서 만족한 경우 세 번째 수행을 합니다.

세 번째 수행은 for 문의 중괄호 { } 로 묶여 있는 문법을 수행하는 것 입니다.

우리가 수행할 문법은 for문의 각 수행 횟수에 대한 i와 j를 출력합니다.

모든 문법이 끝나면 네 번째 수행을 시작합니다.

 

네 번째 수행 (증감식),

사람들이 말을 증감식으로 표현한 것이지 사실은 다음 수행할 명령입니다.

즉 문법에서 마지막 줄에 추가하는 것과 같습니다.

우선 위 코드에서 해당하는 네 번째 수행은 cnt와 i를 1씩 증가하고 j를 2씩 감소하는 것입니다.

 

다섯 번째 수행 (반복),

조건식에 따라 종료 될 때까지 반복합니다.

 

for문은 이렇게 위 5가지 연산으로 이루어지는 문법입니다.


for문을 다양하게 정의하는 방법

 

앞 서, 네 번째 수행에서 증감식이 문법 마지막에 붙어도 된다는 것을 보았을 때

그럼 있으나 없으나 마찬가지가 아닌가? 라는 생각이 들면 정말 잘 접근했습니다.

실제로 초기값, 조건식, 문법, 증감식 모두 비워도 됩니다. 

필요에 따라 적절하게 사용하는 방법도 있고 가장 보편적으로 사용하는 방법도 있습니다.

 

// 초기값을 비웠을 때
int i = 0;
for (; i < 10; i++) {}

// 조건식을 비웠을 때 (무한 루프)
for (int i = 0; ;i++) {}

// 문법을 비웠을 때
for (int i = 0; i < 5; i++, System.out.println("%d", i));

// 증감식을 비웠을 때
for (int i = 0; i < 5; ) {
	System.out.println("%d", i++));
}

// 모두 비웠을 때 (무한 루프)
for ( ; ; );

 위와 같이 다양하게 사용하는 방법이 있으니 참고하면 좋겠습니다.

대신, 중요한 점은 '조건식'을 비우는 경우 컴퓨터가 얼마 동안 반복을 수행할 것인지 알 수 없습니다.

그래서 그냥 계속 반복을 수행하게 되므로 무한 루프에 빠지게 됩니다.

 

break, continue

 

이런 무한 루프에서 빠져나오는 방법으로는 break 문법이 있습니다.

break는 현재 반복을 종료하겠다는 의미가 됩니다.

 

continue 문법은 세 번째 수행을 하지 않겠다는 의미를 가진 문법입니다.

여기서 네 번째 수행에 대한 필요성이 나옵니다.

continue 문법으로 세 번째 수행을 하지 않더라도 그 외 수행은 하게 됩니다.

네 번째 수행(증감식)을 문법의 마지막에 추가 했을 때, 문법에서 continue 문법이 포함되어 있다면

문법 마지막에 추가된 네 번째 수행이 실행되지 않아 또 다시 무한반복에 빠지게 됩니다.

 

// break를 사용한 경우
for (int i = 1; i <= 3; i++) {
	System.out.printf("%d번 째 for문 수행 됨.", i);
    break;
}

/*
	==== 출력 결과 ====
	1번 째 for문 수행 됨.
*/

// continue를 사용한 경우
for (int i = 1; i <= 3; i++) {
	System.out.printf("%d번 째 for문 수행 됨.", i);
    continue;
	System.out.printf("%d번 째 for문 수행 됨.", i++);
}

/*
	==== 출력 결과 ====
	1번 째 for문 수행 됨.
	2번 째 for문 수행 됨.
	3번 째 for문 수행 됨.
*/

// continue를 사용한 경우, 네 번째 수행이 없는 경우
for (int i = 1; i <= 3; ) {
	System.out.printf("%d번 째 for문 수행 됨.", i);
    continue;
	System.out.printf("%d번 째 for문 수행 됨.", i++);
}

/*
	==== 출력 결과 ====
	System.out.printf("%d번 째 for문 수행 됨.", i);
    무한 루프
*/

 

보통 무시하거나 종료 하는 경우는 특정 조건에서만 수행되므로 if문과 같이 수행됩니다.

 

for문을 어떻게 사용하나요?

 

주로 for문은 array, 수열 등 특정한 규칙이 존재하는 경우 사용합니다.

Array에서 for문 사용 (향상된 for 문)

 

배열은 인덱스가 0번째부터 배열의 크기 - 1 까지 각 인덱스마다 1의 차이의 규칙을 갖습니다.

배열을 접근 할 때는 인덱스로 접근합니다.

배열의 모든 원소에 접근을 하려면 for문을 사용하면 쉽게 접근할 수 있습니다.

// 1부터 10까지의 수열 생성
int[] arr = new int[10];

for (int i = 0; i < arr.length(); i++) {
	arr[i] = (i+1);
}

for (int i: arr) {
	System.sout.print(i + " ");
}

 

그 외에도 다양한 규칙이 사용되는 곳에서는 필수로 사용되며,

코딩은 for문과 if문으로 모든 코드를 작성할 수 있다는 말이 있을만큼 중요한 내용입니다.

 

for문을 이해하기 위해 추천하는 문제

 

구구단 프로그램을 작성해보기

예제 출력
1단 : 1 2 3 4 5 6 7 8 9
2단 : 2 4 6 8 10 12 14 16 18
...
9단 : 9 18 27 36 45 54 63 72 81

 

더보기
public class MultiplicationTable
{
	public static void main(String[] args) {
	    for(int i = 1; i <= 9; i++) {
            System.out.printf("%d단 = ", i);
	        for(int j = 1; j <= 9; j++) {
	            System.out.printf("%2d ", i * j);
	        }
	        System.out.println();
	    }
	}
}

수열 [1, 2, 3, 4, 5]을 뒤집어서 출력하기

예제 출력
5, 4, 3, 2, 1
더보기
public class PrintReverseArray
{
	public static void main(String[] args) {
	    int[] arr = {1, 2, 3, 4, 5};
	    for (int i = arr.length - 1; i > 0; i--) {
	        System.out.printf("%d, ", arr[i]);
	    } 
	    System.out.printf("%d", arr[0]);
	}
}

 

노션 정리 URL

https://www.notion.so/24jihwan/019643d1ca304dd684ceaa73c34cf08e

 

논리 사고 | Notion

연산자와 명령문 이해

24jihwan.notion.site

 

'JAVA > 기본 이론' 카테고리의 다른 글

4. 입/출력 (Input/Output, I/O)  (0) 2024.02.24
9. 반복문 - while 문, do while 문  (1) 2024.02.10
7. 다차원 배열 (Multi Dimensional Array)  (1) 2024.02.10
6. 배열 (Array)  (1) 2024.02.10
5. 연산자(Operator)와 연산 순위  (1) 2024.02.10