본문 바로가기
Backend

05월 20일 월 | OOP 05 - JAVA의 반복문 (for, break, continue)

by 구라미 2019. 5. 20.

6. 자바의 반복문

반복문 연습하기

 

배운 것은 시간내서 꼭 코딩해보기.

클래스 만들면서 동시에 패키지 생성 가능하다.

여러번 반복해야할 것을 프로그래밍으로 반복처리

for, while, do-while 등의 명령어가 있다.

for라는 명령어도 jdk 영향을 받기 때문에 이전버전에서 안되던 것이 최신버전에 허용되는 것이 있음.

 

형식)  for ( 문법 ) { 반복될 내용 } // 한줄 일때는 브라켓 생략할 때도 있음.

 

예) for ( 시작값; 종료값; 증감 ) { 반복될 내용 }

 

프로그래밍에서 scope

스코프는 유효범위이다. 다양하게 만든 것을 어디까지 허용하겠는지, (변수, 클래스 등)

 

1) for문 예제 (증가)

for(int a =1; a<=3; a++){
			System.out.println("Java");						
		}//for end

a라는 변수는 for 안에 선언되었기 때문에 for 안에서만 사용됨.

결과 값은 Java가 세번 씩 줄바꿈 후 출력되었다.

결과값이 거짓이 될때까지 (참인 한) 무한 Loop 상태가 된다.

break : 반복문을 빠져나옴.

continue: 반복문을 계속 수행.

local variable: 지역변수 // 지역안에서만 사용

▶for문의 문법은 손에 완전히 익게 만들기.

( 변수선언 , 번수 범위, 증감 ) { 수행할 명령 }

 

변수의 유효범위

local variable : 지역변수

브라켓 안에서 선언된 변수는 그 안에서만 사용됨.

▶ 지역변수는 그 지역(scope, 범위)를 벗어나면 영향력 X이다.

 

global variable : 전역변수

전역적으로 사용됨.

 

지역변수와 전역변수가 이름이 똑같을때 지역변수(좀더 협소한 개념이 우선순위가 높음)

 

public은

프로젝트명: basicJava

안에서 모든 것을 허용하겠다. 

▶ public private 등 다른 종류들도 있음.

 

for 문안에 있는 변수는 for문이 끝나면 사라짐.

▶ 의미 명확히 알기

 

1) for문 예제 (감소)

for(int b =3; b>=1; b=b-1){
		System.out.println(b+"seoul");						
	}//for end
    
    //결과값
    //3seoul
    //2seoul
    //1seoul

참일 동안 수행한 후 거짓이 되는 순간 for문을 빠져나오고 종료.

for문안에 for가 올 수 있음

for문안에 if가 올 수 있음

if안에 for가 올 수 있음

▶ 즉 제어문 안에 제어문을 감쌀 수 있다는 이야기.

 

3) for문으로 구구단의 4단 출력하기

for(int c =1; c<=9; c++){
	System.out.println("4*"+c+"는 "+c*4+"이다.");						
}//for end

//결과값
//4*1는 4이다.
//4*2는 8이다.
//4*3는 12이다.
//4*4는 16이다.
//4*5는 20이다.
//4*6는 24이다.
//4*7는 28이다.
//4*8는 32이다.
//4*9는 36이다.

1~9까지 숫자에 4를 곱한 값이 차례로 출력된다.

▶ 변수 c의 초기값을 1로 설정한 후, 구구단이므로 범위를 9이하로 설정한다.

그리고 증가연산자로 c의 값을 1씩 증가시키고 4단인 c*4 (c와4의 곱셈연산)을 출력시킨다.

증가연산자로 증가된 값이 for문을 통해 1씩 증가하고 c변수 안에 들어간다.

 

4) for문으로 아스키코드값이 있다면 이런 표현도 틀린 것이 아님.

for(char ch='A'; ch<='Z'; ch++){
	System.out.print(ch);
}

//결과값: ABCDEFGHIJKLMNOPQRSTUVWXYZ

대문자 A부터 Z까지 출력되었다.

▶ 문자(char) 를 증가시키는 것도 가능하다 (아스키코드 숫자값이 있으므로)

A = 65 / a = 97 이며 대문자와 소문자는 32 차이가 난다.

 

5) 1~10 중에서 3의 배수만 출력하기

for(int a=1; a<=10; a++){
	if(a%3==0){
	System.out.println(a);
	}
}

//결과값은 3,6,9가 출력되었다.

for문안에 if문을 사용한 예제이다.

1~10까지 계속 값이 변경되는 변수는 a, 그렇기 때문에 if문안에 a가 들어가야함.

▶ 변수 a의 초기값은 1이고 범위는 10이하로 설정, a 증가연산자를 사용하였다. {}안의

