Java에서 중괄호를 생략해도 괜찮습니까? [닫은]


83

나는 이것을 찾았지만 답을 찾을 수 없었고, 어떤 이유로 든 교수님에게 물어보기에는 너무 부끄러 웠습니다.

어쨌든 내 질문은 대괄호를 갖는 것의 중요성이 무엇입니까? 생략해도 괜찮습니까? 예:

for (int i = 0; i < size; i++)  {
   a += b;
}

vs

for (int i = 0; i < size; i++)
   a += b;

둘 다 작동한다는 것을 알고 있지만 대괄호 (가시성 때문에 많이하는 경향이 있음)를 생략하면 아무것도 변경되지 않습니까? 내가 말했듯이 작동한다는 것을 알고 수십 번 테스트했지만 이제 일부 유니 할당이 커지고 있으며 어떤 이유로 장기적으로 이것이 내 문제가 될 것이라는 비합리적인 두려움이 있습니다. 그것을 두려워 할 이유가 있습니까?


나는 항상 가독성을 위해 코드 포맷터를 사용합니다. 이것은 혼란의 많은 잠재적 인 원인을 해결하기 때문입니다. 이 중괄호의 중복을 사용하여 만들 수 있습니다
피터 Lawrey에게

답변:


146

코드의 유지 관리 가능성을 제외하고 는 아무것도 변경하지 않습니다 . 다음과 같은 코드를 보았습니다.

for (int i = 0; i < size; i++)
   a += b;
   System.out.println("foo");

이는 다음을 의미합니다.

for (int i = 0; i < size; i++)
   a += b;
System.out.println("foo");

...하지만 어떤 것이 었어 했습니까?

for (int i = 0; i < size; i++) {
   a += b;
   System.out.println("foo");
}

개인적으로 코드를 읽거나 수정할 때 혼동 가능성을 줄이기 위해 항상 대괄호를 포함합니다.

내가 일한 모든 회사의 코딩 규칙은 이것이 필요했습니다. 다른 회사가 다른 규칙을 가지고 있지 않다는 것은 아닙니다 ...

그리고 그것이 결코 차이를 만들지 않을 것이라고 생각하는 경우를 대비하여 : 위의 코드와 거의 동일한 버그를 한 번 수정해야했습니다. 발견하기가 매우 어려웠습니다.


12
@vedran : 그래서 당신은 문제를 알고 있지만 결코 당신을 물지 않을 것이라고 가정하고 있습니까? 그리고 여러분의 코드를 읽는 모든 사람들이 무엇을 기대해야하는지 알게 될까요? 나는 단지 말하고있다 – 내가 함께 일한 코딩 규칙에 왜 그들이 필요한지 이유가있다 :)
Jon Skeet

12
난 그냥 sarge가 말하는 사적인 것 같았다. 예, 저에게는 더 편리하지만 제 그룹의 다른 사람들은 성 가시고 문제가 있습니다. 이제부터는 어디에서나 대괄호를 사용하도록하겠습니다.
vedran 2011

13
@vedran 좋은 은유, Jon Skeet은 sarge가 아니라는 것을 제외하고, 그는 최고 사령관입니다 :-)
stivlo

5
@stivlo 오 나는 그의 은혜가 사소한 불복종을 용서할 것이라고 확신한다;) 개인적으로 나는 내가 본 모든 코딩 가이드의 일부이기 때문에 진술 뒤에 괄호를 넣었지만 오늘은 꽤 약한 논쟁이라고 생각한다. 모든 곳에서 자동 코드 서식을 지정하면 코드를 첫 번째 형식으로 볼 수 없으며 들여 쓰기가 올바른 경우 대괄호가 추가 정보를 제공하지 않습니다.
Voo 2011

4
항상 중괄호를 사용할 더 많은 인수 : imperialviolet.org/2014/02/22/applebug.html
MrTJ

32

중괄호를 사용하면 코드를보다 쉽게 ​​유지 관리하고 이해할 수 있습니다. 따라서 기본적으로 이를 고려해야합니다 .

