230523(화)-TIL

조우진·2023년 5월 23일
0

TIL

목록 보기
5/28

오늘 마주친 문제

문제 : switch/case문 내 조건에 같은 변수명 생성을 시도

  • 아래와 같이 switch/case문을 통해 dataStructure 변수의 값에 따라 List 자료구조를 생성할지, Set자료구조를 생성할 지 선택하려고 하였다.
       switch (dataStructure) {
            case "List":
                ArrayList<String> recipe = new ArrayList<String>();
               //내용
               break;         
           case "Set":
                LinkedHashSet<String> recipe = new LinkedHashSet<>();
                //break;

하지만 위와 같이 동일할 recipe변수를 사용하려 할 경우, recipe변수는 이미 존재한다는 에러메시지가 출력된다.

그래서 switch/case 문으로 나누더라도, 독립된 블록으로 간주되지 않는다고 생각하여 "Set"case문의 recipe 변수명을 recipeSet으로 변경하여 해결하려고 하였다.

그러나, "Set"case문 내 do-While문에서 선언했었던 recipe는 'recipe' 변수가 초기화되지 않았을 수 있다는 에러메시지를 다시 보았다.

의문점 : 결국, "Set" case문에서는"List" case문의 recipe를 인식했는데, 내부에 있는 do-while문에서는 "List" case문의 recipe 변수를 인식하지 못한다는 것 아닌가?

Try

단순히 각 case문 내 변수의 이름을 다르게 생성하면 문제를 해결할 수는 있었지만, 의문을 해결하고 싶어 먼저 팀원에게 이러한 의문사항을 공유했고, 한 팀원에게서 "중괄호{}로 묶어두면 초기화한 값이 중괄호 안에서만 유효하다"는 내용을 확인했다.

해결

각각의 case에 중괄호{}를 감싸면 에러가 발생하지 않았다.

switch (dataStructure) {
    case "List": {
        ArrayList<String> recipe = new ArrayList<String>();
        //내용
        break;
    }
    case "Set": {
        LinkedHashSet<String> recipe = new LinkedHashSet<>();
        //내용
        break;
    }
}

새롭게 알게된 점

  • Java의 switch/case 문에서는 각 case에 따라 다른 로직을 실행하게 되더라도, 각 case는 독립된 블록으로 간주되지 않는다. 따라서 동일한 이름의 변수를 여러 case문에서 사용하는 것은 잘못된 구문이다.
  • 각 case코드를 중괄호'{}'로 감싸서 변수의 스코프를 제한하면, 변수가 해당 case 블록 내부에서만 존재하게 된다.
profile
공부노트

0개의 댓글