java 반복문, for, while, do, break, continue

limchard·2023년 10월 26일
0

java

목록 보기
29/48

기본 설명

  1. for(초기값;조건식;증감식) {
    문장; => 조건이 참이 될때까지 반복 실행
    }
    ==> 반복횟수가 정해져있는 경우 많이 사용(예: 배열)

  2. while(조건식){
    문장; =>조건이 참이 될때까지 반복 실행.. 조건이 안맞으면 한번도 실행안함(선조건)
    }
    ==>

  3. do{
    문장;
    }while(조건식);
    => do-while문은 조건이 참이 될때까지 반복 실행.. 조건이 안맞아도 한번은 실행함(후조건)

  4. break; ==> 반복문에서 빠져나갈때
    => 현재속한 반복문을 빠져나간다.
    break label:
    :label이 선언된 반복문을 빠져나온다.(한꺼번에 두개 이상도 탈출 가능하다.)

  5. continue; ==> 반복문에서 다시 진행. 즉, skip하는 것.
    => 반복문에서 continue를 만나면 다음 코드를 실행하지 않고, 조건식(while), 증감식(for)문으로 이동한다.


코드 설명

for 문

for(초기값;조건식;증감식)
초기 -> 조건 -> 프린트 -> 증감 -> 조건 -> 프린트 -> 증감 -> 조건 -> 프린트.... 순서로 진행된다. 조건이 끝날때까지..

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

for(int i=0;i<3;i++){
	System.out.println(i);
}
초기 -> 조건 -> 프린트 -> 증감 -> 조건 -> 프린트 -> 증감 -> 조건 -> 프린트.... 순서로 진행된다. 조건이 끝날때까지..

기본 셋팅은 for(초기값;조건식;증감식)에 중괄호를 열어서 syso로 프린트 한다.

기본적으로 돌아가는 로직은 초기->조건->프린트->증감->조건->프린트 순서로 진행된다.

조건에 맞춰질때까지 증감을 한다.

아래 예시처럼 진행을 해보자.

// 5,4,3,2,1
for(int i=5;i>=1;i--) {
	System.out.print(i+" ");
}

아래와 같이 결과가 나온다.

5 4 3 2 1

int total=0;
int a=1;
	for(;a<=10;a++) {
		total+=a;
	}
	System.out.println("1부터 "+a+"까지의 합은 "+total+"입니다");
	System.out.println("1부터 "+(a-1)+"까지의 합은 "+total+"입니다");

결과

1부터 11까지의 합은 55입니다
1부터 10까지의 합은 55입니다

1부터 11까지, 10까지 각각 다르게 나온다.
이유는 다음과 같다.
위에서 a의 경우 for 문을 빠져나오는 시기가 다르다.
위에 기본적으로 증감 -> 조건 -> 프린트 -> 증감 -> 조건... 으로 나온다고 한다.
즉, total+=a로 a가 점점 커지다가 a가 10이 되고 다시 증감으로 올라가 11이 된 후 조건에서 조건이 안맞아 밖으로 나오게 된다.
그러면 10이 아닌 11로 나오게 된다.
이 부분 주의하면서 코드를 작성하자!
for,while의 전반적인 알고리즘을 추가로 공부해서 정립할 필요가 있다고 생각한다.


continue / break

// 1~20까지 출력하는데 1 2 3 4 6 7 8 9 11 12 13 14... (5의 배수 빼고)
for(int i=1;i<=20;i++) {
    // 5의 배수를 빼고 출력하자.
    if(i%5==0)
    continue; //i++로 이동.
    System.out.print(i+"\t");
}

System.out.println();

for(int i=1;i<=20;i++) {
    // 5의 배수를 빼고 출력하자.
    if(i%5==0)
    break; // 반복문 자체를 아예 빠져나옴
    System.out.print(i+"\t");
}

continue와 break의 차이점을 보자.

위 수식의 경우 continue는 해당 조건을 skip(제외)하고 다시 원래 for문으로 돌아간다.'
그래서 결과는 1,2,3,4,6,7,8,9,11.... 으로 나온다.

하지만 break의 경우 해당 조건에 걸리는 순간 반복문이 종료된다.
그래서 결과는 1,2,3,4 까지만 나오고 종료되어버린다.


while

while(조건식){
문장; =>조건이 참이 될때까지 반복 실행.. 조건 이 안맞으면 한번도 실행안함(선조건)
}

1에서 10까지의 숫자를 출력해보자.

while(n<10) {
    n++;
    System.out.printf("%4d",n);
}

블록괄호 안에 while 조건에 맞을 때 출력된다.

while(true)