명령은 a값들 중 3의 배수만 출력하라는 의미의 if문 명령이므로 a들 중 10이하의 3의 배수인 3,6,9만 출력되었다.

 

5-1) 1~10 중에서 3의 배수의 갯수를 구하시오.

count하는 것. count는 0에서 시작. 등수는 초기값이 1. // 혼자 시험보면 1등

int count=0;
	for(int a=1; a<=10; a++){
		if(a%3==0){
			count=count+1; //if안의 조건이 맞을때 count변수 1증가 ++로 하니까 잘못된 값나옴..
		}
	}
	System.out.println(count);
        
//결과값 3

syso로 count 를 부를때  for문 밖에서 불러야함. count변수에 3의 배수의 갯수가 저장되고 출력되었다.

▶ 세어준 갯수들을 넣어줄 정수 변수 count를 선언하였다. 

for문으로 변수 a의 초기값 1로, 범위는 10이하로 설정, a 증가연산자 {}안의 if문 명령은 3의 배수만 찾는 것이다

찾은 3의 배수의 수(if문의 조건이 만족할 때마다 count변수에 1씩 추가하므로) 를 count변수안에 쌓는다

1

2

3 (+1)

4

5

6(+1)

7

8

9(+1)

 

 

 

5-2) 1~10 중에서 3의 배수의 총합을 구하시오.

//**3의 배수 다 더해보기 (누적)
		int hap=0; //0이 맞는 값임
		for(int a=1; a<=10; a++){
			if(a%3==0){
				hap=hap+a; //hap+=a
			}
		}
		System.out.println(hap);
        
        //결과값은 18

차례로 오는 숫자들이 3의 배수인지 if문에서 확인한 후 hap 변수에 누적된다

▶ 합계를 담는 hap 변수의 초기값이 아직도 조금 헷갈린다.

곱셈누적은 초기값이 1이라곤 하는데..

방금 다시 검토해보니 개념을 착각하고 있었다.

총 합을 구하는 것은 합을 담는 변수의 초기값이 0이어야 한다.

 

6) 서기1년~서기2019년 중에서 윤년만 출력하기

for (int y=1; y<=2019; y++){
	if(y%4==0 && y%100!=0 || y%400==0){
		System.out.println(y);
	}
}

대상이 y이다. y가 2019번 반복된 후 윤년조건을 만족시키는 y의 값만 출력한다.

*나중에 날짜에 관련된 것은 calendar class 사용

 

프로그래밍에서 대표적으로 가공되는 값

1. 합산 (총계, 총갯수 등 누적값을 내보기)

2. 갯수세기 (값의 갯수 세기 count)

 

초기값 설정할 때 주의해야한다. 등수, 곱과 관련된 것은 초기값 1.

갯수 세는 것은 초기값 0.

 

 

연습문제 1) 1년~서기2019년 중에서 윤년이 몇개인지 세기

int countY=0;
	for (int y=1; y<=2019; y++){
		if(y%4==0 && y%100!=0 || y%400==0){
			countY = countY+1;
		}
	}		
	System.out.println(countY);
    
    //countY에 서기1년~2019년의 윤년의 갯수가 저장되었다.
    //결과값: 489개의 윤년이 있음

1~2019년을 차례대로 세어서

그 중 윤년만 추림

추린 것을 세어 countY변수에 저장

결과값은 489가 나왔다.

▶ if문의 조건이 만족했을 때 countY = countY+1을 수행한다는 것을 다시한번 이해하는 예제였다.

 

연습문제 2) 4의 팩토리얼값을 구하시오 (4*3*2*1)

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

팩토리얼 4의 값

= 4*3*2*1의 값을 구하시오.

팩토리얼4의 값을 담을 변수 fact4를 선언하고

for문을 통해 정수 a의 초기값을 1로 설정하고 4이하로 범위를 정하여 증가시킨다.

그리고 차례로 늘어난 정수에 a값을 곱해준 값을 fact4변수에 저장

for문 밖에서 fact4를 출력하면 팩토리얼 4의 값 24가 출력된다.

▶ fact4 변수같은 경우는 초기값이 0이면 절대 안된다.

fact4변수안에 들어가는 값과 증가한 a값을 차례로 곱해주어야하는 형태인데

초기값이 0으로 설정되어있으면 무조건 답이 0이 되기 때문이다.

 

곱셉은 값이 기하급수로 커지기 때문에 결과값이 담기는 변수를 좀더 큰 범위 자료형으로 선언하는 것도 좋다.

long fact4=1;
	for (int a=1; a<=4; a++){
		fact4=fact4*a;
	}
System.out.println(fact4);

 


반복문 연습문제

 

연습문제 1) 1~100 중에서 2의 배수이면서 3의 배수의 갯수를 구하시오 *6의 최소공배수의 배수를 구하는 것

연습문제 1) 1~100 중에서 2의 배수이면서 3의 배수의 갯수를 구하시오 *6의 최소공배수의 배수를 구하는 것
		int gob6 = 1; //0이어야함.
		for(int a=1; a<=100; a++){
			if(a%6==0){
				gob6 = gob6+1;
			}			
		}
		System.out.println(gob6);
        
        //결과값 17

결과값: 17 // 초기값을 실수하였다. 결과가 등수나, 곱셈이 아닌 합계이므로 0이 초기값이 되어야한다.

▶ 아까 헷갈렸던 것과 비슷한 실수이다. 총 합을 구하는 것이니까 초기값이 0이어야한다.

 

■  선생님 답안  

int count=0;
 for(int a=1; a<=100; a++){
 if(a%2==0 && a%3==0){
 count++;
	}
}
        
//결과값 16개 ->나는 초기값 실수했다

결과값: 16

▶ 선생님은 2와 3의 배수들을 AND 연산하여 해결하셨다.

 

연습문제 2) 소문자 중에서 모음의 갯수를 구하시오 *아스키코드..? a e i o u 5가 나와야하는데...

char count1 = 'a';
	for(char ch='a'; ch<='z';){
	count1 = ch++;
	if(count1%2==1){
	if(count1%5==0 || count1%3==0){
	count1 = count1++;
		System.out.print(count1);
	}
				
	}			
}
        //이상한 값

 아스키코드를 이용하여 모음의 번호를 찾아내려고 했는데 그게 아예 틀린 방법은 아니었으나...넘 어렵고 복잡하고...

▶ 모음들의 아스키코드를 확인하고 증가 규칙성을 이용하여 문제를 해결하려고 했지만 마무리가 되지 못했다.

cisou 같은 결과가 나왔다. 만약 그렇게 할 것이 었다면 if 문의 알파벳 모음 걸러내는 조건이 정확했어야했다.

 

■  선생님 답안  

int mo = 0;
 for(char ch='a'; ch<='z'; ch++){
 if(ch =='a' || ch =='e' || ch=='i' || ch=='o' ||ch=='u'){
   mo++;
 }
}
System.out.println(mo);
       
//결과값: 5

그냥 순서대로 or 써주면 됐음....

너무 어렵게 생각했었다.

Switch문을 사용했을 경우,

int mo1 = 0;
	for (char ch='a'; ch<='z'; ch++){
		switch (ch){
		case 'a':
		case 'e':
		case 'i':
		case 'o':
		case 'u': mo1++;
	 }
	}
	System.out.println(mo);
    
    //결과값: 5

 

 

연습문제 3) 알파벳을 한 줄에 5개씩 출력하시오 *한 줄에 다섯 글자씩 대문자로, count변수를 5로 나누었을 때 0 다섯번이 반복이 됨. count변수가 5의 배수인지 묻기

char count = 'A';
 for(char ch='A'; ch<='Z';){			
	count = ch++;
	if(count%5==0){
		System.out.println( );
	}
	System.out.print(count);
}
//결과값
//		ABCDE
//		FGHIJ
//		KLMNO
//		PQRST
//		UVWXY
//		Z

A = 65

이기 때문에 아스키 코드를 이용해도 된다.

▶ 우선 문자 연산자의 초기값을 A로 선언한 후 for문을 작성하였다.

초기값과 범위를 정해준 후 증가하는 문자들을 count변수에 먼저 저장한 후

fif문으로 5의 배수가 될 때마다 줄바꿈을 해주는 조건을 건 후 명령을 하였다.

그 다음 count변수(줄바꿈없이)를 출력하였다.

if문의 조건에 맞지 않는 다면 코드가 그대로 진행되어 count변수의 문자가 쌓이다가 5의 배수인 5번째 후에 줄바꿈을 하게 되는것

 

■  선생님 답안  

int upper=0;
	for(char ch='A'; ch<='Z'; ch++){
	upper++;
	//System.out.print(upper);
    System.out.print(ch);
	if(upper%5==0){
		System.out.println(' ');
	}
	
 
// 결과값 
//	ABCDE
//	FGHIJ
//	KLMNO
//	PQRST
//	UVWXY
//	Z 

▶ 나는 문자들을 출력하는 것이라서 char count 변수를 썻는데 선생님은 int upper라는 정수 변수를 사용하셨다.

 

 

연습문제 4) 1~100중에서 짝수의 합, 홀수의 합을 각각 구하시오 *2의 배수들의 합, 2로 나누었을 때 나머지 1의 값의 합

int even = 0; //짝수의 합
	int odd = 0; //홀수의 합
				
	for(int a=1; a<=100; a++){
		if(a%2==0){
			even = even+a;				
		}else if(a%2==1){
			odd = odd+a;				
		}
	}
	System.out.println(even);
	System.out.println(odd);
    
    //짝수: 2550 //홀수: 2500

if 다음 바로 짝수를 구하는 연산을 해주었기 때문에 else if(a%2==1)이라고 할 필요없이

else{ odd=odd+a;}로 생략해도됨.

▶ 홀수짝수를 이용하는 것은 앞으로도 굉장히 자주 나올 것 같다.

 

■  선생님 답안  

int even = 0;
int odd = 0;
		
 int a;
 for(a=1; a<=100; a++){
	if(a%2==0){
		even = even+a;
	} else {
		odd = odd+a;
	}			
	}
System.out.println("짝수의합: "+ even);
System.out.println("홀수의합: "+ odd);

//결과 짝수의합:2550 , 홀수의합:2500

on,off true false 양자택일 상황이면 / 2의 배수와 그 외(홀수)라고 생각하면 된다.

이런 개념을 정보처리에서 switch론이라고 한다. 

▶ 이 개념이 상당히 중요한 것을 깨달음

 

 

연습문제 5) 다음 식의 결과를 구하시오 //1-2+3-4.........+ 99-100 =?   *격자로 왼오, 같은

int total=0;
		for(int a=1,b=a+1; a<=99; a++,b++){
			total = total+(b-a);
		}
		System.out.println(total);
		//결과값 99

문제를 완전 잘못해석했음

뒤의 숫자가 더 크기 때문에 -50이 답으로 나와야함.

▶ 완전히 잘못 해석해서 답도 완전 틀려버렸다.

머릿 속으로는 50 아닌가? 라고 생각했는데 -50이었음

1-2.. <- 여기서부터 후위 숫자가 전위보다 더 큰것을 왜 몰랐을까

1-2 = -1 인 것을 이상하게 착각한 문제였다.

첫단추를 잘못꿰서 미궁에 빠진 문제 ㅠㅠ

 

 

■  선생님 답안  

둘 중 하나 / true false 양자택일인 자료형 boolean형을 이용한 코드

완전 생각도 못했는데 이런 방법을 매우 자주 사용한다고 함.

true -> false -> true 반복되면서 값이 교체됨.

 

a=1 if(flag) else{flag=true}

a=2 if(true) else{flag=false}

a=3 if(false) else{flag=true}

 

else안에서 +(더하기) 물어보기

 

 

스위치개념완전 중요★

boolean flag = false;
  int hap = 0;
		
  for(int a=1; a<=100; a++){
	if(flag){
	hap = hap-a;
	flag=false;
  }else{
	hap = hap+a;
	flag=true;
  }
}
System.out.println(hap);

결과값 -50

 

//RAM에서 변수를 선언하였다.

변수에 새로운 값이 들어오는 순간 그 전 값은 지워진다.

프로그래밍 할 때 변수끼리 교환할 일이 많다

변수끼리 값을 교환하는 것을 스왑(swap)이라고 함

 

 

▶ 아직 응용하라고 하면 못할거 같다 여러번 다시봐야하는 switch론과 변수 swap에 대한 개념..

 

연습문제 6) 두 수 사이의 합을 구하시오 // 2~5까지의 합을 구하시오.

int start = 2, end = 5;
		int sum = 0;
		for (int a=2; a<=5; a++){
			sum = sum+a;
		}
		System.out.println(sum);
        
        //결과값 14
		

▶ 단편적으로 해석한 문제였다. 그래서 값이 반대라면 틀린 식이 된다.

 

 

■  선생님 답안  

int start = 2, end = 5;
int sum = 0;
			
if(start>end){ //swap
 int tmp=start;
 start = end;
 end = tmp;				
}
			
for (int c=start; c<=end; c++){
	sum = sum+c;
}
System.out.println(sum);

//결과값은 14

▶ 임의의 변수를 만들어 교체의 징검다리가 된 것 같은 개념이다.

더욱 자주 보아야겠다.

 

 

연습문제 7) 다음 식의 결과를 구하시오

 

 

 

 


 

Break와 Continue

반복문에서 Break는 반복문을 빠져나오는 것이고

continue는 반복문을 계속 실행하는 것이다.

 

for (int a=1; a<10; a++){
	if(a==5){
		break;
	}
	System.out.print(a+" ");
	}

System.out.println();
	
for (int a=1; a<10; a++){
	if(a==5){
		continue;
	}
	System.out.print(a+" ");
}	

//첫번째 1 2 3 4
//두번째 1 2 3 4 5 6 7 8 9

 

Break : 반복문을 진행하다 break를 마주치면 반복문에서 탈출

Continue: 반복문을 진행하다 continue를 마주치면 반복문으로 다시 올라가서 진행 (유턴)

 

댓글