본문 바로가기
국비수업

[국비 Java 8일차] 중첩 for문 별찍기, while문, continue, break

by 박다비 2022. 10. 27.

오메..복습하니까 11시 반이네..
내일 쓸게요...


오늘 배운거…중첩 for문

 

중첩 for문

말그대로 for문이 중첩된거로

for문안에 for문이 또 있는거임

for문도어려운데 뭔 for문안에 for문이있냐..할것임

하지만 사용하다보면 왜 쓰는지 알것이다......

 

중첩 for문의 포인트는

외부for문이 1번돌때 내부포문은 false가 될때까지 처음부터 계속돈다

외부for문이 2번 돌면 내부포문은 다시 처음으로 리셋되서 다시 처음부터 false가 될때까지 돈다..

를 기억해야함 



<12345를 3줄로 for문을 이용해 출력해보삼>

1 2 3 4 5 

1 2 3 4 5 

1 2 3 4 5 


먼저 출력되야할 문장을 for문으로 적어보삼

1 2 3 4 5가 반복되서 출력이 되야하니까

for(int i=1; i<=5; i++){

      System.out.print( i +" ");

}             (여기서부터이해안간다? 그럼 for문을 먼저 제대로 이해하고 중첩for문을 배워야함) 

...이렇게 하면 1 2 3 4 5 가 출력될거임

이제 이걸 3번 반복해서 출력하면됨.

줄 개행을 해서 이걸 세번 반복하면 되겠구나...머리를 굴러서 생각해보고

그럼 줄 개행되는게 3번 반복되야할걸 또 for문으로 작성해봄

for(int j = 1; j <= 3 ; j++{

       System.out.println();

}

그럼 또 반복되야할 12345 for문을 for안에 넣는거임..왜?  이것도 세번 반복되서 출력되야하니까..

왜  System.out.println();문이 아래에 있을까?  -> 12345가 한번 반복되고 개행이되고 그다음에 또 12345가 반복되야 출력문이 맞게 나오는거임 

for(int j =1; j <=3; j++){ //변수명 다르게!!!!!!!
	for(int i=1; i<=5; i++){
		System.out.print( i +” “ );
	}
	System.out.println();
}

 

 

 

<  * 을 for문을 이용해 4행 4열로 출력을 해보시오> 
****
****
****
****
출력해보삼…

 

 

이것도 차근차근

먼저 *****을 for문으로 출력을 해보는거임

for(int i=1; i<=4; i++) {
	System.out.print("*");
}

출력하면 **** 가 출력이 되겠구나....

그럼 이걸 4번 반복해서 출력을 하면되는데 4번반복한 다음에 끝나고 개행을 추가를 하면 되겠구나..

일단 개행되는 for문을 하나 또 만들어봄

for(int j=1; j <= 4; j++) {
	System.out.println();
}


그럼 이제 합쳐보는거임

for(int j=1; j <= 4; j++) {
	for(int i=1; i<=4; i++) {
		System.out.print("*");
	}
	System.out.println();
}

 

 

탈주를 부르는 별찍기가 왔음!!!!!!!!!!!!!!!!!!!!!!1


<  * 를 개행할때마다 하나씩 늘어나는 모양으로 출력해보슈> 


*
**
***
****
출력해보삼….

 

 

머리를 한번 굴려보는거임

*가...한번 돌고 개행할떄마다 하나씩 늘어나야하는거임  <이걸 파악해야함> 

그럼 일단 개행 for문 은 똑같음

for(int j=1; j<=4; j++) {  //j가 4보다 작거나 같을 동안 반복 
	System.out.println();
}

문제는 * 하나 찍고 개행이 되고나서 하나씩 늘어나야한다...그럼 조건식이 어떻게 되야하나...

어려우니까 일단 보여주고 이해를 해보는 쪽으로... 

for(int j=1; j<=4; j++) {
	for(int i=1; i<= j ; i++) {
		System.out.print("*");
	}
	System.out.println();
}

내부 for문의 저 이해안되는 조건식은 뭘까...    i < = j....? 

i가 j보다 작거나 같은동안...for문이 돈다...

 

일단 어떻게 해야 별이 개행이되면서 하나씩 늘어날까를 생각해보는거임

 

맨처음에 별이 한개찍히고 2로증감되면 false 되서 외부 포문으로 가서 개행을 해야함

 

여기서 헷갈리지 말아야할게 j가 외부포문변수고 i가 내부포문 변수임

 

외부포문j는 일단 쉬우니까 통과되고 바로 내부 포문을 만남 

처음에는 i가 1임. 별이 1개 찍혀야하니까 조건식이   i <= 1 (  i가 1보다 작거나 같아야함)이어야함 

그래야 * 한개를 찍고 2가 될때 false가 되쥬...... 암튼 별한개찍고 i가 증가되서 false되서 나감. 

 그럼 외부포문이 계속 진행이 되가지고 개행을하고 외부포문이 돌아서  j는 2가 됨 

그럼 또 내부포문으로가서 다시 i가 1부터 시작하고  i가 2보다 작거나 같을 동안 (i <= 2)이 돌아서

별이 두개가 찍힘.

그럼 내부 for문이 i++되서 3되가지고 조건식이 안맞아서 false되서 나감.

그럼 나가가지고 개행을 만나서 개행하고 돌아와서 j가 ++ 되서 3이됨, 외부포문이 조건이 맞으니 

이제 또 내부포문으로 들어가서 별을 3개를 찍어야하니까 i는 1부터 시작해서 i가 3보다 작거나 같을동안 (i <= 3)

이니까 별이 *** 찍힘...

그 다음에 i++되서 4되가지고 false되서 내부포문 나가고 외부포문만나서 개행하고 j가 4가되서 또 내부포문으로 오고 다시 i는 1부터시작해서 4까지 ****을 찍음....그리고 i++되서 5되가지고 false되고  나가서 개행하고 j까지++ 되서 5가 되서 외부포문까지 나가게됨

 

결론적으로 i랑 j랑 같이 가면 되겠구나....

i가 j보다 작거나 같은 동안 *을 찍는거임 

이건 그냥 돌아가는 꼴을 보고 i <=j 조건을 이해를 하면 아주 잘한거다...짝짝

근데 이거 거꾸로 출력하는게 더 어려움 ㅋㅎ

사실 이건 수업에서 안 가르쳐줌...왜 가르쳐줬을까? 

 

 

 

 

중첩 for문 마지막 예제

구구단을 2단부터 9단까지 다 출력해보자

 

우선 2단부터 출력해보셈

int dan = 2;
	for(int i = 1; i<= 9; i ++) {
		System.out.printf("%d x %d = %d\n", dan, i, dan*i );
	}

여기까진 이해되쥬? 

 

그다음에 중첩으로 짜보셈

for(int dan = 2; dan <= 9 ; dan++) {
	System.out.println("====" +dan+ "단 ====");
		for(int i = 1; i<= 9; i ++) {
			System.out.printf("%d x %d = %d\n", dan, i, dan*i );
		}
		System.out.println();
}

외부포문의 j변수대신 dan 변수만 쓴거임.....알아보기쉽게 하기 위해서

맨처음 dan이 2부터 시작됨. 왜?  구구단은 2단부터 시작하니까 그리고 마지막 9단까지 있으니까 dan <= 9까지 돌거임

 

외부포문이 시작되고 dan은 2임...그리고 ===== 2단====을 출력함. 그다음에 내부포문을 만나서 2단을 2 x 1 = 2 에서부터 2x9 = dan*i 까지  다 출력하고 나서 i가 10이 됐을때 빠져나오고 외부포문의 개행을 만나서 출력하고 다시 외부포문의 dan++ 을 하고 조건식을 가서 트루니까 다시 그~대로 실행함...이게 계속 반복되는거임

 

포인트는...외부포문이 1번 돌때 내부포문은 i가 1에서부터 9까지 9번돌고 빠져나오고 다시 외부포문이돈다~ 라는걸 기억하면됨 외부 포문 2번째 돌면 다시 내부포문은 i가 1에서부터 9까지 9번돌고 빠져나오고 또 반복임

 

 

for문은 실무에서도 프젝에서도 굉장히 많이 사용되기 때문에 

무조건 이해가 될 때까지 반복반복반복 하도록한다

 

 

 

 

이제 while문임

 

 

while문 

for문 이해했으면 while 문 이해 쌉 쉬움

일단 표현법부터 

 

 

 [초기식;]  -> 생략가능함
 while ( 조건식 ) {
           반복적으로 실행할코드;
           [증감식;] -> 생략가능 
}

 

생긴것만 다를뿐 for문이랑 돌아가는 구조는 똑같음

먼저 초기식 있으면 초기식부터 실행하고 

 조건식이 true일 경우 해당 코드 실행 -> 증감식있으면 증감 ->  
 *  조건식 검사 -> true일 경우 실행코드 실행 - > 증감식있으면 증감 ->  
 *  조건식 검사 -> true일 경우 실행코드 실행- > 증감식있으면 증감 ->  
 *  조건식 검사 -> true일 경우 실행코드 실행- > 증감식있으면 증감 ->  
 *  조건식 검사 -> false일 경우 실행코드 실행X -> 반복문 빠져나감 

 

while문으로 for문과 같이 안녕하세요 5번 출력해보겠음

	int i = 1;  //초기식
		while(i<=5) { //조건식
			System.out.println("안녕하세요");
			i++; //증감식이 없을경우 i는 계속 1이여서 무한 반복문이 된다.
			// i가 6이 되는 순간 빠져나옴 
		}
		
		//for문과 while의 차이!! i값을 출력할 수 있다
		System.out.println("i의 값 : " + i);
		//i의 값 : 6
		//i값을  while문 밖에서도 출력 할 수 있음 
		//왜냐면 초기식이 while문 밖에 선언이 되어있으니까
	}

***** for문과 while의 차이!!   i 값 을 반복문 밖에서 출력할 수 있다*******
왜냐면 초기식이 while문 밖에 선언이 되어있으니까

 

 

 

while문으로 12345 출력해보기

	int i = 1;
		while (i <=5 ) {
			System.out.print(i +" ");
			i ++;
		}

for문으로 이미 해봐서 쩜 쉬움.

 

 

1부터 랜덤값(1~100) 까지의 합계를 구해보겠음 

int random = (int)(Math.random()*100 +1);
System.out.println(random);
	
int sum = 0; //합계나오면 sum부터 선언후 초기화하는 습관을 들이자~!

int i = 1 ; //while문 초기식
while (i <=random) {
	sum += i; // 누적합 공식 
	i++;
}
System.out.println("1 부터 "+ random+ "까지의 합 : " +sum );

 

누적합 공식 머라고했음?

이해 안되면 걍 외우라고 했쥬?

 

 

문자열을 입력받아서

하나씩 출력해보기 

		Scanner sc = new Scanner(System.in);
		System.out.print("문자열 입력 : ");
		String str = sc.nextLine();
		
		int i = 0;//초기식
		while(i <str.length()){ //조건식
			System.out.println(str.charAt(i));
			i++; //증감식 
			//출력과 증감은 셋트로 반복되어야한다 
		}
		//갖고오는것도 능력~~~ 
	}

 

 

for문으로 했던걸 while문으로 바꿔서 실습해봤지만

사실 while문은 이거 말고 무한루프로 더 많이 사용됨

분기문에서 사용해보겠음

 

 

while문했으니 do-while문 해보겠음

사실 do - while문은 실무에서 사용할일이 별로 없다고함

왜? 인지는 두와일 이해하고 마지막에 설명 

 

do - while 문

두와일은 한번은 무족권 실행을 하고 조건검사를 하는 특징이 있음

do {
        * 반복적으로 실행할 코드 (한번은무족권실행!!) *
} while (조건식) ; 

무조건 do안에 있는 문장을 1번 수행후에 while문의 조건식을 본다 

 

 

처음에 do 안의 무조건 실행코드 실행
그다음에  --> 조건식 검사 --> true일 경우 do 안에 실행코드 실행 
 *   --> 조건식 검사 --> true일 경우 do 안에  실행코드 실행 
 *   --> 조건식 검사 --> true일 경우 do 안에 실행코드 실행 
 *   --> 조건식 검사 --> false일 경우 실행코드 실행x -> 반복문 빠져나감 

int num =1;
		do {
			System.out.println("num의 값 : " + num);
		}while( false ); //대놓고 false
		//조건이 애초에 맞지않아도 무조건 한번은 실행함!!
		
	
	//조건이 false인데도 값 출력이 됨~  최소 한번은 무족건 때리고 조건검사함
		int i = 1;
		do {
			//실행할 코드 자리
			System.out.print(i + " ");
			i++;
			//조건이 트루면 와일이랑 똑가틈
			//차이나는건 false일때 
			//어차피 조건이 false일 경우가 별로 없기때문에
			//실무에서 별로 안씀 // 차이점 정도만 알고가면댐
		}while(i<=5);

 

긍까 조건이 트루면 결국 while문과 별 차이가 없는 것임...

 

for/ while 문 같은 경우에는 조건 검사를 한 후에 true여야만 수행을 했음
 *     근데 do- while문은 조건검사 없이 무조건 한번은 수행한다~~~~~~~~~~
 *     조건이 트루가 아닌데 실행하는 경우는 많이 없어서 많이 쓰이지는 않는다~~~

 

 

 

 

 

break문

break ;   : 반복문 안에 사용되는 분기문
break;가 실행되는 순간 현재 속해있는 반복문을 강제로 빠져나감

유의사항 : switch문 안의 break;는 단지 switch문"만"을 빠져나가는 구문

 

 

랜덤값 (1~100) 발생시키고 그 랜덤값 출력 
단, 발생된 랜덤값이 3의 배수일 경우 반복문을 빠져나와보자

		while(true) { // 조건이 true면 무한반복을 시키겠다는거임....
			int random = (int)(Math.random()*100 +1);
			System.out.println("random값 : "+ random);
			
			if(random%3==0) { //3의 배수일 경우
				break; //반복문을 강제로 빠져나가게하는 구문
			}
		}

콘솔에 출력된 출력값 마지막이 3의 배수일거임  
랜덤값중 3의배수의 값이 나올때까지 돌다가 조건이맞으면 나옴