수색…


소개

Java 및 C ++은 유사한 언어입니다. 이 주제는 Java 및 C ++ 엔지니어를위한 빠른 참조 안내서 역할을합니다.

비고

다른 구문 내에서 정의 된 클래스 #

다른 클래스 내에 정의 됨

C ++

중첩 클래스 [ref] (둘러싸는 클래스에 대한 참조 필요)

class Outer {
   class Inner {
      public:
         Inner(Outer* o) :outer(o) {}

      private:
         Outer*  outer;
   };
};

자바

[정적] 중첩 클래스 (내부 클래스 또는 멤버 클래스)

class OuterClass {
    ...
    class InnerClass {
        ...
    }
}

다른 클래스 내에서 정적으로 정의 됨

C ++

정적 중첩 클래스

class Outer {
   class Inner {
      ...
   };
};

자바

정적 중첩 클래스 (정적 멤버 클래스라고도 함) [ref]

class OuterClass {
    ...
    static class StaticNestedClass {
        ...
    }
}

메서드 내에서 정의 됨

(예 : 이벤트 처리)

C ++

로컬 클래스 [ref]

void fun() {
   class Test {
      /* members of Test class */
   };
}

래미다 식 참조

자바

로컬 클래스 [ref]

class Test {
    void f() {
        new Thread(new Runnable() {
            public void run() {
                doSomethingBackgroundish();
            }
        }).start();
    }
}

오버라이드 대 오버로딩

다음 오버라이드 대 오버로드 포인트는 C ++ 및 Java 모두에 적용됩니다.

  • 재정의 된 메서드는 기본 메서드와 이름 및 인수가 동일합니다.
  • 오버로드 된 메서드는 이름은 같지만 인수가 다르며 상속에 의존하지 않습니다.
  • 동일한 이름과 인수를 가지지 만 리턴 유형이 다른 두 메소드는 불법입니다. "Java에서 다른 반환 유형으로 오버로딩"관련 Stackoverflow 관련 질문보기 - 질문 1 ; 질문 2

다형성

다형성 (Polymorphism)은 상속에 의해 서로 다른 클래스의 객체가 동일한 메소드 호출에 다르게 응답 할 수있는 능력입니다. 다음은 그 예입니다.

  • 기본 클래스 영역을 추상 메소드로 가지는 Shape
  • Square 클래스와 Circle 클래스의 두 파생 클래스는 영역 메서드를 구현합니다.
  • 사각형 참조 점과 영역이 도형 참조 점이 호출됩니다.

C ++에서 가상 메소드를 통해 다형성을 사용할 수 있습니다. Java에서 메소드는 기본적으로 가상입니다.

건설 / 파괴 명령

건설 / 파괴 명령

개체 정리

C ++에서는 소멸자를 가상으로 선언하여 기본 클래스 포인터가 삭제 된 경우 하위 클래스의 소멸자가 호출되도록하는 것이 좋습니다.

Java에서 finalize 메소드는 C ++의 소멸자와 비슷합니다. 그러나 finalizers는 예측할 수 없습니다 (그들은 GC에 의존합니다). 모범 사례 - 명시 적으로 정리하기 위해 "닫기"메소드를 사용하십시오.

protected void close() {
    try {
       // do subclass cleanup
    }
    finally {
       isClosed = true;
       super.close();
    }
}

protected void finalize() {
    try {
       if(!isClosed) close();
    }
    finally {
       super.finalize();
    }
}

추상 메서드 및 클래스

개념 C ++ 자바
추상 방법
구현없이 선언하다.
순수 가상 메서드
virtual void eat(void) = 0;
추상적 인 방법
abstract void draw();
추상 클래스
인스턴스화 할 수 없다.
인스턴스화 할 수 없습니다. 적어도 하나의 순수 가상 메소드를 가짐
class AB {public: virtual void f() = 0;};
인스턴스화 할 수 없습니다. 비 추상적 인 방법을 가질 수있다.
abstract class GraphicObject {}
인터페이스
인스턴스 필드 없음
"인터페이스"키워드는 없지만 추상 클래스의 기능을 갖춘 Java 인터페이스를 모방 할 수 있습니다 추상 클래스와 매우 비슷하지만 1) 다중 상속을 지원합니다. 2) 인스턴스 필드 없음
interface TestInterface {}

