티스토리 뷰

반응형

 C++와 JAVA을 비교하는 것은 대학에서 프로그래밍 언어를 배울 때, 얼핏 배우고 지나갔던 내용이었다. 비슷한 성격(객체지향)을 띄는 언어이지만, 차이점도 극명한 언어이기도하다. 


나름의 기준으로 3가지 기준으로 차이점들을 정리해봤다. 아, 그리고 여기에 작성되는 것들이 JAVA와 C++ 차이점의 전부는 아니라는 점 꼭 알아뒀으면 좋겠다. 그리고 나름대로 중요한 것만 뽑았지만... 아닐 수도 있다..


 





1. 상속

 대학 수업에서 교수가 학생에게 C++과 JAVA의 차이점을 묻는다면, 높은 확률로 학생은 상속에 관련된 차이점을 대답할 것이다. 그정도로 상속에 있어 두 언어의 차이점은 극명한데, JAVA가 C++보다 단순한 상속 체계를 지원한다. 


 첫째로, C++은 다중 상속을 지원하고 JAVA는 그렇지 않다. 여기서 '다중 상속'이라 함은, 하나의 클래스가 두개 이상의 클래스를 상속하는 것을 지칭한다. 다중상속을 지원하는 언어에서는 다이아몬드 문제(Diamond Problem)이 발생하는데, C++에서는 다이아몬드 문제를 회피할 수 있는 기능을 제공한다. 물론 JAVA에서는 애초에 발생할 일이 없다.



 둘째로, C++는 friend 키워드를 지원하고 JAVA는 그렇지 않다. 특정 class에 friend 키워드를 붙여서 클래스 혹은 함수를 선언해 놓으면, 명명된 클래스와 함수는 그 class의 private, protected area에 접근할 수있다. 하지만 이 방법은 객체의 은닉성을 파괴하므로 정말 특수한 경우가 아니면 사용을 지양한다.


 셋째로, JAVA는 Interface를 지원하고 C++는 그렇지 않다. 다중상속이 지원되지 않는 JAVA는 Interface를 통해 다중상속을 어느정도 흉내낼 수 있다. JAVA에서는 하나의 Class가 여러개의 Interface를 Implement할 수 있다. Interface는 상수와 추상메소드로만 구성되어 있으므로 여러개의 Interface를 implement하더라도, 다이아몬드 문제를 발생시키지 않는다.


※ 요약


1. C++은 다중 상속을 지원하나, JAVA는 지원하지 않는다.


2. C++는 friend 키워드를 지원하나, JAVA는 지원하지 않는다. friend 키워드는 은닉성 이슈로 사용을 자제한다.


3. JAVA는 다중상속을 지원하지 않는 대신 Interface를 지원한다. C++는 지원하지 않는다.





▶ 다중상속을 이용하면, 효과적인 코드의 재사용이 가능하다.




2. 메모리 처리

 앞서 JVM에 대해 소개했듯, JAVA와 C++의 메모리 처리(이런 '용어'를 써도 되는지 모르겠다.)에도 차이가 있는데...


 첫째로, JAVA는 객체를 메모리의 Heap영역에만 할당할 수 있으나, C++의 경우 Heap과 Stack영역 모두에 할당이 가능하다. C++에서 new 키워드를 통해 객체를 생성하면 Heap영역에 객체가 할당되고, 일반적인 변수 선언 방식을 택하면 Stack영역에 할당이 된다. JAVA에서는 일반적인 변수 선언 방식으로 객체를 생성할 수 없다. (http://preamtree.tistory.com/28 [스크랩자료]Heap과 Stack의 비교)

 둘째로, JAVA는 메모리(Heap 영역) 해제가 자동으로 이루어지지만, C++은 프로그래머가 수동으로 해야한다. JAVA에서는 Garbage Collector가 미사용 객체 등의 자원을 자동으로 해제하며, 프로그래머는 수동으로 GC를 조작할 수 없다. C++에서는 Destructor(소멸자)를 통해 메모리 해제가 가능하다.


※ 요약


1. C++은 객체를 Heap과 Stack에 모두 할당 가능, JAVA는 Heap에만 가능.


2. JAVA는 메모리 해제가 자동(Garbage Collection), C++은 수동



▶ Stack과 Heap의 개념도. Stack과 Heap은 Thread처리 등의 Synchronize 이슈에 관여하기도 한다.




3. 문법 및 기능

 마지막으로 언어의 성격, 그리고 문법적인 차이에서 오는 JAVA와 C++의 다른 점을 나열할 것이다.


 첫째로, C++에서는 연산자오버로딩을 지원하지만, JAVA는 그렇지 않다. 연산자 오버로딩은 단어 그대로 연산자를 재정의 하여 활용한다는 것인데, '객체'간 연산에 활용할 수 있다. (이를테면, *연산을 재정의하여 객체와 객체를 * 연산처리 할 수 있다.) JAVA는 만들어질 때부터 이러한 연산자 오버로딩을 지원하지 않는 방향으로 개발되었다고 한다. 



 둘째로, JAVA는 익명클래스(Anonymous Class)를 지원하지만, C++의 경우 그렇지 않다. 익명클래스는 JAVA에서 지원하는 기능인데, 말 그대로 이름이 없는 클래스이다. 인터페이스의 메소드 중 하나만 재정의하고 싶을 때 자주 사용되며, 클래스의 선언과 객체의 생성이 동시에 이루어지는 형태를 띄고 있다. JAVA는 익명클래스를 통해 '함수형 프로그래밍'의 형태를 어느 정도 흉내낼 수 있다.


 셋째로, JAVA는 동적바인딩(Dynamic Binding)을 택하고 있지만, C++은 정적바인딩(Static Binding)을 택하고 있다. 하지만 C++이 정적바인딩만 지원하는 것은 아니고, virtual 키워드를 통해 동적바인딩을 지원한다. 


※ 요약

1. C++은 연산자오버로딩 지원, JAVA는 지원하지 않음.


2. JAVA는 익명클래스 지원(함수형 프로그래밍을 어느정도 구현), C++은 지원하지 않음.


3. JAVA는 동적바인딩, C++은 정적바인딩(virtual 키워드로 동적바인딩 가능)



지금까지 살펴본 C++와 JAVA의 차이점을 표로 정리하면 다음과 같다.








-끝-






출처및참고

그림1: http://code.rohitink.com/2013/06/10/java-vs-cc-speed-performance-applications/

그림2: http://javapapers.com/core-java/why-multiple-inheritance-is-not-supported-in-java/

그림3: http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap/707970

저장저장




«   2022/06   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
글 보관함
Total
809,655
Today
26
Yesterday
129