ColonVsDoubleColon

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


C++에서의 사용

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

  • C++ 용도:

    • 네임스페이스, 클래스 정적 멤버, 전역 변수에 접근할 때 사용합니다.

    • 예를 들어, std::cout 또는 MyClass::value처럼 사용되어, 해당 이름이 어느 범위(namespace 또는 클래스)에 속하는지 명확히 지정합니다.

  • C++ 예시:

    #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++ 예시:

    • 멤버 초기화 리스트:

      #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:

      #include <iostream>
      using namespace std;
      
      int main() {
          int count = 0;
      start:  // 레이블 정의
          cout << "Count: " << count << endl;
          if (++count < 3)
              goto start; // 레이블로 점프
          return 0;
      }
    • 삼항 연산자:

      #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++ (멤버 초기화 리스트):

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

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

    • C++:

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

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

종합 정리

  • C++의 :: (범위 해제 연산자):

    • 네임스페이스, 클래스 정적 멤버, 전역 변수 등에 접근할 때 사용합니다.

    • Java에서는 이 역할을 점(.) 연산자가 수행합니다.

  • C++의 : (콜론):

    • 생성자 멤버 초기화 리스트, 레이블 정의, 삼항 연산자 구분자로 사용됩니다.

    • Java에서는 생성자 내 초기화는 직접 할당하며, goto가 없고, 삼항 연산자는 동일하게 사용됩니다.

Last updated