일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
- 프로그래머스
- 예외던지기
- 예외처리
- 상속
- 클래스의구조
- 가위바위보프로그램
- AoutoBoxing
- 알고리즘
- 개발
- 국비지원
- 캐스팅연산자
- 추상화
- 자바
- for문
- 백앤드
- exception
- Date Class
- Calendar Class
- super 생성자
- userDefineException
- 비전공자
- do~while문
- 부모 생성자
- 사용자 정의 예외처리
- 코딩
- 취준생
- 개발자
- 생성자
- Java
- 독학
- Today
- Total
유난스런 개발 기록
[JAVA] Day-7 _ 반복문 (for, while, do~while) 본문
day-7
반복문
반복문이란?
- 특정 수행문을 반복적으로 실행할 때 사용한다.
- 반복문의 종류는 for, while, do~ while이 있다.
for
for문의 기본 형식은 코드블록의 내용과 같다.
for(초기식; 조건식; 증감식) {
반복 수행문;
}
// 수행 순서는 1. 초기식 => 2. 조건식 => 3. 반복 수행문 => 4. 증감식
// 다시 돌아와 2. 조건식 => 3. 반복수행문 => 4. 증감식
// 조건식이 false가 되기 전까지 반복한다.
- 초기식이란 조건식에 사용할 변수를 선언해주고 초기값을 설정해준다. 이것은 for문이 실행되는 동안 한번만 실행이 된다.
- 조건식이란 초기에 선언한 변수를 사용해 반복문을 계속 실행할지 결정한다. true일 경우 지속하고 false일 경우에 중단한다.
- 증감식이란 조건식에서 결과가 false일 경우 조건식의 변수의 값을 증감한다.
- 반복문은 위의 코드블럭의 순서대로 반복을 수행한다.
- 반복문 안에 또 다른 반복문 혹은 조건문(if)을 사용할 수 있다.
"안녕 자바~~" 를 10번 출력하는 for문을 작성해보자
for(int i = 0; i<10; i++) {
System.out.println( i+1 + ".안녕 자바~~");
}
/*
출력 결과
1. 안녕 자바~~
2. 안녕 자바~~
3. 안녕 자바~~
4. 안녕 자바~~
5. 안녕 자바~~
6. 안녕 자바~~
7. 안녕 자바
8. 안녕 자바~~
9. 안녕 자바~~
10. 안녕 자바~~
*/
반복문을 이용한 연습문제로 별찍기가 가장 유명하다.
예전에 연습했던 기본적인 별찍기 코드는
2022.08.18 - [개인 개발 공부 기록] - [JAVA] for문을 활용한 별 찍기 에 정리해두었다.
이중 for문과 if문을 활용한 예시다.
for(int i=0; i<4; i++) { // 4행
if(i==2) continue; // continue; 가 되어지면 밑으로 내려가지 않고 가장 가까운 반복문의 증감식으로 이동한다.
for(int j=0; j<3; j++) { // 3열
System.out.print("["+i+","+j+"]");
}// end of for----------------
System.out.print("\n");
}// end of for---------------------
예시 코드에서 contine를 사용했는데, 만약 i가 증감식에 의해 3번쨰 반복에서 2가 된다면
그 때 제일 바깥에 있는 반복문을 빠져나가 반복을 종료하도록 만드는 코드다.
하지만
i=0 과 i=1이 되는 반복까지는 이중 반복문을 모두 실행한다.
출력 결과는 다음과 같다.
[0,0][0,1][0,2]
[1,0][1,1][1,2]
[3,0][3,1][3,2]
while
- while문은 for문과 달리 반복횟수가 불명확할 떄 사용한다.
초기식;
while(조건식) {
반복 수행문;
증감식;
}
//각 식의 의미는 for문과 동일하다.
/* while문의 실행 순서는 1.초기식 => 2.조건식 => 3.반복 수행문 => 4.증감식 순서이며,
n차 반복을 하게 되면 위 순서에 이어서 5.조건식 => 6.반복 수행문 => 7.증감식 ...
이렇게 n차 반복까지 계속 반복한다.
*/
while문의 형태는 위의 코드블럭과 같다.
while문을 이용해서 "안녕 자바~~"를 5회 반복하는 코드는 다음과 같다.
int cnt = 5, loop = 0;
while(loop < cnt) { // 0<5(참) 1<5(참) 2<5(참) 3<5(참) 4<5(참) 5<5(거짓)
System.out.println( (loop+1)+".안녕자바~~" );
loop++; // loop의 값 ==> 1 2 3 4 5
}// end of while-------------------
/*
1.안녕자바~~
2.안녕자바~~
3.안녕자바~~
4.안녕자바~~
5.안녕자바~~
*/
for문과 크게 다를 것이 없는 형태이다.
그렇다면 구구단을 작성해보자.
1단 부터 시작해서 9단까지 출력해주는 코드는 다음과 같다.
System.out.printf("%35s\n", "=== 구구단 ===");
// 9행 8열
//jul dan
int jul=0, dan=1;
while( !(++jul > 9) ) {// 9행
while( !(++dan > 9)) {// 8열
String str = (dan < 9)?"\t":"\n";
System.out.print(dan+"*"+jul+"="+(dan*jul)+str );
}// end of while---------------------------------
// dan <== 10 이 처음 빠져나왔을 때의 값이다.
//그렇기 때문에 다음 이어질 구구단을 위해 dan을 초기화 한다.
dan=1; // 다시한번 초기화
}// end of while-----------------------
조건식은 일부러 부정문을 이용해봤다. jul이라는 변수가 9를 초과하지 않을 때까지 반복한다는 조건식을 작성했다.
간단하게는 그냥 jul<=9; 라고 작성할 수 있다. dan도 마찬가지다.
이때 마지막 코드에 dan=1;로 초기화해준 것은 1회 반복을 마치고 다음 구구단 작성을 위해 곱해줄 수를 1부터 시작하기 위해서다.
코드를 실행하면 다음과 같이 결과가 나온다.
=== 구구단 ===
2*1=2 3*1=3 4*1=4 5*1=5 6*1=6 7*1=7 8*1=8 9*1=9
2*2=4 3*2=6 4*2=8 5*2=10 6*2=12 7*2=14 8*2=16 9*2=18
2*3=6 3*3=9 4*3=12 5*3=15 6*3=18 7*3=21 8*3=24 9*3=27
2*4=8 3*4=12 4*4=16 5*4=20 6*4=24 7*4=28 8*4=32 9*4=36
2*5=10 3*5=15 4*5=20 5*5=25 6*5=30 7*5=35 8*5=40 9*5=45
2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 7*6=42 8*6=48 9*6=54
2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 8*7=56 9*7=63
2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 9*8=72
2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
do~ while
- do~while문은 반복 수행문이 조건식 전에 실행이 된다. 때문에 조건식이 false일지라도 무조건 한 번은 실행이 된다.
개인적으로 for문이 가장 재미있고 편하다... 그래도 do~while문의 형태와 사용법은 익혀두자!
초기식;
do{
반복 수행문;
증감식;
} while(조건식);
/*
반복 순서는 1.초기식 => 2.반복수행문 => 3.증감식 => 4.조건식 순서이며
n차 반복할 때는 위의 순서에 이어서 5.반복수행문 => 6.증감식 => 7.조건식 ...
으로 반복이 끝날 때까지 계속 반복문을 수행한다.
기본적인 형태는 위와 같다. 개인적으로 로그인이나 회원가입 시 특정 조건에 부합할 때까지
무한 루프를 돌릴 때 do~while을 가장 바깥 반복문으로 많이 이용했다. 학원에서 선생님도 그렇게 하시던데...!
이후 그 안을 for문을 이용해 세부적인 조건을 만들어주고
전체적으로 try~catch를 걸어 예외처리를 하는게 깔끔하고 가독성이 좋아보이긴 했다.
do while문을 통해
"안녕 자바~~"를 5회 출력해보자
int cnt=5, loop=0;
do {
System.out.println(++loop + ".안녕 자바~~");
} while (loop < cnt);
나는 앞쪽에 반복 횟수도 같이 찍어주고싶어서 ++loop도 출력문 안에 넣어봤다.
출력하면 결과는 다음과 같다.
1.Hello Java~~
2.Hello Java~~
3.Hello Java~~
4.Hello Java~~
5.Hello Java~~
마지막으로 반복문과 조건문 등을 응용해 만든
간단한 소수 구하기 프로그램 코드를 올리고 마무리 한다!
Scanner sc = new Scanner(System.in);
int startNo =0;
int endNo =0;
do {
try {
System.out.print("▷시작 자연수 : ");
startNo = sc.nextInt(); // 1엔터
// 0앤터
// 1.345엔터
// 똘똘이엔터
sc.nextLine();
System.out.print("▷끝 자연수 : ");
endNo = sc.nextInt(); // 2엔터
// -9엔터
// 2.345엔터
// 이순신엔터
sc.nextLine();
if(startNo < 1 || endNo < 1) {
System.out.println(">> [경고] 입력하신 값은 모두 자연이어야 합니다!! <<\n");
}
else if(startNo >= endNo) {
System.out.println(">> [경고] 두번째 입력한 숫자가 입력한 첫번째 숫자보다 커야합니다.!! <<\n");
}
else {
break;
}
}catch(InputMismatchException e) {
System.out.println(">> [경고] 자연수만 입력하세요!! << \n");
sc.nextLine(); // sc.nextLine(); 가 없다면 계속해서 경고가 출력된다.
// 이유는 스캐너에 입력값을 nextInt();로 사용했기 때문에 스캐너 버퍼에 찌꺼기 값이 남아있기 때문이다.
// 때문에 처음부터 sc.nextLine();으로 입력값을 받거나 다른 타입으로 받을 경우 꼭 sc.nextLine();를 넣어줘야한다.
}
} while(true);
// end of do~while---------------------------------------------------
String str_result = "";
int cnt = 0; // 소수의 누적개수
int sum = 0; // 소수들의 누적합
for(int i=startNo; i<=endNo; i++) {
if(i==1) // i가 소수인지 아닌지를 검사할 대상값이다.
continue; // 1은 소수가 아니므로 검사할 필요가 없기 때문에 continue; 를 사용해서 건너 뛴다.
/*
나누기를 했을 때 나머지가 얼마가 되는지 일일이 검사를 한다.
만약에 i가 2 이라면 ==> 2%2==0 2는 소수이다.
만약에 i가 3 이라면 ==> 3%2!=0 3은 소수이다.
만약에 i가 4 이라면 ==> 4%2==0 4%3(이미 한번 나누어 떨져서 검사할 필요가 없다) 4는 소수가 아니다.
만약에 i가 5 이라면 ==> 5%2!=0 5%3!=0 5%4!=0 5는 소수이다.
...............
만약에 i가 9 이라면 ==> 9%2==0 9%3(이미 한번 나누어 떨져서 검사할 필요가 없다) 9는 소수가 아니다.
*/
boolean isSosu = true;
for(int j=2; j<i; j++) { // j가 분모에 들어갈 값이다.
if(i%j == 0) { // 나누어 떨어지면 소수가 아닌 경우다.
isSosu = false;
break; // 현재 for문을 빠져나오는 break; 이다.
}
}// end of for-----------------------------------------------------
if(isSosu) { // 검사대상인 i가 소수이라면
String str_add = (!"".equals(str_result))?",":""; // , (콤마)를 넣어주기 위해 변수를 선언하고 삼항연산자를 사용한다.
// ()?"":"" 가 삼항연산자의 기본 형태
// str_result의 값이 처음이 아니라면 ,를 넣어주고 처음이면 아무것도 하지 않는다.
str_result += str_add + i;
cnt++; // 소수의 개수를 누적한다.
sum += i; // 소수들의 누적합
}
}// end of for---------------------------------------------------
System.out.println(startNo+ "부터"+ endNo +"까지의 소수는?\n" + str_result + "\n");
// 2, 3, 5, 7, 11, 13, 17, 19
System.out.println(startNo+ "부터" +endNo+ "까지의 소수의 개수?"+cnt+"개");
// 1 부터 20 까지의 소수의 개수?
System.out.println(startNo+ "부터" +endNo+ "까지의 소수들의 합?"+sum);
// 1 부터 20 까지의 소수들의 합? 77
sc.close();
System.out.println("=== 프로그램 종료 ===");
프로그램 실행 결과 예시
/*
=== 실행결과 ===
▷시작 자연수 : 1 엔터
▷끝 자연수 : 20 엔터
1 부터 20 까지의 소수는?
2, 3, 5, 7, 11, 13, 17, 19
1 부터 20 까지의 소수의 개수? 8개
1 부터 20 까지의 소수들의 합? 77
=== 프로그램 종료 ===
*/
수업 후 실습한 내용들을 다시 직접 코딩해보느라 블로그를 업로드할 시간이 없었다.
밀린 블로그도 복습이라 생각하고 다시 하나씩 올려 진도에 맞춰 업로드 해야겠다.
'개념정리 > JAVA' 카테고리의 다른 글
[JAVA] Day-8 _ Math.random() 난수 생성하기 (0) | 2023.01.18 |
---|---|
[JAVA] Day-7 _ 중첩 반복문 (0) | 2023.01.18 |
[JAVA] Day-6 _ 조건문(if문, if else문, else if문, switch문) (0) | 2023.01.12 |
[JAVA] Day-5 _ Math Class로 반올림 (0) | 2023.01.12 |
[JAVA] Day-5 _ Wrapper 클래스 (2) | 2023.01.12 |