코드를 더 간결하게 만들기 위해 가드 절 에 중괄호를 사용 하지 않는 경우가 있습니다. 이에 대한 내 요구 사항은 또는 같은 점프if이 뒤에 오는 문이라는 것 입니다. 또한 관용구에주의를 끌기 위해 같은 줄에 두었습니다.returnthrow

if (!isActive()) return;

루프 내부의 코드에도 적용됩니다.

for (...) {
  if (shouldSkip()) continue;
  ...
}

그리고 메서드 본문의 맨 위에있을 필요는없는 메서드에서 다른 점프 조건으로.

일부 언어 (예 : Perl 또는 Ruby)에는 중괄호가 적용되지 않는 일종의 조건문이 있습니다.

return if (!isActive());
// or, more interestingly
return unless (isActive());

방금 설명한 것과 동일 하다고 생각 하지만 언어에 의해 명시 적으로 지원됩니다.


7
루프 내부의 +1 가드 절은 일반적으로 중괄호없이 더 명확합니다.
Viccari

2
가드 조항에 동의했습니다. 내 생각에 코드를 더 읽기 쉽게 만들고 실제로 유지 관리 가능성을 높입니다. 허용되는 답변이 만드는 요점은 매우 유효하므로 중괄호 생략을 보호 절로 제한합니다.
ChrisK

11

다른 점이 없다. 두 번째 버전의 주요 문제점은 다음과 같이 작성하게 될 수 있다는 것입니다.

for (...) 
  do_something();
  do_something_else();

해당 메서드를 업데이트 할 때 do_something_else()루프 내부에서 호출 된다고 생각합니다 . (그리고 머리를 긁는 디버그 세션으로 이어집니다.)

중괄호 버전에없는 두 번째 문제가 있으며 발견하기가 더 어려울 수 있습니다.

for (int i=0; i<3; i++);
  System.out.println("Why on earth does this print just once?");

따라서 합당한 이유가없는 한 중괄호를 유지하십시오. 몇 번만 더 입력하면됩니다.


3
첫 번째 요점은 좋지만 두 번째 요점은 잘못되었습니다. 버팀대 버전은 여전히 ​​그 문제를 가질 수 있습니다. for (int i = 0; i <3; i ++); {System.out.println ( "왜 한 번만 인쇄됩니까?"); }. 나는 항상 중괄호를 사용하기 때문에 알고 있지만 때로는 세미콜론을 잘못 추가합니다.
emory 2011

3
중괄호 버전은 그것을 가질 수 있지만 중괄호가 같은 줄에 있으면 더 잘 보입니다. 다음 줄에 중괄호가 있으면 실제로는 매우 불쾌합니다.
Mat

저에게 두 번째 버전은 첫 번째 버전만큼 중요합니다. 두 번째 버전을 살펴보면 실제로 실행하여 세상에서 무슨 일이 벌어지고 있는지 확인하기 전까지는 무엇이 잘못되었는지 파악하는 것이 거의 불가능하기 때문입니다. 개발자는 구불 구불 한 괄호가 도입되면 쉽게 발견 할 수있는 이와 같은 코드를 디버깅하는 데 많은 시간을 할애합니다. 저에게 구불 구불 한 괄호를 생략하는 것은 스타일 문제 일뿐만 아니라 버그가있을 가능성이있는 코드의 좋은 지표입니다.
theyCallMeJun

5

자동 서식을 사용하는 경우에도 중괄호를 푸는 것이 좋다고 생각합니다. 왜냐하면 들여 쓰기가 항상 정확하기 때문에 그런 식으로 오류를 쉽게 발견 할 수 있기 때문입니다.

전체 언어가 그 아이디어를 기반으로하고 꽤 인기가 있기 때문에 중괄호를 빼는 것은 나쁘고, 이상하거나 읽을 수 없다고 말하는 것은 잘못된 것입니다.

하지만 포맷터를 사용하지 않으면 위험 할 수 있습니다.


들여 쓰기는 파이썬에서 중요합니다. Java, C, C ++ 또는 기타 C 스타일 언어에서는 그렇지 않습니다.
Christopher Schneider는

1
@ChristopherSchneider 그게 퐁입니다.
Máté Magyar 2016

5

대부분의 경우 지금까지 언급 한 답변이 정확합니다. 그러나 사물의 보안 관점에서 볼 때 몇 가지 단점이 있습니다. 결제 팀에서 일하면서 보안은 그러한 결정을 내리는 훨씬 더 강력한 요소입니다. 다음 코드가 있다고 가정 해 보겠습니다.

if( "Prod".equals(stage) )
  callBankFunction ( creditCardInput )
else
  callMockBankFunction ( creditCardInput )

이제 내부 문제로 인해이 코드가 작동하지 않는다고 가정 해 보겠습니다. 입력을 확인하고 싶습니다. 따라서 다음과 같이 변경합니다.

if( "Prod".equals(stage) )
  callBankFunction ( creditCardInput )
else
  callMockBankFunction ( creditCardInput )
  Logger.log( creditCardInput )

문제를 수정하고이 코드를 배포한다고 가정 해 보겠습니다 (그리고 검토 자일 수 있으며 'Prod'조건에 포함되지 않기 때문에 문제가되지 않는다고 생각합니다). 마술처럼 생산 로그는 이제 로그를 볼 수있는 모든 직원이 볼 수있는 고객 신용 카드 정보를 인쇄합니다. (악의적 인 의도로) 그들 중 누구라도이 데이터를 빼앗는 것을 하나님은 금하셨습니다.

따라서 중괄호를 제공하지 않고 약간의 부주의 한 코딩은 종종 보안 정보의 침해로 이어질 수 있습니다. 또한 CERT-Software Engineering Institure, CMU에 의해 JAVA의 취약점으로 분류됩니다 .


나는 그것이 처음에 꽤 끔찍한 디자인이라고 주장하고 싶지만, 요점은 유효합니다.
Christopher Schneider

4

단일 명령문이있는 경우 대괄호를 생략 할 수 있습니다. 코드 블록을 선언하는 데 하나 이상의 명령문에 대괄호가 필요합니다.

대괄호를 사용하면 코드 블록을 선언하는 것입니다.

{

//Block of code
}

가독성을 높이기 위해 중첩 된 명령문의 상황에있을 때 하나의 명령문에만 대괄호를 사용해야합니다. 예를 들면 다음과 같습니다.

for( ; ; )
  if(a == b) 
    doSomething()

필요하지 않은 경우에도 대괄호로 작성하면 더 읽기 쉽습니다.

for( ; ; ) {
  if(a == b) {
    doSomething()
   }
}

4

대괄호를 사용하면 코드를 더 쉽게 읽을 수 있습니다. 동일한 블록에 일부 연산자를 추가해야하는 경우 가능한 오류를 피할 수 있습니다.


3

대괄호를 사용하면 나중에 수정되지 않도록 코드를 증명할 수 있습니다. 나는 대괄호가 생략되고 누군가 나중에 코드를 추가하고 그 당시 대괄호를 넣지 않은 경우를 보았습니다. 그 결과 그들이 추가 한 코드가 그들이 생각했던 섹션에 들어 가지 않았습니다. 그래서 대답은 코드의 향후 변경에 비추어 볼 때 좋은 습관이라고 생각합니다. 나는 소프트웨어 그룹이이를 표준으로 채택하는 것을 보았습니다. 즉, 이러한 이유로 한 줄 블록에서도 항상 대괄호가 필요합니다.


동의합니다. 괄호는 당신을위한 것이 아닙니다. 뒤에 오는 사람을위한 것입니다. 여러 번, 괄호를 사용하지 않고 들여 쓰기가 좋지 않은 익숙하지 않은 코드가 있습니다. 이 단계에서 나는 아마도 버그를 고치고있을 것이므로 어떤 일이 일어날 지 아는 것이 좋습니다. 중괄호를 생략하면 덜 명확 해 지므로 코드를 단계별로 진행해야하므로 시간이 낭비됩니다.
Christopher Schneider는

2

나로부터 "항상 중괄호"그룹에 대한 추가 지원. 경우 당신은 하나의 문 루프 / 지점에 대한 중괄호를 생략, 제어 문 같은 줄에 문을 넣어

if (condition) doSomething();
for(int i = 0; i < arr.length; ++i) arr[i] += b;

