안녕하세요 작가 J입니다. 어제는 운동으로 인해 블로그를 하루 쉬어가고, 오늘은 Java의 중요 항목 중에 하나인 반복문에 대해서 알아보도록 하겠습니다.
Java를 배우는 초보자들이 꼭 알아야 할 중요한 개념 중 하나는 반복문입니다. 반복문은 특정 코드를 여러 번 실행해야 할 때 매우 유용하게 사용됩니다. 이 글에서는 Java의 반복문이 무엇인지, 왜 필요한지, 종류와 사용법에 대해 알아보겠습니다.
▤ 목차
지난 번에 조건문도 굉장히 많이 사용한다고 말씀드렸는데, 반복문도 이에 못지않게 많이 사용하는 구문입니다. 꼭 익히고 넘어가시는 걸 추천드립니다.
반복문의 의미와 필요성
반복문은 프로그래밍에서 동일한 코드를 여러 번 실행할 수 있도록 도와주는 구조입니다. 예를 들어, 배열의 모든 요소를 출력하거나 특정 조건이 만족될 때까지 코드를 반복 실행하는 경우에 사용됩니다. 반복문을 사용하면 코드의 가독성을 높이고, 작성하는 시간을 절약할 수 있으며, 버그 발생 가능성을 줄일 수 있습니다.
반복문의 종류와 흐름도
Java에서 사용되는 주요 반복문에는 for, while, do-while 반복문이 있습니다. 각 반복문은 조금씩 다른 용도로 사용되며, 조건을 검사하고 반복하는 방식도 다릅니다.
1. while 문
while 반복문은 반복 횟수가 불확실할 때 사용합니다. 조건이 참인 동안 계속 반복됩니다.
흐름 :
1. 조건 검사(참이면 반복문 실행, 거짓이면 종료)
2. 코드 블록 실행
3. 다시 조건 검사로 돌아감
예제 :
int i = 0;
while (i < 5) {
System.out.println("i의 값: " + i);
i++;
}
위 예제는 i가 0부터 4까지 증가하면서 총 5번 실행됩니다.
특징:
- 조건에 따라 반복 횟수가 가변적일 때 유용합니다.
- 코드 블록이 실행되기 전에 조건을 검사하여 불필요한 반복을 줄일 수 있습니다.
풀이 :
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); // Scanner 객체 생성
int num; // 정수를 반복적으로 입력받기 위한 변수 생성
boolean flag = true; // while문 탈출을 위한 변수 생성
while (flag) { // flag 기본값이 true 이기 때문에 반복
System.out.print("정수 입력 : ");
num = sc.nextInt(); // num을 이때 입력 받는다.
if (num > 10) { // 입력받은 숫자가 10이 초과되면
flag = false; // while 탈출을 위한 값 변경
System.out.println("종료되었습니다."); // 문구 출력
}
}
}
}
조금 풀어서 쓴 코드입니다. 변수 선언 부분은 반복문 안보다 밖에서 선언하는 게 성능 관련 좋습니다.
풀이 :
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); // Scanner 객체 생성
int num; // 정수를 반복적으로 입력받기 위한 변수 생성
int sum = 0; // 입력받은 정수들의 누적값을 넣기 위한 변수 생성 및 할당
boolean flag = true; // while문 탈출을 위한 변수 생성
while (flag) { // flag 기본값이 true 이기 때문에 반복
System.out.print("정수 입력 : ");
num = sc.nextInt(); // num을 이때 입력 받는다.
sum = sum + num; // sum에 num의 값을 더해서 누적시키기
System.out.println("누적결과 : " + sum); // 누적결과 출력해주기
if(num == -1) flag = false; // -1을 입력받았을 경우에는 while문 빠져나오기(flag 상태 변경)
} // while문 끝
System.out.println("종료되었습니다."); // 종료되었을 경우에는 while문을 빠져나와서 출력
}
}
위 소스에서 보시면 아시겠지만, if문은 저렇게 한 줄로도 처리 가능합니다. while문 안에서도 -1을 입력받으면 종료문을 출력하셔도 됩니다.
풀이 :
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); // Scanner 객체 생성
int num; // 정수를 반복적으로 입력받기 위한 변수 생성
boolean flag = true; // while문 탈출을 위한 변수 생성
int evenSum = 0; // 짝수의 누적 값을 넣기 위한 변수 생성 및 할당
int oddSum = 0; // 홀수의 누적 값을 넣기 위한 변수 생성 및 할당
while (flag) { // flag 기본값이 true 이기 때문에 반복
System.out.print("숫자 입력 : ");
num = sc.nextInt(); // num을 이때 입력 받는다.
if (num % 2 == 0) {
evenSum = evenSum + 1; // evenSum에 num의 값을 더해서 짝수 값 누적시키기
} else {
oddSum = oddSum + 1; // oddSum에 num의 값을 더해서 홀수 값 누적시키기
}
if(num == -1) break; // -1을 입력받았을 경우에는 while문 빠져나오기
System.out.println("짝수개수 : " + evenSum); // 짝수 누적결과 출력해주기
System.out.println("홀수개수 : " + oddSum); // 홀수 누적결과 출력해주기
} // while문 끝
System.out.println("종료되었습니다."); // 종료되었을 경우에는 while문을 빠져나와서 출력
}
}
짝수와 홀수의 값을 나눠서 누적시키기 위해 변수 2개를 만들었습니다. 이번에는 반복문에서 반복을 멈추고 빠져나오는 break; 를 써서 처리하였습니다. break; 를 사용하면 그 즉시 반복문을 빠져나가게 됩니다.
2. do-while 문
do-while 반복문은 최소 한 번은 실행되어야 할 코드가 있을 때 사용합니다. 조건을 나중에 검사하기 때문에 무조건 한 번은 실행됩니다.
흐름 :
1. 코드 블록 실행
2. 조건 검사(참이면 반복문 실행, 거짓이면 종료)
3. 다시 코드 블록 실행
예제 :
int i = 0;
do {
System.out.println("i의 값: " + i);
i++;
} while (i < 5);
위 예제는 i가 0부터 4까지 증가하면서 총 5번 실행됩니다.
특징:
- 최소 한 번은 실행되어야 할 때 적합합니다.
- 조건을 나중에 검사하므로 코드 블록이 최소 한 번은 실행됩니다.
풀이 :
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); // Scanner 객체 생성
System.out.print("현재몸무게 : ");
int cWeight = sc.nextInt(); // 현재 몸무게 입력받기
System.out.print("목표몸무게 : ");
int gWeight = sc.nextInt(); // 목표 몸무게 입력받기
int i = 1; // 몇주차인지 표시하기 위한 숫자 생성
int oWeight = 0; // 주차 감량 몸무게
do {
System.out.print(i + "주차 감량 몸무게 : ");
oWeight = sc.nextInt(); // 매주 감량 몸무게 입력받기
cWeight = cWeight - oWeight; // 현재 몸무게에서 감량 몸무게 빼주기
i++; // 1주, 2주, 3주 증가
} while (cWeight > gWeight); // 현재 몸무게가 목표 몸무게보다 크면 while문 반복
System.out.println(cWeight + "kg 달성!! 축하합니다!!");
}
}
풀이 :
import java.util.Random;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); // Scanner 객체 생성
Random rd = new Random(); // Random 객체 생성
System.out.println("===Plus Game===");
int num1, num2 = 0; // 랜덤으로 뽑을 정수 2개 선언 및 초기화
int sum = 0; //사용자에게 입력받을 값을 선언 및 초기화
String yn = "N"; // 계속 할것인지 입력받을 값 선언 및 초기화
do {
num1 = rd.nextInt(10) + 1; // 랜덤으로 1~10까지 뽑기
num2 = rd.nextInt(10) + 1; // 랜덤으로 1~10까지 뽑기
System.out.print(num1 + "+" + num2 + "=");
sum = sc.nextInt();
if(num1 + num2 != sum) {
System.out.print("계속 하시겠습니까? >> ");
yn = sc.next();
if (yn.equals("N")) { // 문자열 비교 함수 : yn값과 () 안의 값이 일치하는 지 비교 같으면 true
break;
}
}
} while (true); // break로 빠져나오기 전까지 while문 반복
System.out.println("종료합니다.");
}
}
이번 예제에서는 Random이라는 새로운 class가 등장하였고, equals 란 문자열 비교 함수도 사용하였습니다. Java의 수많은 class들과 함수를 다 설명하기에는 어렵기에 참조 부탁드립니다.
풀이 :
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); // Scanner 객체 생성
String id = ""; // 입력받을 id 변수 선언 및 초기화
String pw = ""; // 입력받을 pw 변수 선언 및 초기화
int wrongCnt = 0;
do {
System.out.print("아이디를 입력하세요 : ");
id = sc.next();
System.out.print("비밀번호를 입력하세요 : ");
pw = sc.next();
if (id.equals("test") && pw.equals("test1234")) { // 아이디와 비밀번호 모두 일치하면 실행
System.out.println("로그인 성공!");
break;
} else { // 아이디나 비밀번호 둘 중에 하나라도 틀릴 시 실행
wrongCnt++; // 실패할때마다 카운트 ++
System.out.println("로그인 실패..!");
}
if (wrongCnt == 3) { // 3회 틀렸을 시
System.out.println("아이디와 비밀번호가 3회 틀렸습니다.");
break;
}
} while (true); // break로 빠져나오기 전까지 while문 반복
}
}
3개의 Step으로 나뉘어 있는데, 풀이 소스를 한 번에 올렸습니다. do-while문과 제어문을 잘 사용하시면 쉽게 풀 수 있습니다.
풀이 :
import java.util.Random;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); // Scanner 객체 생성
Random rd = new Random(); // Random 객체 생성
System.out.println("======1부터 100 사이 숫자 맞추기 게임!=====");
int randomNumber = rd.nextInt(100) + 1; // 1~100 사이 랜덤 숫자 변수 생성
int selectNumber = 0; // 사용자에게 숫자를 입력받기 위한 변수 생성 및 초기화
System.out.println(randomNumber);
do {
System.out.print("1과 100사이의 정수를 입력하세요 >>");
selectNumber = sc.nextInt();
if (selectNumber == randomNumber) { // 정답일 경우 break;
break;
} else {
// 입력한 숫자가 랜덤 숫자 보다 크면 더 작은수로 시도 메시지, 작으면 더 큰수로 시도 메시지 출력
// 연산자에서 배운 삼항연산자 사용
System.out.println(selectNumber > randomNumber ? "더 작은 수로 다시 시도 해보세요" : "더 큰 수로 다시 시도 해보세요");
}
} while (true); // break로 빠져나오기 전까지 while문 반복
System.out.println(selectNumber + " 정답입니다!!");
}
}
위 예제에서는 저희가 지난 연산자 시간 때 배운 삼항연산자를 사용하였습니다. 이렇게 한 번씩 사용해주지 않으면 까먹게 됩니다. 문제 풀이에 있어서 다양한 방법을 해보는 것도 좋은 습관이라고 생각합니다.
3. for 문
for 반복문은 반복 횟수가 정해져 있을 때 사용합니다. 보통 초기값, 조건식, 증감식을 포함하여 작성됩니다.
흐름:
1. 초기화
2. 조건 검사 (참이면 반복문 실행, 거짓이면 종료)
3. 코드 블록 실행
4. 증감식
5. 다시 조건 검사로 돌아감
예제 :
for (int i = 0; i < 5; i++) {
System.out.println("i의 값: " + i);
}
위 예제는 i가 0부터 4까지 증가하면서 총 5번 실행됩니다.
특징:
- 반복 횟수가 명확할 때 사용하기 좋습니다.
- 초기화, 조건식, 증감식이 한 줄에 모여 있어 가독성이 높습니다.
기초 예제입니다. for문의 기본 원리를 설명하고 있기 때문에 눈으로 보고 넘어가시길 바랍니다.
풀이 :
public class Main {
public static void main(String[] args) {
for (int i = 96; i > 72; i--) {
System.out.print(i + " ");
}
}
}
public class Main {
public static void main(String[] args) {
for (int i = 95; i > 72; i -= 2) {
System.out.print(i + " ");
}
}
}
제어문을 추가해서 i % 2 == 0 이면 짝수 아니면 홀수로 처리해서 출력하는 방법도 있지만, 이러한 방법도 있습니다.
풀이 :
public class Main {
public static void main(String[] args) {
for (int i = 1; i < 10; i++) {
System.out.print("2*" + i + "=");
System.out.println(2 * i);
}
}
}
풀이 :
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); // Scanner 객체 생성
System.out.print("단 입력 : ");
int guguDan = sc.nextInt();
for (int i = 1; i < 10; i++) {
System.out.print(guguDan + "*" + i + "=");
System.out.println(guguDan * i);
}
}
}
위 문제의 응용문제입니다. 입력받는 부분에만 변수를 사용하시면 됩니다. 변할 수 있는 수.
풀이 :
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); // Scanner 객체 생성
System.out.print("단 입력 : ");
int guguDan = sc.nextInt();
System.out.print("어느 수까지 출력 : ");
int endNum = sc.nextInt();
for (int i = 1; i <= endNum; i++) {
System.out.print(guguDan + "*" + i + "=");
System.out.println(guguDan * i);
}
}
}
위 예제는 for문이 언제까지 반복되는지에 대한 응용문제라고 할 수 있습니다.
풀이 :
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); // Scanner 객체 생성
System.out.print("정수 입력 : ");
int num = sc.nextInt();
for (int i = 1; i <= num; i++) {
if (num % i == 0) {
System.out.print(i + " ");
}
}
}
}
홀수, 짝수 구하는 것과 비슷한 원리입니다. 1부터 입력받은 숫자까지 반복되면서, 입력받은 수에서 1부터 반복되는 숫자 중 나눠 떨어지는 수를 구하는 겁니다.
풀이 :
public class Main {
public static void main(String[] args) {
int num = 77; // 1씩 감소될 숫자 변수 선언 및 초기화
int sum = 0; // (77*1) + (76*2) 계속 더해지는 누적치를 담을 변수 선언 및 초기화
for (int i = 1; i <= 77; i++) { // 1부터 77까지 반복
sum += num * i; // sum = sum + (num * i)
num--; // 77에서 1씩 감소
}
System.out.println(sum);
}
}
향상된 for 반복문 (Enhanced for loop)
향상된 for 반복문은 배열이나 컬렉션과 같은 반복 가능한 객체에 대해 반복할 때 사용합니다. Java 5부터 도입되었으며, 간결한 문법을 제공합니다.
흐름 :
1. 배열이나 컬렉션의 첫 번째 요소를 변수에 저장
2. 코드 블록 실행
3. 다음 요소를 변수에 저장
4. 마지막 요소까지 반복
예제 :
int[] numbers = {1, 2, 3, 4, 5};
for (int number : numbers) {
System.out.println("number의 값: " + number);
}
위 예제는 배열 numbers의 각 요소를 number 변수에 저장하여 출력합니다.
장점:
- 배열이나 컬렉션을 간편하게 반복할 수 있습니다.
- 코드가 간결해지고 가독성이 높아집니다.
향상된 for문은 저희가 아직 배열을 배우지 않았기 때문에 배열을 배우고 난 뒤 예제에서 다루도록 하겠습니다.
마무리
제어문에 이어서 반복문도 정말 많이 사용하는 구문입니다. 이번 시간에 다루지 않았지만 for문에 더불어 이중 for문도 굉장히 많이 사용합니다.(데이터 출력 시) for문의 내용이 충분히 길기 때문에 다음 시간에는 이중 for문만 따로 다루도록 하겠습니다. 프로그래밍은 정말 많은 연습이 필요합니다.
이를 통해 코드의 효율성을 높이고, 가독성을 개선할 수 있습니다. 위에서 설명한 for, while, do-while, 향상된 for 반복문의 사용법과 예제를 통해 반복문을 이해하고 활용하는 데 도움이 되길 바랍니다.
'프로그래밍 기초 > Java' 카테고리의 다른 글
[Java] 배열: 개념, 선언 방법, 데이터 접근 및 초기화 (0) | 2024.06.15 |
---|---|
[Java] 이중 for문 쉽게 배우기: 초보자를 위한 개념과 예제 (0) | 2024.06.15 |
[Java] 조건문 완벽 가이드 : 정의, 종류, 사용법, 특징 총 정리 (0) | 2024.06.12 |
[Java] 연산자 총정리 : 종류, 사용법, 특징, 우선순위까지! (0) | 2024.06.11 |
[Java] 변수와 상수의 이해: 선언 방법과 규칙, 자료형 및 형변환 (0) | 2024.06.10 |