Contents |
C++
Features
- Operator Overloading
- Templates (Generic Programming)
- Objects : Object Oriented Programming
- Encapsulation : private, protected and public
- Inheritance
- Virtual Inheritance
- Multiple Inheritance 다중 상속
- Polymorphism
- Static Polymorphism
- Function Overloading : 같은 함수 이름, 그러나 다른 변수 타입, 변수 Default Value 설정 가능
- Dynamic Polymorphism : Inheritance, {{{dynamic_cast}}} operator, virtual member functions
- Static Polymorphism
C++0x
- RValue Reference : 기존의 &을 이용한 참조는 LValue Reference라고 부른다. &&을 사용하면 RValue Reference가 된다.
- Move Semantics : 오브젝트를 메모리상에서 다른 장소의 메모리로 이동 시킬 수 있다. 예를 들어 현재의 STL vector는 새 요소 삽입 시 빈 영역이 없으면 새 메모리를 확보하고 기존 요소를 복사 하는데, 이것을 생략할 수 있다. C++0x의 모든 STL에는 Move Semantics가 적용되어, 컴파일러만 바꾸어도 기존 코드의 성능 향상이 일어난다.
- http://vsts2010.net/56
- http://vsts2010.net/59
- Perfect Forwarding :
- Lambda
- {{{nullptr}}}
- {{{auto}}}
- {{{decltype}}}
Java
C#
Python
Lua
C++ vs Java
Grammar
- 읽기 전용을 명시하는 const과 final은 약간 다르다. C++에서 const Rectangle r; r.x =5;는 불가능하지만, Java에서 final Rectangle r = new Rectangle(); r.x = 5;는 가능하다.
Semantics
- C++는 Call by Reference와 Call by Value 둘 다 가능하다. Java는 Call by Value만을 지원한다.
- C++의 내장 자료형의 범위는 작동하는 플랫폼에 따라 달라질 수 있다. Java의 경우는 가상 머신이 결정한 일정한 크기와 범위를 가진다.
- C++는 부동 소수점 연산에 있어서 플랫폼 종속적이다. Java는 모든 플랫폼에서 같은 결과를 보장하나 수행 성능의 저하가 있을 수 있다.
- C++는 포인터를 직접적으로 조작 가능하다. 포인터에 대한 포인터도 지원한다. 함수 포인터를 지원한다.
- C++는 연산자 오버로딩 기능을 지원한다. Java에서는 문자열 연결에 쓰이는 "+"와 "+="만 제한적으로 오버로딩을 지원한다.
- C++는 다중 상속을 지원한다. Java는 복수의 인터페이스를 받을 수 있지만 단일 상속만 가능하다. 즉, 형태에 대한 다중 상속은 지원하되 구현에 대해선 단일 상속만 가능하다.
- Java는 언어와 표준 라이브러리 차원에서 멀티스레드를 지원한다. {{{synchronized}}} 키워드가 그것이다. C++는 라이브러리를 사용하여 비슷한 일을 할 수 있다.
- C++의 Template은 컴파일 시 Template code를 복사한다. Java의 Generic은 컴파일 시 타입을 지워버리고 단일 템플렛을 유지한다.
Resource Management
- 객체의 생성과 소멸 : C++는 Constructor를 부르지 않고 객체를 생성할 수 있다. 이 경우 Member Variable 들은 쓰레기 값을 가지고 있다. Java의 경우에 기본 초기화가 강제로 수행되는 것과는 확연한 차이가 있다. C++의 Destructor는 암시적으로 (스택영역 변수의 경우) 또는 명시적으로 객체를 할당 해제할 때 (delete) 실행된다. 자바의 Finalizer는 가비지 콜렉터가 암시적으로 처리되는 것과는 확연한 차이가 있다.
- 메모리 누수 : C++는 메모리에 할당하였지만 접근 가능한 참조가 없는 객체가 있을 수 있다. Java에서는 Reference Count가 0이 되지 않는 경우 (Garbage Collector가 미처 파악하지 못한 상호 참조 같은 경우)에 메모리 누수 문제가 발생할 수 있다.
- 메모리 할당 : C++는 임의의 블록 크기로 메모리를 할당할 수 있지만, Java는 객체를 생성하는 방식으로만 메모리를 할당할 수 있다.
Runtime
- C++는 보통 기계어로 직접 컴파일되고, 이를 운영 체제가 실행한다. Java는 보통 바이트코드로 컴파일되고, 자바 가상 머신이 인터프리터 방식으로 실행하거나 JIT 컴파일러 방식으로 기계어로 컴파일한 다음 실행한다.
- C++의 자유성은 컴파일 시에 신뢰성 있는 검사를 불가능하게 만들어 런타임에 오류가 날 위험이 있다. Buffer Overflow, Page Fault, Segmentation Fault 등이 그것이다. Java의 경우에는 그런 위험이 매우 적으며 있다 하더라도 예외 처리 형태로 보고된다.
- Java는 배열의 경계 검사를 요구한다. 불안정성을 줄이는 대신 속도를 저하시킨다.