> For the complete documentation index, see [llms.txt](https://byulseop-til.gitbook.io/sinheeseop_til/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://byulseop-til.gitbook.io/sinheeseop_til/c++/101/cpp_colon_vs_double_colon.md).

# ColonVsDoubleColon

아래는 C++에서 사용되는 콜론(`:`)과 범위 해제 연산자(`::`)의 용도와, 이들을 Java에서의 대응 개념과 비교하여 정리한 내용입니다.

***

### C++에서의 사용

#### 1. 범위 해제 연산자 (`::`)

* **C++ 용도:**
  * **네임스페이스, 클래스 정적 멤버, 전역 변수**에 접근할 때 사용합니다.
  * 예를 들어, `std::cout` 또는 `MyClass::value`처럼 사용되어, 해당 이름이 어느 범위(namespace 또는 클래스)에 속하는지 명확히 지정합니다.
* **C++ 예시:**

  ```cpp
  #include <iostream>
  using namespace std;

  namespace MyNamespace {
      void hello() {
          cout << "Hello from MyNamespace!" << endl;
      }
  }

  class MyClass {
  public:
      static int value;
  };
  int MyClass::value = 42;

  int value = 100; // 전역 변수

  int main() {
      MyNamespace::hello();           // 네임스페이스 내 함수 호출
      cout << "Value: " << MyClass::value << endl; // 클래스 정적 멤버 접근
      int value = 50; // 지역 변수
      cout << "Local value: " << value << endl;
      cout << "Global value: " << ::value << endl;   // 전역 변수 접근 (앞에 :: 사용)
      return 0;
  }
  ```

#### 2. 콜론 (`:`)

* **C++ 용도:**
  * **멤버 초기화 리스트:**
    * 생성자에서 클래스 멤버를 초기화할 때 사용합니다.
    * 예: `Point(int a, int b) : x(a), y(b) { }`
  * **레이블 정의:**
    * `goto`문과 함께 사용하는 레이블을 정의할 때 사용합니다.
  * **삼항 연산자 구분자:**
    * 조건 연산자에서 `?` 다음의 두 값을 구분합니다.
* **C++ 예시:**
  * **멤버 초기화 리스트:**

    ```cpp
    #include <iostream>
    using namespace std;

    class Point {
    private:
        int x, y;
    public:
        // 생성자: 멤버 초기화 리스트 사용
        Point(int a, int b) : x(a), y(b) { }
        void print() const {
            cout << "(" << x << ", " << y << ")" << endl;
        }
    };

    int main() {
        Point p(3, 4);
        p.print(); // 출력: (3, 4)
        return 0;
    }

    ```
  * **레이블과 goto:**

    ```cpp
    #include <iostream>
    using namespace std;

    int main() {
        int count = 0;
    start:  // 레이블 정의
        cout << "Count: " << count << endl;
        if (++count < 3)
            goto start; // 레이블로 점프
        return 0;
    }
    ```
  * **삼항 연산자:**

    ```cpp
    #include <iostream>
    using namespace std;

    int main() {
        int a = 10, b = 20;
        int max = (a > b) ? a : b; // 조건식의 결과에 따라 값 선택
        cout << "Max: " << max << endl;
        return 0;
    }
    ```

### Java와의 비교

#### 1. 범위 해제 연산자 vs. 클래스 멤버 접근

* **C++ (`::`):**
  * `::`는 네임스페이스나 클래스의 정적 멤버에 접근할 때 사용합니다.
  * 예: `std::cout`, `MyClass::value`
* **Java:**
  * Java에서는 클래스의 정적 멤버에 접근할 때 **점(.)** 연산자를 사용합니다.
  * 예: `System.out.println()` 또는 `Math.PI`
  * **비교:**
    * C++의 `::`와 Java의 `.`는 모두 해당 이름의 소속 범위를 지정하여 접근합니다.

#### 2. 콜론 (`:`) 사용 비교

* **C++에서의 콜론:**
  * **멤버 초기화 리스트:**
    * 생성자에서 멤버를 초기화할 때 사용 (예: `Point(int a, int b) : x(a), y(b) { }`)
  * **레이블 정의:**
    * `goto`와 함께 사용하여 점프 위치를 지정
  * **삼항 연산자:**
    * 조건 연산자에서 값들을 구분 (Java와 동일)
* **Java에서의 대응:**
  * Java에는 **멤버 초기화 리스트**가 없습니다.
    * 대신, 생성자 본문 내에서 멤버를 초기화합니다.
  * Java에는 `goto`문이 존재하지 않으므로 레이블 사용도 하지 않습니다.
  * \*삼항 연산자 (`? :`)\*\*는 C++와 동일하게 사용됩니다.

#### 3. 예시 비교

* **C++ (멤버 초기화 리스트):**

  ```cpp
  class Point {
  private:
      int x, y;
  public:
      Point(int a, int b) : x(a), y(b) { }
  };
  ```
* **Java (생성자 내 초기화):**

  ```java
  public class Point {
      private int x, y;

      public Point(int a, int b) {
          this.x = a;
          this.y = b;
      }
  }
  ```
* **C++와 Java (정적 멤버 접근):**
  * C++:

    ```cpp
    class MyClass {
    public:
        static int value;
    };
    int MyClass::value = 42;
    // 접근: MyClass::value
    ```
  * Java:

    ```java
    public class MyClass {
        public static int value = 42;
    }
    // 접근: MyClass.value
    ```

### 종합 정리

* **C++의 `::` (범위 해제 연산자):**
  * 네임스페이스, 클래스 정적 멤버, 전역 변수 등에 접근할 때 사용합니다.
  * Java에서는 이 역할을 점(.) 연산자가 수행합니다.
* **C++의 `:` (콜론):**
  * 생성자 멤버 초기화 리스트, 레이블 정의, 삼항 연산자 구분자로 사용됩니다.
  * Java에서는 생성자 내 초기화는 직접 할당하며, `goto`가 없고, 삼항 연산자는 동일하게 사용됩니다.
