728x90

Java 언어와 C/C++ 비교를 표로 정리했다.

언어

차이점 설명

C언어

절차지향 언어

Java 보다 처리 속도가 빠르다

소스를 컴파일하고 나면 플랫폼상에서 바로 실행될 수 있는 실행파일이 생성된다.

컴파일러가 중간 단계인 오브젝트 코드를 생성한 후, 링커가 필요한 라이브러리를 링크하여 최종 실행 가능한 실행파일을 생성한다.

오브젝트 코드 및 실행파일은 플랫폼에 따라 다르므로 플랫폼이 달라지면 컴파일 및 링크를 새로 해야한다. 

절차지향은 대부분 코드가 main메소드에 한방에 정의 됨

절차지향 언어는 클래스 구분없이 한줄 한줄 절차적으로 컴파일

하드웨어를 직접 제어할 수 있는 것이 C언어

포인터를 이용하여 메모리에 접근한다.

관련된 데이터를 하나로 모으기 위해 구조체(structure)나 공용체(union)을 사용한다.

C++

객체지향언어. 동적 메모리 직접 관리. C++의 메모리는 일반적으로 스마트 포인터가 관리한다.

소스를 컴파일하고 나면 플랫폼상에서 바로 실행될 수 있는 실행파일이 생성된다.

컴파일러가 중간 단계인 오브젝트 코드를 생성한 후, 링커가 필요한 라이브러리를 링크하여 최종 실행 가능한 실행파일을 생성한다.

오브젝트 코드 및 실행파일은 플랫폼에 따라 다르므로 플랫폼이 달라지면 컴파일 및 링크를 새로 해야한다. 

C++에서 new 키워드를 통해 객체를 생성하면 Heap영역에 객체가 할당되고, 일반적인 변수 선언 방식을 택하면 Stack영역에 할당이 된다.

Java 보다 처리 속도가 빠르다

객체지향은 여러 Class로 나누어 개발이 가능하다.

C++ 은 다중 상속이 가능하다. C++ 은 Interface는 지원하지 않는다.

값에 의한 매개변수 전달 또는 참조에 의한 매개변수 전달 

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

C++은 이름 공간 레벨에 상수, 변수, 함수가 있을 수 있다.

C++에 있는 const는 개념적으로 '읽기 전용' 데이터임을 명시하며 자료형에 적용된다.

C++은 임의의 블록 크기로 메모리를 할당할 수 있다. 

C++에서는 초기화하지 않고 객체를 생성할 수 있다(쓰레기 값을 가지고 있다).

C++에는 메모리에 할당하였지만 접근 가능한 참조가 없는 객체가 있을 수 있다.

이런 접근 불가능한 객체는 소멸될 수도 없으므로 메모리 누수를 일으킨다.

C++은 C와 가장 하위 호환성이 좋은 언어이다.

C 라이브러리에 있는 운영 체제의 API 같은 것을 C++에서는 직접 사용할 수 있다.

C++은 보통 기계어로 직접 컴파일되고, 이를 운영 체제가 실행한다.

C++에서는 연산자오버로딩을 지원하지만, JAVA는 그렇지 않다.

Java

객체지향언어(Object Oriented Programming). 동적 메모리 가비지 컬렉션이 관리한다.

컴파일하면 JVM에서 실행가능한 바이트코드 형태의 클래스 파일이 생성되고, JVM을 통해 실행할 수 있다.

자바는 링크 과정이 없이 컴파일러가 바로 바이트 코드를 생성한다.

런타임에 필요한 클래스들이 JVM에 링크되며 클래스 로더가 동적으로 필요한 클래스를 로딩한다.

플랫폼 독립적이므로, 자바의 클래스 파일이 JVM에 실행되기 때문에 플랫폼이 달라져도 다시 컴파일하지 않아도 된다.

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

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

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

레퍼런스 타입은 new 연산자를 통해서 heap 영역에 생성되는 자료형들을 의미한다. 레퍼런스 타입으로는 클래스, 배열, 인터페이스 가 있다. 

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

C++ 는 float, double, long double을 지원하는데 Java 는 float, double을 지원한다. 

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

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

JAVA는 익명클래스(Anonymous Class)를 지원하지만, C++의 경우 그렇지 않다.

JAVA는 동적바인딩(런타임 중 실행코드가 결정한다), C++은 정적바인딩(virtual 키워드로 동적바인딩 가능)

Java코드는 실행하면서 JVM인터프리터에의해 바이트코드를 기계코드로 변환한다.

객체지향은 여러 Class로 나누어 개발이 가능하다.

단일 상속을 지원하고, 하나의 Class가 여러개의 Interface를 Implement할 수 있다.

클래스와 메인을 왔다갔다하면서 읽어야 하기 때문에 해석하기가 악갼 복잡하다.

항상 값에 의한 매개변수 전달(call by value).  매개변수로 객체에 대한 참조값을 사용할 수는 있다.

자바에서는 모든 상수, 변수, 함수는 반드시 클래스나 인터페이스에 속해 있어야 한다.

자바에 있는 final은 변수가 다시 할당될 수 없음을 나타낸다. 

자바는 객체를 생성하는 방식으로만 메모리를 할당할 수 있다. 

자바는 기본 초기화가 강제로 수행된다(0 등으로 초기화 된다).

자바에서는 접근 불가능한 객체가 되기 전까지 그 객체는 가비지 콜렉터가 소멸시키지 않는다.

자바는 메모리가 아닌 다른 자원의 누수에 대해서는 C++에 비해 상대적으로 취약하다.

자바에서 운영 체제나 하드웨어 기능에 직접 접근하려면 자바 네이티브 인터페이스를 이용하여야만 한다.

자바는 보통 바이트코드로 컴파일되고, 자바 가상 머신이 인터프리터 방식으로 실행하거나

 JIT 컴파일러 방식으로 기계어로 컴파일한 다음 실행한다.


블로그 이미지

Link2Me

,