[java] Java에서 중괄호는 그 자체로 무엇을 의미합니까?

두 가지 방법으로 중괄호를 사용하는 Java 코드가 있습니다.

// Curly braces attached to an 'if' statement:
if(node.getId() != null)
{
    node.getId().apply(this);
}

// Curly braces by themselves:
{
    List<PExp> copy = new ArrayList<PExp>(node.getArgs());
    for(PExp e : copy)
    {
        e.apply(this);
    }
}
outAMethodExp(node);

첫 번째 if문 다음에 나오는 독립형 중괄호 는 무엇을 의미합니까?



답변

추가 중괄호의 유일한 목적은 범위 제한을 제공하는 것입니다. 는 List<PExp> copy해당 중괄호 내에 만 존재하며 그 밖의 범위는 없습니다.

이것이 생성 된 코드 인 경우 코드 생성기가이 작업을 수행하므로 a를 몇 번 삽입했는지에 대해 걱정할 필요 List<PExp> copy없이이 코드 조각이있는 경우 변수 이름을 바꿀 수있는 것에 대해 걱정할 필요없이 일부 코드를 삽입 할 수 있다고 가정합니다. 동일한 메서드에 두 번 이상 삽입됩니다.


답변

두 번째로 matt b가 작성한 내용을 두 번째로 추가하겠습니다. 익명 중괄호의 또 다른 용도는 익명 클래스에서 암시 적 생성자를 선언하는 것입니다. 예를 들면 :

  List<String> names = new ArrayList<String>() {
    // I want to initialize this ArrayList instace in-line,
    // but I can't define a constructor for an anonymous class:
      {
        add("Adam");
        add("Eve");
      }

  };

일부 단위 테스트 프레임 워크는이 구문을 다른 수준으로 끌어 올려 완전히 컴파일 할 수없는 멋진 일을 허용합니다. 낯설어 보이기 때문에 나도 그렇게 큰 팬은 아니지만,이 사용을 통해 어떤 일이 벌어지고 있는지 적어도 인식하는 것은 가치가 있습니다.


답변

범위 제한 답변에 동의하지만 한 가지 추가하겠습니다.

때로는 코드 섹션을 접는 것을 좋아하고 자동으로 중괄호를 접는 편집기가있는 사람들의 코드에서 이와 같은 구조를 볼 수 있습니다. 그들은 일반적으로 접히는 함수, 클래스, 루프 등에 속하지 않는 논리 섹션에서 코드를 접는 데 사용합니다.


답변

누군가가 else 문을 잊었다 고 생각합니다.

추가 블록 범위를 만드는 데 신경을 쓸 이유가 거의 없습니다. 이 경우와 대부분의 경우, 누군가 영리한 일을하고있는 것보다 제어문을 입력하는 것을 잊었을 가능성이 훨씬 더 높습니다.


답변

그들은 내부 범위를 만듭니다. 이 중괄호 안에 선언 된 변수는 그 밖에 보이지 않습니다. 이것은 C / C ++에도 적용됩니다.


답변

중괄호는 switch / case 문의 범위를 줄이는데도 유용합니다.

switch(foo) {
  case BAR:
     int i = ...
     ...
  case BAZ:
     int i = ... // error, "i" already defined in scope
}

하지만 당신은 쓸 수 있습니다

switch(foo) {
  case BAR:{
     int i = ...
     ...
  }
  case BAZ:{
     int i = ... // OK
  }
}


답변

또한 초기화 블록 에도 사용됩니다 .