언어 |
차이점 설명 |
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 컴파일러 방식으로 기계어로 컴파일한 다음 실행한다. |