액세스 가능성 수정 자

모디파이어 C ++ 자바
공개 - 모두가 액세스 할 수 있음 특별한 메모 없음 특별한 메모 없음
보호 된 - 서브 클래스에 의해 접근 가능 친구도 접근 가능 동일한 패키지 내에서 액세스 가능
비공개 - 회원이 액세스 할 수 있습니다. 친구도 접근 가능 특별한 메모 없음
태만 클래스 기본값은 private입니다. struct 기본은 public입니다. 동일한 패키지 내의 모든 클래스에서 액세스 할 수 있습니다.
다른 친구 - 상속없이 개인 및 보호 된 회원에게 액세스 권한을 부여하는 방법 (아래 참조)

C ++ 친구 예제

class Node {
  private:
    int key;  Node *next;
    // LinkedList::search() can access "key" & "next"
    friend int LinkedList::search();
};

두려워하는 다이아몬드 문제

다이아몬드 문제는 두 클래스 B와 C가 A에서 상속 받았을 때 발생하는 모호성이며 클래스 D는 B와 C에서 상속됩니다. A에 B와 C가 오버라이드 된 메소드가 있고 D가 그것을 오버라이드하지 않으면 어떤 버전의 메소드가 D에서 상속 받는가? B 또는 C? ( 위키피디아 출신)

두려워하는 다이아몬드 문제

C ++은 항상 다이아몬드 문제에 취약했지만 Java는 Java 8까지 민감했습니다. 원래 Java는 다중 상속을 지원하지 않았지만 기본 인터페이스 메소드의 출현으로 Java 클래스는 둘 이상의 클래스에서 "구현"을 상속 할 수 없었습니다 .

java.lang.Object 클래스

Java에서 모든 클래스는 암시 적 또는 명시 적으로 Object 클래스에서 상속받습니다. 모든 Java 참조는 Object 유형으로 형변환 될 수 있습니다.

C ++에는 "Object"클래스가 없습니다.

Java Collections & C ++ 컨테이너

자바 콜렉션은 C ++ 컨테이너와 동의어입니다.

Java Collections 플로우 차트

C ++ 컨테이너 순서도

정수형

비트 최소 맥스 C ++ 유형
(LLP64 또는 LP64)
Java 유형
8 -2 (8-1) = -128 2 (8-1) -1 = 127 바이트
8 0 2 (8) -1 = 255 부호없는 문자 -
16 -2 (16-1) = -32,768 2 (16-1) -1 = 32,767 짧은 짧은
16 0 (\ u0000) 2 (16) -1 = 65,535 (\ uFFFF) 부호없는 짧은 char (부호없는)
32 -2 (32-1) = -24.77 억 2 (32-1) -1 = 2147 억 int int
32 0 2 (32) -1 = 42 억 5 천만 부호없는 정수 -
64 개 -2 (64-1) 2 (16-1) -1 긴* 오래 오래있어.
64 개 0 2 (16) -1 부호없는 long *
부호없는 long long
-

* Win64 API는 32 비트 밖에 없습니다.

더 많은 C ++ 유형

정적 클래스 멤버

정적 멤버는 개체 범위가 아닌 클래스 범위를가집니다.

C ++ 예제

// define in header
class Singleton {
   public:
      static Singleton *getInstance();

   private:
      Singleton() {}
      static Singleton *instance;
};

// initialize in .cpp
Singleton* Singleton::instance = 0;

Java 예제

public class Singleton {
    private static Singleton instance;
    
    private Singleton() {}
    
