본문 바로가기

프로그래밍/기타정보

java 와 c/c++의 차이

1. 메모리 접근 방식 

c/c++ : pointer를 이용한 메모리 접근.

java : reference를 이용한 메모리 접근.


자바의 자료형은 크게 기본형과 레퍼런스 타입으로 분류할 수 있다. 

레퍼런스 타입은 new 연산자를 통해서 heap 영역에 생성되는 자료형들을 의미한다. 

레퍼런스 타입으로는 클래스, 배열, 인터페이스 가 있다. 

프로그래밍 언어에서 포인터와 레퍼런스는 다른 메모리 공간에 대한 주소를 가지고 있다는 점에서 매우 유사하기 때문

에 혼동되는 개념이다. 

포인터 혹은 레퍼런스 타입이 가리키고 있는 곳의 값에 접근하는 것을 dereference 라고 한다.

자바는 c++ 와 달리 포인터를 지원하지 않고, 레퍼런스 만을 지원한다. 

포인터와 자바언어에서 사용되는 레퍼런스는 다음과 같은 차이가 있다. 



2. 관련된 데이터를 하나로 모으기 위한 방법

c/c++ : 구조체, 공용체

java : 클래스 

java는 거의 완전한 객체지향프로그래밍 언어로 기본 단위가 class이다.

하지만 c++ 는 c언어 스타일의 전역함수, 변수, non-class object들이 남발하는 프로그램이다.



3. 기본형의 차이

문자형

c++는 기본적으로 char 형이 1byte이며 부호 표시 변수 이기때문에 -129~127 까지 표현이 가능하고 ASCII 문자형을 표현한다.

그에 반해 java는 char형이 2byte 이고 unsigned 부호표시 불가이기 때문에 0~65535까지 표현이 가능하고 유니코드를사용한다. 

java는 유니코드를 쓰기 때문에 세계의 어떤 언어든 소스 내에서 표현하기가 편리한 점이 있고c와는 달리 플랫폼에 상관없이 문자를 표현할 수 있는 장점이있다.

 

정수형

c++ 기본적으로 short, int, long, long long 형의 기본형과 signed, unsigned로 구분하여 총 8가지 정수형을 지원한다.

java도 short int long 세가지 정수형을 제공한다. java는 c언어와 다르게 기본형의 크기가 정해져있다. 

이는 java가 jre 라는 가상머신을 사용하기때문에 가능한것이다.


실수형 

c++ 는 float, double, long double을 지원하는데 이의 정밀도가 시스템마다 다르다.

java 는 float, double을 지원한다. 

문자열 

c++ 는 문자열을 위한 기본 자료형을 지원하지않는다. 대신 배열을 사용한다. 

java는 문자열을 위한 기본형을 없지만 string이라는 클래스를 제공한다. 


3. 성능 차이

많은 개발자들이 C++이 무조건 Java/C# 보다 빠를 거라 생각합니다.
Java/C#은 중간언어를 거치기 때문이죠..

하지만, 일반적인 프로그램인 경우는 Java/C#이 C++보다 더 빠르다고 하네요.
사람들의 예상과 다르죠.. ^^
인터넷 검색해보면 Java/C#이 C++보다 빠른 경우를 많이 찾아볼 수 있습니다.

먼저, Java/C#은 실행환경을 인식해서 성능 최적화가 가능합니다.
C++은 컴파일 타임 최적화만 가능합니다.

예를 들어 동일한 Intel계열 CPU라 하더라도 SSE4 기능이 있는 경우와 없는 경우가 있는데요..
Java/C#이라면 실행시간에 확인해서 SSE4를 사용하게 됩니다.
C++이라면 SSE4가 있는 경우와 없는 경우에 대해 각각 코드를 작성해야겠죠..
보통은 없다고 생각한 코드만 작성할 겁니다..

그리고, Java/C#이 메모리 할당과 해제도 더 빠르다고 합니다.
GC로 인해 메모리 공간이 잘 정리되어 있기 때문이라고 합니다.
대신에 가베지 컬렉션 문제가 있습니다.


그럼에도 왜 사람들은 C++이 더 빠르다고 생각할까요?
먼저, C++이 프로그램 기동 시간이 훨씬 빠릅니다.
중간언어 컴파일이 필요없기 때문이죠..

그리고, 포인터 연산을 이용한 성능 최적화 작업이 가능합니다.
C#에서 포인터 연산이 가능은 하지만 일반 개발자는 사용하지 않죠..

마지막으로, C++로 작성하면 프로그램 특성에 따라 메모리 관리 방법을 바꿀 수 있습니다.
Java/C#에서는 GC가 메모리 관리를 대신하기 때문에, 세밀하게 다루는 경우에는 더 어려워진다고 하네요..


정리하자면, 언어의 특성이 다르므로 경우에 따라 성능이 다르다는 것입니다.
최적화할 거면 C++이 좋고.. 아니면 Java/C#이 좋습니다.

일반적인 프로그램 작성은 Java/C#로 하는 것이 더 나은 선택입니다.
개발 생산성 차이가 매우 크고, 심지어 실행 성능도 더 빠를 수 있습니다.

로우레벨 프로그램 작성은 C++로 하는 것이 더 나은 선택입니다.
최적화 작업이 더 쉽기 때문입니다.

p.s. '사용하기 쉽냐, 최적화가 쉽냐'에 따른 선택 문제는 다른 곳에서도 있습니다.
DB에서 MS-SQL과 Oracle , 자동차 운전에서 오토매틱과 스틱  ^^


참고 문서