이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date |
2009/05/26 21:06:28 |
Name |
토호신기 |
Subject |
아주간단한 JAVA에서 break문 관련 질문입니다. [간단한 예제소스] |
1에서 100까지에 있는 소수를 찾아내는 프로그램입니다. 소수란 1과 자기 자신 이외의 정수로는 나누어 떨어지지 않는 수입니다. 단, 1은 소수가 아닙니다.
다음 제가 최적화 알고리즘을 무시하고 그냥 무식하게 코딩해놓은 자바소스입니다.
--------------------------------------------------------------------------------------------------------------------------
소스 :
public class test_1 {
public static void main(String [] ar) {
int n,i;
int m=1;//변수들 선언
int []a=new int[100]; //크기가 100인 a배열선언
for(n=0;n<100;n++){
a[n]=m;
m++;
} //a배열에 1부터 100까지의 데이터를 삽입
System.out.println("1~100까지 소수구하기");
for(n=0;n<100;n++){ //a배열의 0인덱스부터 99까지 즉 a배열 모두 확인하기위한 반복문
for(i=2;i<=a[n];i++){ //제수인 i는 2부터 피제수값 크기까지 모두 나누어 보기 위한 반복문
if(a[n]%i==0){ //피제수가 나누어 떨어졌을때
if(!(i==a[n])) //제수와 피제수가 같지않으면 그냥 빠져나가기
break;
else
System.out.print(i+" "); //제수와 피제수가 같으면 소수의 조건이 합당하므로 제수를 출력
}
}
}//a배열 데이터들 중 소수를 찾아서 출력
}
}
--------------------------------------------------------------------------------------------------------------------------
출력:
1~100까지 소수구하기
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
--------------------------------------------------------------------------------------------------------------------------
물론 이보다 더좋은 알고리즘도있고 저소스를 좀더 간략화시킬수도 있을것입니다.
하지만 제가 소스를 무작정 짜다가 문득 궁금한부분이 생겼습니다.
저는 처음에 저 소스를 짜다가 마지막 if문에있는 break문을 continue로 해서 2,3,4...98,99,100 이라는 엉뚱한 결과가 나왔습니다.(즉 전부 출력된것이지요.)
분명히 제가 책을 찾아보고 여러사람들에게 물어 보아도 break문의 정의는 가장가까운 반복문을 빠져나가는 것이고, continue문의 정의는 continue 이하의 문장은 무시되고 다음반복을 시행한다 라고 알고있습니다.
그래서 저는 저자리에 break대신 continue를 써서 if(!(i==a[n])) 가 참일때 continue를 만나 그밑에껀 모조리 무시되고(즉 else문은 무시되어 아무것도 출력안함) 그다음 반복을 할꺼라고 예상했었죠.
하지만!! 예상과달리 반복문을 빠져나오게 하는 break문을 써야만 정상적인 값이 출력이됩니다.
그래서 자바에서만 이런가? 싶어서 C에서도 돌려봤죠 역시나 마찬가지였습니다. 저곳엔 반드시 break가 있어야하는겁니다. 당최..왜;;
제가 헷갈려하는 이유를 다음 소스를 예를 들며 다시 설명드리지요
--------------------------------------------------------------------------------------------------------------------------
소스 :
public class test_kkt1 {
public static void main(String [] ar) {
for(int i = 0; i < 5 ; ++i){
if(i==2){
break;
}
System.out.println("*");
}
}
}
--------------------------------------------------------------------------------------------------------------------------
출력 :
*
*
--------------------------------------------------------------------------------------------------------------------------
주석을 달 필요없는 * 출력하는 기초 반복문입니다.
여기에서는 if문 안에있는 break문을 만나게되면 for문을 아예빠져나가고 종료가됩니다. 즉 i가 0일때 *출력, 1일때 *출력, 2일때 break만나서 종료. 그러므로 출력은 * * 별표 두개가나옵니다.
그리고, break문 대신 continue문을 쓰게되면 2일때는 무시되고 다음 반복문을 수행하기때문에 * * * * 즉 별이 4개가 출력이됩니다.
위소스들은 직접 드래그해서 실행해보셔도 좋습니다. 제가 말하는 출력과 같이 나올테니까요
여튼 제가 아래에 적은 소스에서는 break문이 if문의 중괄호 {}말고 for문의 중괄호를 빠져나와버리는데~~~!
위에 적은 소스는 왜 for문을 안빠져나오는 걸까요?
왜 위에소스에서 continue문을 썼을때 아래문장들이 무시되고 다음반복을 실행하지 않을까요..그게맞는건데..
이 간단한 break문과 continue문에 대해서 답변좀 부탁드립니다. '-'
|
통합규정 1.3 이용안내 인용
"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
|