    public static Singleton getInstance() {
        if(instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

다른 구문 내에 정의 된 클래스

다른 클래스 내에 정의 됨

C ++

중첩 클래스 [ref] (둘러싸는 클래스에 대한 참조 필요)

class Outer {
   class Inner {
      public:
         Inner(Outer* o) :outer(o) {}

      private:
         Outer*  outer;
   };
};

자바

[정적] 중첩 클래스 (내부 클래스 또는 멤버 클래스)

class OuterClass {
    ...
    class InnerClass {
        ...
    }
}

다른 클래스 내에서 정적으로 정의 됨

C ++

정적 중첩 클래스

class Outer {
   class Inner {
      ...
   };
};

자바

정적 중첩 클래스 (정적 멤버 클래스라고도 함) [ref]

class OuterClass {
    ...
    static class StaticNestedClass {
        ...
    }
}

메서드 내에서 정의 됨

(예 : 이벤트 처리)

C ++

로컬 클래스 [ref]

void fun() {
   class Test {
      /* members of Test class */
   };
}

자바

로컬 클래스 [ref]

class Test {
    void f() {
        new Thread(new Runnable() {
            public void run() {
                doSomethingBackgroundish();
            }
        }).start();
    }
}

가치로 전달 및 참조로 전달

많은 사람들은 자바가 가치에 지나지 않는다고 주장하지만, 그보다 더 미묘한 차이가 있습니다. 다음 C ++ 및 Java 예제를 비교하여 값 별 (일명 사본) 및 참조 별 (일명 별칭)의 다양한 맛을보십시오.

C ++ 예제 (전체 코드)

  // passes a COPY of the object
  static void passByCopy(PassIt obj) {
     obj.i = 22;  // only a "local" change
  }

  // passes a pointer
  static void passByPointer(PassIt* ptr) {
     ptr->i = 33;
     ptr = 0; // better to use nullptr instead if '0'
  }

  // passes an alias (aka reference)
  static void passByAlias(PassIt& ref) {
     ref.i = 44;
  }

  // This is an old-school way of doing it.
  // Check out std::swap for the best way to do this
  static void swap(PassIt** pptr1, PassIt** pptr2) {
     PassIt* tmp = *pptr1;
     *pptr1 = *pptr2;
     *pptr2 = tmp;
  }

Java 예제 (전체 코드)

   // passes a copy of the variable
   // NOTE: in java only primitives are pass-by-copy
   public static void passByCopy(int copy) {
      copy = 33;  // only a "local" change
   }

   // No such thing as pointers in Java
   /*
   public static void passByPointer(PassIt *ptr) {
      ptr->i = 33;
      ptr = 0; // better to use nullptr instead if '0'
   }
   */

   // passes an alias (aka reference)
   public static void passByAlias(PassIt ref) {
      ref.i = 44;
   }

   // passes aliases (aka references),
   // but need to do "manual", potentially expensive copies
   public static void swap(PassIt ref1, PassIt ref2) {
      PassIt tmp = new PassIt(ref1);
      ref1.copy(ref2);
      ref2.copy(tmp);
   }

상속 대 구성

C ++과 Java는 둘 다 객체 지향 언어이므로 다음 다이어그램은 두 가지 모두에 적용됩니다.

상속과 컴포지션 예제

추방 된 다운 캐스팅

Downcasting은 상속 계층을 기본 클래스에서 하위 클래스 (즉, 다형성의 반대)로 변환합니다. 일반적으로 instanceof & downcasting 대신 다형성 & 무시를 사용하십시오.

C ++ 예제

// explicit type case required
Child *pChild =  (Child *) &parent;

Java 예제

if(mySubClass instanceof SubClass) {
   SubClass mySubClass = (SubClass)someBaseClass;
   mySubClass.nonInheritedMethod();
}

추상 메서드 및 클래스

추상 방법

구현없이 선언하다.

C ++

순수 가상 메서드

virtual void eat(void) = 0;

자바

추상적 인 방법

abstract void draw();

추상 클래스

인스턴스화 할 수 없다.

C ++

인스턴스화 할 수 없습니다. 적어도 하나의 순수 가상 메소드를 가짐

class AB {public: virtual void f() = 0;};

자바

인스턴스화 할 수 없습니다. 비 추상적 인 방법을 가질 수있다.

abstract class GraphicObject {}

인터페이스

인스턴스 필드 없음

C ++

자바와 비교할만한 것이 없다.

자바

추상 클래스와 매우 비슷하지만 1) 다중 상속을 지원합니다. 2) 인스턴스 필드 없음

interface TestInterface {}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow