인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

생각하는자님의 프로필 이미지
생각하는자

작성한 질문수

김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음

문제와 풀이3

return;문과 boolean=false

해결된 질문

작성

·

285

·

수정됨

0

 학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.


1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
배열 - 문제와 풀이3을 switch-case문으로 하던 와중에 종료 버튼이 break문으로 종료가 안되어서 검색해서 와일문을 false로 바꾸면 종료된다는 말을 듣고

boolean proudctFile = true;

while(proudctFile){
   /* 나머지 내용 생략 */
   case 3 :
      System.out.println("프로그램을 종료합니다.");
      proudctFile = false;
}

이런식으로 만들었습니다.
나중에 다른 강의를 보니

while(true){
   /* 나머지 내용 생략 */
   case 3:
       System.out.println("시스템을 종료합니다.");
       return;
}

return문을 써서 바로 종료하던데 어떤게 더 좋은 프로그램인지 궁금합니다.

답변 2

2

안녕하세요. 생각하는자님, 공식 서포터즈 코즈위버입니다.

자바에서 break 는 1개의 스코프를 벗어나게 됩니다. 가령 아래처럼 (2)번의 루프 안에서 break를 사용할 경우 (3)번으로 이동하게 되며 다시 (1)번 루프를 반복합니다.

while(true) { ... (1)

    while(true) { ... (2)
        break;
    }
    ... (3)
}

 

예외적으로 if문 내부에서의 break는 if를 감싸고 있는 루프문을 벗어납니다. 아래처럼 (2)의 위치에서 선언한 break를 만나면 (3)으로 이동하게 됩니다.

while(true) { ... (1)
    if (true) {
        break; ... (2)
    }
}
... (3)

 

스위치 문 내부의 break는 스위치 스코프만을 벗어나게 되어 질문하신것처럼 프로그램이 종료되지 않는 문제가 생길 수 있습니다.

 

swtich() 문을 종료한 이후 추가로 실행해야 할 코드가 있다면 플래그변수를 이용, 없다면 return 문을 사용하여 바로 종료하는것이 효율적입니다.

 

감사합니다.

답변을 보며 생각하다가 코즈위버 님의 답변 중에 “예외적으로 if문 내부에서의 break는 if를 감싸고 있는 루프문을 벗어납니다.” 라는 말이 있는데 왜 if문은 감싸고 있는 루프문을 벗어 나는건가여? If문의 설계 구조상 그런건지? 아니면 break문이 원래 이렇게 만들어 진건지 궁금해 지네요. 답변 부탁 드립니다.

1

조금 헷갈릴 수도 있을 것 같은데.. break가 반복문과 switch문에서의 쓰임이 비슷하다보니 생긴 문제인 것 같습니다. 분기문(조건문)에서 switch문은 각 조건에 해당하는 것만 실행하고 빠져나오게 되어있지만 if, if-else, .. else-if에는 해당하지 않습니다.

그래서 두 번째 코드로 든 예시에서 if절 안에 있는 break를 만나면 if가 아닌 while문 자체를 빠져나가게 되어 루프가 끝납니다. (3)번 밖으로 나가죠. 아마 그 부분을 말씀하시고 싶으신 것 같은데 전달 중에 꼬인 것 같아 보입니다.

요약하자면 "break는 반복문과 switch문 내부에 쓰였을 경우 1depths를 빠져나가게 하는 역할을 한다." 로 할 수 있습니다.

ㅋㅋ 알까기님 이렇게 오래된 질문에, 답변을 해주셔서 감사합니다.

생각하는자님의 프로필 이미지
생각하는자

작성한 질문수

질문하기