자바 스위치 케이스 : 중괄호가 있거나 없는가?


85

중괄호가있는 다음 두 스 니펫을 고려하십시오.

switch (var) {
  case FOO: {
    x = x + 1;
    break;
  }

  case BAR: {
    y = y + 1;
    break;
  }
}

중괄호 없음 :

switch (var) {
  case FOO:
    x = x + 1;
    break;

  case BAR:
    y = y + 1;
    break;
}

중괄호가있는 스 니펫에서 각 케이스를 중괄호로 묶어 새 범위가 생성된다는 것을 알고 있습니다. 그러나 각 케이스에 새 범위가 필요하지 않은 경우 (즉, 변수 이름이 재사용되지 않음) 케이스와 함께 중괄호를 사용하면 성능이 저하됩니까?

답변:


99

케이스에 중괄호를 사용하면 성능이 저하됩니까?

없음.

중괄호는 컴파일러가 변수, 조건, 함수 선언 등의 범위를 파악하는 데 도움이됩니다. 코드가 실행 파일로 컴파일되면 런타임 성능에 영향을주지 않습니다.


21

실행 관점에서 성능 저하가 없습니다.

구문 분석 할 것이 더 많기 때문에 컴파일 관점에서 약간의 성능 저하가 있지만 실제로 우려되는 사람이 있다면 코드를 한 줄에 모두 작성해야합니다. :-)

그리고 이제 우리 게시물의 의견 부분에 대해 ... 저는 항상 {및}를 입력했습니다. 유지 관리에 대한 불이익이 있기 때문에 나중에 입력해야 할 가능성이 높고이를 두는 것이 고통 스러울 수 있습니다. 나중에 ...하지만 그것은 103 % 개인 선호도입니다.


답을 직접 볼 수 없어서 조금 궁금합니다 ... @TofuBeer, 언제 중괄호를 추가해야하나요? 또한 유지 보수성 문제에 전적으로 동의하며 유지 보수성 문제 ATM이 보이지 않습니다. 편집 : 신경 쓰지 마세요. 아래의 나머지 답변을 읽었습니다.
nyaray

어떤 경우에는 C ++로 작업하므로 두 언어로 작업하는 경우 둘 중 하나를 사용하는 것이 나쁜 습관이 아닙니다.
TofuBeer 2013-08-16

13

우리가 알고 있듯이 스위치 케이스에 대한 중괄호가 필요하지 않습니다. 중괄호 케이스를 사용하면 케이스 범위에 대해 혼동을 일으킬 수 있습니다.

여는 중괄호는 일반적으로 함수의 시작, 루프의 시작, 클래스 선언의 시작 또는 배열 초기화의 시작 등과 같은 의미있는 것과 연관됩니다 ... 우리는 케이스가 브레이크를 만났을 때 스위치 블록을 벗어난다는 것을 알고 있습니다. 성명서. 따라서 중괄호를 사용하는 것은 무지한 독자에게 케이스에 대한 다른 범위의 아이디어를 암시하는 것처럼 보입니다. 따라서 프로그래밍 가독성을 높이기 위해 중괄호를 사용하지 않는 것이 좋습니다.

즉, 내가 뭔가를 가질 때,

switch(i)
{
  case 1 :
  {
     //do something
  }
  System.out.println("Hello from 1");

  case 2: 
  ....
}

"Hello from 1"이 인쇄됩니다. 그러나 중괄호를 사용하면 대소 문자가 '}'로 끝나는 무지한 독자를 시사 할 수 있으며, 루프, 메서드 등의 경우 중괄호가 일반적으로 무엇을 의미하는지 이미 알고 있습니다.

'C'에 레이블로 이동하는 문이있는 것처럼 컨트롤은 case로 이동하고 실행을 계속합니다. 따라서 스위치 케이스를 작성할 때 중괄호를 사용하는 것은 나쁜 습관입니다.

기술적으로 말하면 유효한 구문과 함께 사용할 때 추가 중괄호 쌍으로 코드 블록을 둘러 쌀 수 있습니다. 스위치에서 중괄호를 사용하는 것은 위에서 말한 것처럼 다른 느낌을주는 것처럼 보이므로 적어도 나에게는 너무 나빠 보입니다.

내 제안 : 스위치 케이스에 주변 중괄호를 사용하지 마십시오.


5
이것에 동의하지 않습니다. 중괄호를 사용하고 중괄호 외부에 코드를 작성하는 것은 매우 나쁜 형식입니다. 그렇다고해서 중괄호 자체를 사용하는 것이 좋지 않습니다.
최대 Roncace

12

중괄호 포함.

switch 문에 잘못 될 수있는 것들이 너무 많아서 가능한 한 피하려고합니다.

  1. 돌파구를 잊고 사건이 실패했습니다.
  2. 기본 케이스를 잊어 버려 분류되지 않은 조건을 포착하지 못함
  3. 우연히 case 문 사이에 변수를 재사용하거나 더 나쁜 것은 case 문간에 변수를 공유하는 변수에 영향을줍니다.

중괄호를 사용하는 것은 case 문 사이에 의도적이거나 우발적 인 변수 공유를 방지하는 한 가지 방법입니다.


8
포인트 1과 2를 포함하는 것은이 질문에 대해 오해의 소지가있었습니다. 닫는 줄은 중괄호가 3 만 해결한다고 명시 적으로 말해야합니다. 중괄호가 중단의 필요성을 배제한다는 것을 의미한다고 생각한 다음 시도했습니다.
ataulm 2013 년

요점 3은 말도 안됩니다. switch 문의 부모 범위에서 선언 된 경우가 아니면 변수를 재사용 할 수 없습니다. 즉, 케이스 내에서 변수를 선언하면 다른 case 문에서 사용할 수 없습니다. (부모 범위에서) switch 문 위에 변수를 선언하면 중괄호를 사용하는지 여부는 중요하지 않으며 case 문은 변수에 액세스 할 수 있습니다.
dsingleton

방금 케이스 1에서 선언 된 변수가 케이스 2의 범위에있을 수 있다는 것을 (재) 발견했습니다. 예 : ...case 1: int a = 10; break; case 2: int a = 11; break; ...컴파일되지 않습니다. (Oracle JDK 8로 테스트 됨)
anuragw

5

이 질문은 아마도 "논쟁 적"(BRACE WAR!)으로 마감 될 것입니다. 나는 실제로 케이스 이후의 중괄호를 좋아합니다. 나에게 그것은 추악한 스위치 구문이 나머지 언어 구조와 더 비슷하게 보입니다. (이 "케이스"에서 중괄호를 사용하는 것에 대한 패널티는 없습니다)


나는 그것이 객관적인 질문의 종류 것 같아요 ... 나는 논쟁 것은 철회
앤디 화이트

나는 중괄호없이 그것을 선호한다… 나는 중괄호가 불필요한 소음을 많이 추가하는 것을 발견했다.
cdmckay

네, 좀 더 이랬 으면 좋겠어요 : case (FOO) {x = x + 1} case (BAR) {y = y + 1}
Andy White

현명한 공백 == 좋습니다. 불필요한 중괄호 == 빨다.
Shog9

3
공백 (그냥 믹스에 탭 대 공간 코멘트를 던져 줄 알았는데) 빨아 == 탭과 공간의 혼합 ==
앤디 화이트

5

변수 이름이 재사용되지 않기 때문에 중괄호를 생략 할 수 있습니다. 변수 이름을 재사용함으로써 동일한 유형의 새 변수를 선언한다고 가정합니다.

중괄호는 실제로 case실수 로 다른 s 에서 동일한 변수를 재사용하지 않도록하는 데 가장 유용합니다 . 오늘은 변수를 선언하지 않지만 누군가 내일 변수를 추가 할 것이며 중괄호없이 코드는 오류가 발생하기 쉽습니다.


3

스위치 케이스에는 중괄호를 사용하지 않습니다.

  • switch 문은 이미 중괄호없이 바로크처럼 보입니다.

  • 스위치 케이스는 매우 짧아야합니다. 변수를 선언해야 할 때 잘못하고 있다는 신호입니다.

이제 500 개가 넘는 라인의 케이스를 전환하는 레거시 C 코드를 유지합니다.


1

나는 전에 그것에 대해 생각해 본 적이 없습니다. case 절에 중괄호가 필요하지 않았으므로 왜 필요한지 알 수 없습니다. 개인적으로 나는 "유지 관리가 더 쉬울 것"이라는 생각을하지 않습니다. 그것은 쓰레기 일뿐입니다. 코드가 의미 있고 문서화되어 있다면 유지 관리가 더 쉬울 것입니다.

중괄호 없음 ... 구문이 적을수록 좋습니다.


{및} 또한 사물을 돋보이게하므로 읽기가 더 쉽습니다 (IMO).
TofuBeer

예. 한 번 수정해야했던 방법에 대한 이야기를 공유하려고했지만 (코드 한 줄을 추가하는 데 약 4 시간이 걸렸습니다) 코드는 제정신이 아니 었습니다 (인쇄시 약 10 페이지, 너비 4 페이지). 전형적인 경우. 그러나 {}를 사용했다면 추가하는 데 1 분 정도 걸렸을 것입니다.
TofuBeer

여기서 중요한 점은 원래 프로그래머가 코드를 더 읽기 쉽게 {} 블록을 넣는 노력을 기울 였다면 실제로 10 페이지 스위치 문을 작성하고 코드를 좀 덜 미친
가레스 데이비스

swtich는 꿈이었을 것입니다. if / elses ... COBOL 프로그래머에 의해 C ++ 코드로 작성되었습니다 ... 그 후 얼마 지나지 않아 그만 두었습니다.
TofuBeer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.