01. 기술면접 - 자바 - JAVA 와 C/C++ 차이점
공부목적으로 다른 블로그의 글을 그대로 따라치면서 작성되었습니다. 저작권 문제 시, 비공개 처리하겠습니다
차이점
- 자바와 c/c++ 의 가장 큰 차이점은 실행 환경이다
- java 에서의 개발 혹은 컴파일 + jar 압축
- 자바는 링크 과정이 없이 컴파일러가 바로 바이트 코드를 생성
- c/c++ 에서의 개발: 컴파일 + 링크
다른 블로그 글
- c++ 과 java 는 문법적으로 상당히 유사하다
- java 를 설계 할 때 c++ 개발자들이 쉽게 배울 수 있도록 만들었기 때문이다
- 하지만 여러 차이점이 있는 데, 이는 설계 목표 차이에서 발생했다
- java 는 보안, 이식성, 빠른 개발에 비중을 두었고, C++ 은 속도와 C 언어의 하위호환성에 중점을 두었다
- 또 한 java 는 가상 머신 바이트 코드로 컴파일하여, 실행시키려면 가상 머신이 필요하지만,
C++은 각 OS의 머신에 맞는 기계어로 컴파일(java보다 빠른 이유) 한다
- 그래서 일반적으로 c++ 이 빠르긴 하지만, java 가 이식성, 보안성면에서 나은 편이다
- C++ 은 C를 그대로 포함하며 하위 호환성을 유지하기 위해 프로그래머에게 메모리관리 제어, 포인터, 전처리기 같은
기능을 컨트롤하게 한다
- 하지만 JAVA 에서는 그 외에도 여러 버그를 일으키기 쉬운 기능들을 없애버렸다
- 특히, 프로그래머가 손수 메모리를 비우는 방법 대신 가비지 컬렉션을 사용한다
- 또한, C++의 연산자 오버로드나 다중 상속같은 기능은 쓸 수 없다.
(다중 상속 대신 인터페이스로 다중 상속과 유사한 기능을 제공한다)
- 이 때문에 빠른 개발이 필요하고, 성능보다 이식성과 보안이 더 우선시 되는 경우 JAVA를 더 선호하곤 한다
- JAVA 에서는 모든 객체가 reference 로 전달 되지만, c++ 에서는 기본적으로 객체를 값으로 전달한다
(객체는 Array[] 또는 Class 들을 말하며, int, long, double 과 같은 primitve type 은 값으로 전달한다
자바에서는 call by value 와 call by reference 가 존재하는 것이다.)
- JAVA 에서는 C++ 에서처럼 자동 casting(=cascading) 을 하지 않지만, 최근 버전에서는 제너릭(Generic)이나
오토박싱(primity(long) -> wrapper class (Long)) 같은 기능이 추가되어 여러 상황에서 자동 cating 이 가능하다
- JAVA 에서는 모든 메소드가 가상 메소드이다. 즉, 레퍼런스 유형이 아니라 객체 유형에 따라 메소드 구현이 결정된다
C++ 에서는 가상 메소드를 별도로 선언해줘야 한다
- JAVA 에서는 원시 데이터형의 크기가 정의 되어있지만, C++ 에서는 구현에 따라 데이터형의 크기가 달라진다
- 기본에 만든 c코드가 있고, 성능이 매우 중요할 때는 C++ 쓰는 쪽이 유리하지만, 이식성, 보안, 개발 속도등이
중요한 상황에서는 JAVA 와 C#을 선택하는 것이 낫다
또 다른 블로그 글
1. 설계 목표
- JAVA 설계할 때, 보안과 빠른 이식성에 집중했다
- C++ 속도와 C와의 하위 호환성에 집중했다
- C++ 은 절차지향언어인 C의 효율성 측면을 개선하기 위해 OOP(Object Programing Programing)을 결합한 것이기
때문
- 완벽한 OOP 가 아닌 절차지향도 섞여 있어 약점이 많다
2. 클래스 차이
- JAVA : 기본 단위가 Class 로, 거의 완전한 OOP 라고 보면 된다
- C++ : C언어의 상위 호환이기 때문에 절차지향이 섞여있다
3. 컴파일과 런타임의 차이
- JAVA : 가상머신 바이트 코드로 컴파일 하며, 이를 실행 시키기 위해서는 가상 머신(JVM) 이 필요함
- C++ : 각 운영체제(Window, Linux, Mac)에 맞는 기계어로 컴파일함
- 이게 C++ 이 JAVA 보다 실행속도가 빠른이유가 된다
4. 보안성
- JAVA 보안성이 더 높음(JVM 이 메모리를 관리하기 떄문에 해커가 메모리를 조작하기 어려움 - 반면 C++ 은 쉬움)
- Why? JAVA 는 몇 가지 보안 매커니즘을 구현하여 잘못된 프로그램으로 인해 생기는 피해를 막아주도록 설계 되어 있음
5. 바인딩의 차이
- JAVA : 동적 바인딩
- 런타임에 기반하여 Method를 호출
- 별도의 데이터 관리가 필요하고, 불필요한 오버헤드가 붙을 수 있다
- C++ : 정적 바인딩
- 컴파일 타임에 함수 호출을 결정, 프로그램 실행 중 불필요한 오버헤드가 없음
- 부모 클래스의 함수를 오버라이딩 하는 과정에서 정적 바인딩으로 인한 문제가 발생하기 때문에 virtual 키워드를
제공한다 (가상 메소드)
바인딩
- 일반 함수를 정적 바인딩, 가상 함수를 동적 바인딩이라고 생각하면 된다
정적바인딩: 컴파일 시, 어떤 함수를 호출할 지 결정
-> (장점) 다형성(polymorphism) 으로 인해 융통성을 갖게 됨. (단점) 실행속도가 미세하지만 느려짐
동적바인딩: 런타임 중, 실행코드가 결정이 됨
-> (장점) 실행속도는 동적바인딩보다 빠름 (단점) 융통성이 적음
6. 문법의 차이
C++ : C의 상위호환으로서의 역할을 다하기 위해, 프로그래머에 의한 메모리 관리제어, Pointer, Pre-Processor 등의
기능을 전부 유지
JAVA : 위의 기능 + 버그를 야기할 수 있는 쉬운 기능을 전부 제거
- C++에서는 동적으로 할당된 메모리는 직접 해체해야 하지만, JAVA 는 가비지 컬렉터(Garbage Collector)가 알아서
해제해줌
- C++ 의 기능인 연산자 오버로딩, 다중 상속을 사용할 수 없음
- 대신에 interface 를 사용해 다중 상속의 흉내를 낼 수 있다
참고
https://do-rang.tistory.com/79
https://showmiso.tistory.com/252
https://drunkenamoeba.tistory.com/entry/122-%EC%9E%90%EB%B0%94%EC%9D%98-%ED%8A%B9%EC%A7%95
'∞. 기술 면접 > 7. 자바' 카테고리의 다른 글
06. 기술면접 - 자바 - Non Static 과 Static (0) | 2021.10.21 |
---|---|
05. 기술면접 - 자바 - OOP 의 4가지 특징과 OOP 5가지 설계 원칙 (1) | 2021.10.20 |
04. 기술면접 - 자바 - 래퍼 클래스 (Wrapper Class) (0) | 2021.10.20 |
03. 기술면접 - 자바 - 접근 제어자(Access Modifier)와 데이터 타입 (Data Type) = 자료형 (0) | 2021.10.20 |
02. 기술 면접 - 자바 - 자바 언어의 장점 (0) | 2021.10.20 |
댓글
이 글 공유하기
다른 글
-
05. 기술면접 - 자바 - OOP 의 4가지 특징과 OOP 5가지 설계 원칙
05. 기술면접 - 자바 - OOP 의 4가지 특징과 OOP 5가지 설계 원칙
2021.10.20 -
04. 기술면접 - 자바 - 래퍼 클래스 (Wrapper Class)
04. 기술면접 - 자바 - 래퍼 클래스 (Wrapper Class)
2021.10.20 -
03. 기술면접 - 자바 - 접근 제어자(Access Modifier)와 데이터 타입 (Data Type) = 자료형
03. 기술면접 - 자바 - 접근 제어자(Access Modifier)와 데이터 타입 (Data Type) = 자료형
2021.10.20 -
02. 기술 면접 - 자바 - 자바 언어의 장점
02. 기술 면접 - 자바 - 자바 언어의 장점
2021.10.20