[Java 개념 공부] case 문에서의 sc.close();와 System.exit(0);의 역할
오늘은 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();를 하는 습관을 가집시다.
두 명령문의 역할도 제대로 익혔으니 이제 이 문제로 오류 낼 일은 없길 바라며
이 글이 도움이 됐으면 좋겠네요
그럼 안녕