본문 바로가기
IT/Teckweek

C++과 Java의 차이점

by YEON-DU 2020. 6. 21.
반응형

이미 알고 있던 사실 :

C++과 Java는 둘다 객체지향프로그래밍 언어이다.

C++과 달리 Java는 JRE에서 돌아가는 언어이다.

가장 큰 차이점은 메모리 관리에서 나타난다. Java에서는 자동적으로 GC가 메모리를 관리해준다.

 

C++ Java
C 소스 코드와 하위 호환성 다른 언어와 소스 코드 호환성은 없음
부호없는(unsigned) 연산 지원 부호없는 연산 지원 안 함
값에 의한 매개변수 전달 또는 참조에 의한 매개변수 전달 항상 값에 의한 매개변수 전달. 매개변수로 객체에 대한 참조값을 사용할 수는 있다. 참조 대상의 내용을 변경할 수는 있지만, 참조값 자체는 변경할 수 없다; 메서드 호출 후에도 참조하는 객체는 다른 객체로 바뀌지 않을 것이다.
명시적 메모리 관리, 가비지 콜렉션은 추가적으로 라이브러리를 이용해야 함 항상 자동 가비지 콜렉션
명시적인 자료형 재정의 허용 자료형 안전성에 엄격함
연산자 오버로딩 연산자는 재정의 할 수 없음

 

다중 상속

C++은 클래스 다중 상속을 지원하지만 Java는 그렇지 않다.

상속을 위해 extends 이후에 클래스를 여러 개 사용할 수 없고, 대신에 Java에서는 interface를 사용하여 다중 상속한다.

그렇다면 왜 Java에서는 클래스 다중 상속을 지원하지 않을까?

→  다중 상속을 하게 되면 발생하는 문제가 있다. 바로 다이아몬드 문제(혹은 죽음의 다이아몬드)라고 불리는 문제이다.

간단한 예시는 다음과 같다.

A라는 클래스가 있다.

B와 C를 다중 상속하는 D라는 클래스를 만들었을 때,

A에게 getName()라는 함수가 있었다 치자.

그렇다면 A를 상속받은 B와 C에게는 getName() 함수가 존재한다.

이러한 B와 C를 상속받은 D에서도 getName() 함수가 존재해야 하는데,

이때 D의 getName()은 B에서 온 것인지, C에서 온 것인지 모호(ambiguous)해진다. (컴파일러가 컴파일하지 못한다)

 

따라서 Java에서는 상수와 추상 메소드만을 정의하는 interface의 경우 다중상속 가능하도록 했다.

반면, abstract 클래스나 일반 클래스는 다중 상속이 불가능하다.

 

→ 그렇다면 C++에서는 이 문제를 어떻게 해결한 것일까?

→ virtual 키워드 사용, 컨벤션 등. 이 문제는 virtual 함수에서 다시 정리해보도록 하자.

 

메모리 처리

Java는 객체를 메모리의 Heap영역에만 할당할 수 있으나, C++의 경우 Heap과 Stack영역 모두에 할당이 가능하다.

메모리 해제를 C++의 경우에는 수동으로 해주어야 하지만, Java에서는 가비지 콜렉션을 통해 자동으로 이루어진다.

 

각자의 언어에서의 유일한 기능

C++

friend 키워드

클래스나 내부의 함수에 friend 키워드를 붙여놓은 경우에 해당 클래스나 함수는 그 class의 private, protected를 pubilc처럼 접근할 수 있게 된다. 이 키워드는 접근할 수 있도록 '허용'하는 쪽에서 사용한다. 이처럼 freind 키워드는 접근지정자(private, protecte…)를 무시할 수 있는 기능을 가졌다. 따라서 객체 지향에서의 은닉성을 파괴하는 기능이기도 하다.

 

Java

interface, Anonymous Class

 

둘 중 어느 언어를 선택할 지 여부를 정할 때,

C로 된 기반 코드가 있고 성능이 매우 중요한 경우에는 C++을 사용한다. (일반적으로 C++의 속도는 Java보다 빠르다)

이식성, 보안, 속도가 중요한 경우에는 Java를 사용한다.

 

+ 꼬리질문

C++와 Java는 C에다 어떤 개념을 추가한 것인가?

C#과의 차이

 

출처 :

https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94%EC%99%80_C%2B%2B%EC%9D%98_%EB%B9%84%EA%B5%90

https://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem

반응형

'IT > Teckweek' 카테고리의 다른 글

MVC, MVP, MVVM  (0) 2020.08.15
SSO란?  (0) 2020.08.02
SPA란?  (0) 2020.08.02
SSR과 CSR이란?  (0) 2020.07.22
REST API란?  (0) 2020.07.09

댓글