Java/공부

[Java 개념 공부] case 문에서의 sc.close();와 System.exit(0);의 역할

Yim_Ha_Eun 2023. 9. 22. 16:50

오늘은 HashMap을 이용해 ToDoList를 만드는 문제를 풀어봤습니다. 

HashMap을 이용한 문제는 나중에 올려볼게요.

 

HashMap과 case문을 활용해서 ToDo List를 출력을 하는 중에

sc.close();와 System.exit(0);역할이 갑자기 궁금해져서 질문하고, 배운 개념을 정리해보려고합니다.

 

 

개념을 완전히 알기 전까지 들었던 생각은

'close();와 exit();이 다 종료하겠다는 건데  왜 같은 개념을 두번 쓰지?' 였습니다.

오라클을 읽어보니 두개 다 완전 다른 역할이더라고요
(당연한건데 저처럼 개념을 몰랐던 분들은 궁금해하실수도 있는 부분)

 

 

케이스3은 번호를 받으면 프로그램을 아예 종료시킵니다.

이때, 제가 알고있던 개념은 sc.close(); 뿐이어서 System.exit(0);을 굳이 왜쓰는지 궁금했어요.

 

sc.close();

: Closes this scanner.

sc는 제가 Scanner.sc = new Scanner(System.in);의 sc 이고 그걸 닫아 종료한다는 뜻입니다.

즉, 입력값을 받는 행위를 종료한다는 뜻

 

 

 

System.exit(0);

:This method calls the exit method in class Runtime

 

런타임을 종료해 프로그램이 끝나도록 설정해줍니다.

오라클 참조

돌아가고있는 JVM을 종료합니다.

클래스 런타임에서 exit메소드를 불러옵니다. 

 

 

 

 

 

System.exit(0)을 써주지않으면

 

코드 순서를 보자면,

 

[3 입력시 돌아가는 순서]

 

 

 

 

System.exit(0);을 넣지않았으니

 case번호를 입력하라는 반복문으로 다시 올라갑니다.

(break; 문은 case를 종료하는 뜻이라 case 3를 종료하고 while 다시 수행함.)

 

 sc.close();로 스캐너를 닫았기 때문에 더이상 번호를 받지 못한다며 오류가 나요.

(궁금증 해결!)

 

while문으로 다시 올라가기 전에

런타임을 아예 종료시켜버리는  System.exit(0); 을 넣어

프로그램을 완전 종료해줍니다.

 

코드를 하나하나 따라가보기 전엔

sc.close();개념도 제대로 알지 못했었고

System.exit(0);이란 것도 그 역할을 오늘 처음 알았어요.

 

sc.close();는 그냥 당연히 '닫아' 라고만 생각했었는데

Scanner만 닫는거였다는 걸 이제서야 인지했습니다.. ㅎㅎ

생각않고 코딩하면 이런 문제가 생기네요.

 

 

 

+

근데

이렇게 sc.close();를 지우고 System.exit(0);만 작성해도

 

 

프로그램 종료가 됩니다. 

 

 

사실 강제종료 느낌이라 sc.close();는 안써도 됩니다.

물어보니 강사님도 이야기하셨는데 제가 못들었어요 하하..

그래도 혹시 모르니까 sc.close();를 하는 습관을 가집시다.

 

 

 

 

 

 두 명령문의 역할도 제대로 익혔으니 이제 이 문제로 오류 낼 일은 없길 바라며

이 글이 도움이 됐으면 좋겠네요

그럼 안녕