PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
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은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
09/05/26 21:16
수정 아이콘
디버그모드에서 한라인씩 해보시면 될것 같네요
우선 제가 보기엔 continue때문에 루프가 중단되지 못하고 카운터가 계속 증가해서 결국 제수=피제수 상황이 오게 되므로 출력문으로 들어가는 것처럼 보이네요.
break는 루프 자체를 종료시키지만 continue는 이후의 코드만을 무시한후 루프는 진행됩니다.
토호신기
09/05/26 21:18
수정 아이콘
우오오 초스피드 답변 감사드립니다.

그런데..생각해보니 이론 및 정의에 입각하여 생각해보면 맨처음에 i 에 2가들어가는데 마지막 if문이 참이되므로 바로 break문을 만나 중첩되어있는 for문을 빠져나가게 되는것 같습니다. 그래서 제생각으로는 이론적으로봤을땐 break가있다면 i 에 2만들어가서 비교되고 빠져나고 그담에도 계속 2만 계속 만나다가 빠져나간다는 계산이 되는데요.. 물론 결과는 예상과다르게나오지만..
이점이 이해가안가네요;
MoreThanAir
09/05/26 22:04
수정 아이콘
scope에 대해서 이해하는 것이 우선일듯 합니다. main 프로그램의 depth를 1이라고 할 때 n에 대한 for루프 내부는 depth 2가 되고 i에 대한 루프 내부는 depth가 3이 됩니다. if문과 break등은 이론상 depth 3에서 실행이 되고 있는데 JAVA나 C의 variable binding 정책에 따라 free variable(그 depth level에서 declare되지 않은 variable)은 static binding에 따라 그 상위 depth의 variable들을 참조하게 됩니다. break의 정의에 따라 현재 block(scope)를 빠져나가는 것이므로 depth3에서 실행되었을 때 depth2로 빠지는 것이 당연합니다. 그리고는 depth2의 n에 대한 for루프는 계속 실행되므로 depth3의 i에 대한 for루프는 i=0인 상태에서 재시작되는 것입니다.
09/05/27 00:56
수정 아이콘
토호신기님// 디버그모드로 한라인씩 해보시는게 가장 좋습니다.
조건부 break이므로 i가 2인 상황에서 계속 빠져나가지는 않습니다.
a[n]=3이고 i=2라면 break를 만나지 않습니다.
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
56368 야구 관련 질문 입니다. [10] AsuRa1900 09/05/26 1900
56367 인터넷에서 신문을 날짜로 검색할 수 있나요? [2] .JunE.2205 09/05/26 2205
56366 소개팅이나 미팅에서 써먹을수있는 간단한개그... [19] Enjoy4430 09/05/26 4430
56365 과외자리구하려는데요 [1] KyRiE2102 09/05/26 2102
56364 자주가는 유용한 심리학 사이트 있으면 추천 부탁드려요. ilovenalra2276 09/05/26 2276
56363 아주간단한 JAVA에서 break문 관련 질문입니다. [간단한 예제소스] [4] 토호신기2503 09/05/26 2503
56361 도와주세요.... [6] Go_TheMarine2167 09/05/26 2167
56360 하루에 녹차 2리터를 마시면? [11] 마야5138 09/05/26 5138
56358 엑셀에서 이런 형태의 그래프는 어떻게 그려야 할까요? [2] 깊고 슬픈 바다2248 09/05/26 2248
56357 Uranium hexafluoride 분자의 크기에 관한 질문입니다. [2] 대위리1508 09/05/26 1508
56356 하드디스크상태에 대해 질문합니다. [7] jinhosama1529 09/05/26 1529
56355 짱구와 이슬이누나의 관계에 대해 몇몇 궁금한점이 있습니다. [5] 쑤마이켈5961 09/05/26 5961
56354 땀의 성분에 관해 질문드려요 [4] 라울2127 09/05/26 2127
56353 50년전 농업협동조합 출자증권 환급 받을 수 있을까요? [2] 교회오빠2468 09/05/26 2468
56352 바지사이즈 보는 방법 질문합니다. [3] Nal[Ra]2377 09/05/26 2377
56351 현 정부의 환경 관련 정책에 대한 기사나 자료 질문입니다 [2] 제3의타이밍1517 09/05/26 1517
56350 기타(악기) 가르쳐주실 분은 어떻게 구해야 할까요? [2] ddyung1906 09/05/26 1906
56349 카드의 혜택을 정리 해서 모아둔 사이트 없을까요? [1] 라캉~2065 09/05/26 2065
56348 질게 48576번 헌팅글 올렸던 사람입니다.. [9] Enjoy1868 09/05/26 1868
56347 인터넷 창 종료 할때마다 오류가 나와요 [2] 라캉~1925 09/05/26 1925
56345 정보통신부의 010 번호 통합 정책의 배경이 궁금합니다. [4] 라온2135 09/05/26 2135
56344 알고리즘 = 코딩문 ?? [5] 삭제됨1590 09/05/26 1590
56343 모니터 dvi/d-sub 설정 질문입니다. [2] 상이2176 09/05/26 2176
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로