Developer/JAVA

JAVA , 제어문 (반복문) 기초와 예제

단님 2024. 7. 31. 00:00
728x90
반복문의 기초
  • 반복문의 3요소

반복자의 초기값, 조건식(true or false), 증감식

  • 반복문의 종류

-for : for(초기값; 조건식; 증감식) {.....}

-while, do while :

초기값(before while_Loop), 조건식(true or false => while 조건문),증감식(in while_Loop)

  • 반복자(iterator)

반복문에서 횟수를 count 하는 변수

 

1~100까지 누적합을 구하는 예제
  • for 문
	int startIndex = 1;
	int endIndex = 100;
	int result=0;
	
	for (int i = startIndex ; i <= endIndex; i++) {
		result +=i;
		//result = result + i;
		}
	System.out.println("결과는 :"+result);

 

  • while 문
result = 0;
int i = startIndex;
while(i <= endIndex) {
	result += i++ ;			
}
System.out.println("결과는 :"+result);

 

  • do - while 문
	result = 0;
	i = startIndex;
	do {
		result += i++;
	} while (i <= endIndex);
	System.out.println("결과는 :"+result);

 

  • while 과 do-while 의 비교

while 의 선 체크 후 실행

do while의 선 실행 후 체크

즉,  do while 의 경우 한번은 무조건 실행됨을 의미. (한번의 실행을 보장.)

 

 

1~100까지의 정수중 3의 배수의 합을 구하는 예제
(if와의 중첩)
  • for + if(for 에서 1씩 증가)
int result = 0;
for (int i = 3; i <= 100; i++) {
	if (i %3 ==0) {
		result += i;
	}
}
System.out.println("결과는 : "+ result);
  • for + if(for 에서 3씩 증가)
result =0;
for (int i = 3; i <= 100; i+=3) {
	if (i %3 ==0) {
		result += i;
	}
}
System.out.println("결과는 : "+ result);

 

개인적인 생각으로는 , for에서 3씩 증가하는게 반복작업을 덜 하게 되니 효율적인 것 같다.

굳이 if 로 방어하지 않더라도 , 떨어지는 값이 3씩 증가하기 때문에 if 가 필요 없을 것 같기도 하다.

하지만 나는 방어를 좋아하니까 if 를 쓸래..

 

 

5층건물의 1개 층 7개 방 (5*7)
(for 중첩)

 

5층 건물, 1개 층에서 7개의 방이 있다.
[1층 , 1호] 형식으로 출력
배열을 배우지 않았으니 printf 를 통해 출력해보자

 

 for (int x = 1; x <= 5; x++) {
	for (int y = 1;y <=7; y++) {
		System.out.printf("[ %d 층 , %d 호 ] ", x , y);
	}
	System.out.println();
}

 

 

무한 루프

 

for 문 : 초기식 , 조건식 , 증감식이 없고 , if- break 가 없다면 무한 루프 형성

	System.out.println("for 문의 무한루프");
	int count = 0;
	for( ; ; ){
		System.out.println("for의 count"+count++);
		//if (count >10000) break;
	}

 

while 문 : 조건에 true 가 들어가고 , if - break 가 없다면 무한루프 형성

System.out.println("while 문의 무한루프");
count =0;
while (true) {
	System.out.println("for의 count"+count++);
	//if (count >10) break;
}

 

do-while 문 : while 과 동일 , 조건에 true 가 들어가고 if-break 가 없다면 무한루프 형성

System.out.println("do while 문의 무한루프");
count = 0;
do {
	System.out.println("for의 count"+count++);
	//if (count >10) break;
} while (true);

 


unreachable code  !!

무한 루프 아래에 실행문이 있다면 그 실행코드는 unreachable code Error 발생

위의 무한루프로 인해 실행코드를 실행 할 수 없음을 의미한다.

 

dead code !!

if 절에 무조건 참인 조건이 들어간다면 else의 구문은 절대 사용되지 않는 코드라는 경고발생.

 


continue / lable

 

  • continue 와 break의 차이

continue : continue 문 이하 구문을 실행하지 않고 다음 반복문 진행

break : 반복문 탈출

  • lable

-continue 와 break가 적용된 반복문을 지정할 수 있게 해줌.

-위치를 표시하는 방법 : 필요 반복문 위에 : 로 표시,

-lable 다음에 반복문외의 문장이 오면 break, continue의 인식이 안됨. 오류발생

★반드시 라벨은 반복문 위에 표기★

 

5층건물의 1개 층 7개 방 (5*7)
(continue /break)

5층 건물, 1개 층에서 7개의 방이 있다.
[1층 , 1호] 형식으로 출력
배열을 배우지 않았으니 printf 를 통해 출력해보자

 

  • 4층 4호 의 출력을 건너 뛰어 보자
System.out.println("4층 4호 창고 출력 막기");
for (int i = 1; i <= 5; i++) {
	for (int j = 1; j <= 7; j++) {
		if (i ==4 && j ==4) continue;
		System.out.printf("[ %d , %d ] ",i , j);
	}
	System.out.println();
}
System.out.println();

 

  • 4층 4호 창고 출력 막기+3층 방은 5개밖에 없어요 (continue 이용)
System.out.println("4층 4호 창고 출력 막기+3층 방은 5개");
for (int i = 1; i <= 5; i++) {
	for (int j = 1; j <= 7; j++) {
		if (i ==4 && j ==4 ||  i==3&&j>5) continue;
		System.out.printf("[ %d , %d ] ",i , j);
	}
	System.out.println();
}
System.out.println();
  • 4층 4호 창고 출력 막기+3층 방은 5개밖에 없어요 (break 이용)
System.out.println("4층 4호 창고 출력 막기+3층 방은 5개");
for (int i = 1; i <= 5; i++) {
	for (int j = 1; j <= 7; j++) {
		if (i ==4 && j ==4 ) continue;
		if(i ==3 && j>5 ) break;
		System.out.printf("[ %d , %d ] ",i , j);
	}
	System.out.println();
}
System.out.println();

break 문은 조건에 해당할때 가장 가까운 반복문을 탈출한다.

  • 4층 4호 창고 출력 막기+3층 방은 5개밖에 없어요 ( Lable + continue 이용)
		System.out.println("라벨이용");
		isLable:
		for (int i = 1; i <= 5; i++) {
			for (int j = 1; j <= 7; j++) {
				if (i ==4 && j ==4 ) continue isLable; //[4,3] 까지 출력후 i=5로 진행됨
				System.out.printf("[ %d , %d ] ",i , j);
			}
			System.out.println(); // 이부분도 건너뛰게 되어버림.
		}
		System.out.println();
	}
}

 

줄바꿈또한 건너 뛰어버려 , 4층과 5층의 경계선에서 문제가 생긴다 .

이를 해결할 방안은 ? 추가한 뒤에 건너 뛰면 되잖아 !

isLable:
for (int i = 1; i <= 5; i++) {
	for (int j = 1; j <= 7; j++) {
		if (i ==4 && j ==4 ) {
			System.out.println();//3)2를 건너뛰기 때문에 3을 추가
			continue isLable; //1)[4,3] 까지 출력후 i=5로 진행됨
		}
			System.out.printf("[ %d , %d ] ",i , j);
	}
	System.out.println(); //2) 이부분도 건너뛰게 되어버림.
}

 

  • 4층 이상은 수리를 한대요. 3층은 5번방까지만 있어요
System.out.println("라벨이용");
isLable:
for (int i = 1; i <= 5; i++) {
	for (int j = 1; j <= 7; j++) {
		if (i ==4 && j ==4 ) {
			System.out.println();
			continue isLable;
		}
		if(i ==3 && j>5 ) break isLable ; // lable 로 탈출. 반복문의 종료
		System.out.printf("[ %d , %d ] ",i , j);
	}
	System.out.println(); 
}

 

 

반복문을 통해 별찍기 예제도 참 많이 했는데

할때마다 내 생각의 흐름이 달라져서 참 더티하고 신기한 코드가 나온다..

그래도 , 나의 논리 흐름따라 풀어지는 문제라니 너무 매력적이지 않는가.

코딩이란 참 정답을 알 수 는 없으나 , output 이 확실하게 보여서 신기하다. 

'Developer > JAVA' 카테고리의 다른 글

JAVA, 배열  (0) 2024.08.01
JAVA, Random 클래스와 Math.random() 메서드  (0) 2024.07.31
JAVA , 제어문 (조건문) if / switch  (0) 2024.07.30
Java , 자바의 연산  (3) 2024.07.22
JAVA , Date , Scanner  (4) 2024.07.21