이렇게하면 몸이 확장 될 때 중괄호를 삽입하는 것을 잊기 어렵습니다. 그래도 어쨌든 곱슬 머리를 사용하십시오.


2

중복 중괄호를 사용하여 코드를 더 유지 관리 할 수 ​​있다고 주장하면 다음과 같은 질문이 제기됩니다. 코드를 작성하고, 궁금해하고, 추가로 유지 관리하는 사람이 이전에 설명한 것과 같은 문제 (들여 쓰기 관련 또는 가독성 관련)가 있다면 전혀 프로그래밍해서는 안됩니다. .


1

결과는 똑같습니다.

두 가지만 고려해야합니다.

-코드 유지 관리
-느슨하게 결합 된 코드. (루프의 범위를 지정하지 않았기 때문에 다른 것을 실행할 수 있습니다.)

참고 : 내 관찰에서 루프에서 루프 인 경우. 중괄호가없는 내부 루프도 안전합니다. 결과는 변하지 않습니다.


1

루프 내에 문이 하나만 있으면 동일합니다.

예를 들어 다음 코드를 참조하십시오.

for(int i=0;i<4;i++)
            System.out.println("shiva");

위 코드에는 단 하나의 명령문 만 있습니다. 그래서 문제 없어

for(int i=0;i<4;i++)
            System.out.println("shiva");
            System.out.println("End");

여기에 두 개의 명령문이 있지만 첫 번째 명령문 만 루프 내부에 들어오지 만 두 번째 명령문은 들어오지 않습니다.

단일 루프 아래에 여러 명령문이있는 경우 중괄호를 사용해야합니다.


1

중괄호를 제거하면 지침의 첫 번째 줄만 읽습니다. 추가 행은 읽지 않습니다. 실행할 명령어가 두 줄 이상인 경우 pls는 중괄호를 사용합니다. 그렇지 않으면 예외가 발생합니다.


1

요즘에는 코드를 다시 들여 쓰기하여 어떤 코드 블록이 어떤 if또는 for/ 에 있는지 알아내는 것이 매우 쉽습니다 while. 다시 들여 쓰기가 어렵다고 주장한다면 잘못된 들여 쓰기에 괄호를 사용하면 똑같이 혼동을 줄 수 있습니다.

for(int i = 0; i < 100; i++) { if(i < 10) {
    doSomething();
} else { for(int j = 0; j < 5; j++) {
        doSomethingElse();
    }
}}

이 일을 어디서나하면 곧 뇌가 무너질 것입니다. 대괄호를 사용하더라도 코드 블록의 시작과 끝을 시각적으로 찾기 위해 들여 쓰기에 의존합니다.

들여 쓰기가 중요한 경우 이미 올바른 들여 쓰기로 코드를 작성해야하므로 다른 사람이 올바르게 읽기 위해 코드를 다시 들여 쓸 필요가 없습니다.

이전 예제가 너무 가짜 / 고의적이며 부주의 한 들여 쓰기 문제 (특히 코드 복사 / 붙여 넣기)를 포착하기 위해 괄호가 있다고 주장하려면 다음을 고려하십시오.

for(int i = 0; i < 100; i++) {
    if(i < 10) {
    doSomething();
}
else {
    for(int j = 0; j < 5; j++) {
        doSomethingElse();
    }
}

예, 이전 예보다 덜 심각해 보이지만 이러한 들여 쓰기로 인해 여전히 혼란 스러울 수 있습니다.

IMHO, 코드를 통해 확인하고 다른 작업을 진행하기 전에 올바르게 들여 쓰기되었는지 확인하는 것은 코드를 작성하는 사람의 책임입니다.


0

코드를 다시 형식화하는 것도 반사적이어야합니다. 물론 전문 팀의 전문 프로그래머를위한 것입니다.


0

디버깅이 극도로 성가시다는 단순한 사실 때문에 모든 곳에서 중괄호를 사용하는 것이 가장 좋습니다. 그러나 그렇지 않으면 한 줄의 코드에 반드시 대괄호가 필요하지는 않습니다. 도움이 되었기를 바랍니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.