Java Language
C ++ 비교
수색…
소개
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 ++ 예제
// 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 {}