n=0;
while(true) {
    System.out.printf("%4d",++n);
    // 위 식은 무한루프에 빠지므로 반드시 break문을 주어야 한다.
    if(n==10)
    break;

위 수식의 경우 while(true) 값이다.
위 식의 true를 그대로 print하면 모든 숫자에 해당되므로 무한루프를 돌게 된다.
이를 일정부분 수행하고 끊기 위해서 아래 if문을 사용, break를 명시하여 강제 종료시켜야 한다.
위 식의 결과값은 1~10 까지 자연수가 나오고 break로 인해 수식이 종료된다.

public static void main(String[] args) {
	// TODO Auto-generated method stub

	// 점수를 반복해서 입력하다가 q나 Q를 입력하면 while문을 빠져나온뒤 총갯수, 총점, 평균을 출력하시오.
		
	Scanner sc=new Scanner(System.in);
		
	String n;
	int num = 0,cot=0;
	double avg=0;
		
	while(true) {
			
		System.out.println("숫자를 입력하시오.(q or Q 종료)");
		n=sc.nextLine();
//			if(n.equals("q")||n.equals("Q"))
//			if(n.charAt(0)=='q' || n.chartAt(0)=='Q')
		if(n.equalsIgnoreCase("q"))
			break;
	
		num+=Integer.parseInt(n);
		cot++;
	}
		
	avg=(double)num/cot;
	System.out.println("총점 : "+num);
	System.out.println("갯수 : "+cot);
	System.out.printf("평균 : %.1f",avg);
}    

while(true) 문에 글자와 문자 형변환이 포함되어 진행한 것이다.
여기서 평균의 경우 while(true)문이 종료 되었을 때 총점에 갯수를 나눠야 하므로 평균(avg)는 while(true)문에서 빠져나와 구해야 한다.


public static void main(String[] args) {
	/* 
	 * 임의의 수를 입력해서 함계, 평균, 갯수를 구해볼꺼야
	 * 단, 0을 입력하면 while문을 져나가게 하자.  */
	
	Scanner sc=new Scanner(System.in);
	int su,sum=0; // 입력한 수, 합계 
	int cnt=0; // 갯수 
	double avg=0; // 평균 
		
	while(true) {
		System.out.println("숫자를 입력하세요 (종료:0) ");
		su=sc.nextInt();
		if(su==0)
			break;
			
		sum+=su;
		cnt++;
		
	}	
	avg=(double)sum/cnt;
	System.out.println("입력한 수의 합 : "+sum);
	System.out.println("입력한 수의 갯수 : "+cnt);
	System.out.println("입력한 수의 평균 : "+avg);
}

위 코드의 경우 주의할 점이 있다. if/break 아래에 있는 sum+=su;/cnt++;의 수식이 if/break위로 올라가면 count되는 횟수가 하나 더 늘어난다. 이유는 갯수 변수인 cnt가 0부터 시작인데, break를 위해 누른 0이 갯수 변수에 영향을주어 마지막 종료를 위해 누른 0이 포함된다. 이 부분을 주의해서 code를 작성해야 한다.

위의 예시를 하나 더 보자. 아래 코드 참조.

int i; // 입력할 점수 
	int sum=0;
		
	while(true) {
		System.out.println("점수를 입력하세요.");
		i=sc.nextInt();			
		if(i==0) // break문은 항상 맨 위에 쓴다. 그래야 continue와 겹치지 않는다.	
			break;
		if(i<1||i>100) //continue가 break 위로 가면 0을 눌렀을 시 다시 위로 올라간다. 즉 break가 먹지 않는다.				
			continue;		
		sum+=i; // sum=sum+i
	}
	System.out.println("점수의 합은"+sum);

do~while문 / while문

System.out.println("while문 결과 ");
	// 조건이 선조건 : 조건 안맞으면 실행 안함. 
	while(i>5) {
		// 출력후 증가
		System.out.println(i++);
			
//		System.out.println(i);
//		i++;
	}
		
	System.out.println("do~while문 결과 ");
	// 후조건 : 조건 나중에 온다. 조건 안맞아도 한번 실행
	i=1;
	
	do {
		// 출력 후 증가 
		System.out.println(i++);
	}while(i>5);

while과 do while의 가장 큰 차이점은, 조건이 안맞을 때 실행하냐 안하냐의 차이이다.
while의 경우 위 수식이 맞지 않기 때문에 결과값이 나오지 않는다.
하지만 do~while의 경우 첫번째 결과값인 1은 결과값이 나온다.
솔직히.. 굳이 스럽긴 하다.
강사님도 do~while은 쓰는경우가 거의 없다고 한다.

profile
java를 잡아...... 하... 이게 맞나...

0개의 댓글