<CS 지식> C++/ Java 비교

Google 아니고 Joogle·2022년 8월 30일
0

CS 지식

목록 보기
19/22

1. 상속

C++은 다중 상속을 지원하고, JAVA는 다중상속을 지원하지 않는다

  • 대신 JAVA는 Interface를 지원하며 하나의 class가 여러 개의 InterfaceImplements할 수 있으며 다중상속을 어느정도 흉내낼 수 있다
    (Interface는 상수와 추상메소드만으로 구성되어 있으므로 여러 개의 interface를 implements하더라도 다이아몬드 문제를 발생시키지 않는다)
  • 다중상속을 지원하는 언어에서는 *다이아몬드문제 (Diamond Problem)이 발생하는데 C++에서는 다이아몬드 문제를 회피할 수 있는 기능을 제공한다

참고) *다이아몬드 문제

위의 그림과 같이 D가 B,C의 다중상속을 받았을 경우 B와 C에 같은 메서드가 존재하고, 상속 받으면서 해당 메서드를 서로 다르게 오버라이딩 했다면 D입장에서는 어느 부모의 메서드를 상속받는지 예측하기 어렵다
이처럼 정확한 상속 관계를 알 수 없어 호출이 모호해져 컴파일러는 정상적으로 수행하지 못하고 이를 다이아몬드 문제라고 하고 C++에서는 이를 해결하기 위해 Virtual키워드를 사용한다.
위에서 B,C가 A 클래스를 상속받을 때 virtual 선언을 하고, B,C 클래스를 상속받는 D 클래스는 A클래스를 한 번 상속받게 된다

2. 메모리 관리

Java는 Garbage Collector가 메모리를 관리한다

  • JAVA에서는 Garbage Collector가 Heap영역에 있는 참조되지 않는 객체를 자동으로 해제해주고 프로그래머가 수동으로 GC를 조작할 수 없다
  • C++에서는 객체를 Heap, Stack 영역 모두에 할당할 수 있다. new 키워드를 사용하여 객체를 생성하면 Heap영역, 일반적인 변수 선언 방식을 택하면 Stack 영역에 할당이 된다. 이렇게 생성된 객체는 Destructor (소멸자)를 통해 메모리를 직접 해제한다.
  • 하지만 C++에서도 Smart Pointer가 Standard로 들어오면서 메모리를 직접 해제한다고 하기 어렵다. 방식은 기본 포인터 (raw pointer)가 실제 메모리를 가리키도록 초기화한 후에, 기본 포인터를 스마트 포인터에 대입하여 사용하고 이렇게 정의된 스마트 포인터의 수명이 다하면 소멸자는 delete 키워드를 사용하여 할당된 메모리를 자동으로 해제한다.
    따라서 new 키워드가 반환하는 주소값을 스마트 포인터에 대입하면 따로 메모리를 해제할 필요가 없어진다

3. 문법

JAVA는 익명클래스 (Anonymous Class)를 지원한다

  • 익명 클래스는 말 그대로 이름이 없는 클래스이고 인터페이스의 메소드 중 하나만 재정의하고 싶을 때 자주 사용되며, 클래스의 선언과 객체의 생성이 동시에 이루어지는 형태를 띄고 있다
  • JAVA는 이런 익명 클래스를 통해 함수형 프로그래밍의 형태를 어느 정도 흉내낼 수 있다

4. 컴파일 과정

C/C++에서는 컴파일과 링크 과정을 거치지만 자바는 링크과정 없이 컴파일러가 바로 바이트코드를 생성한다

  • JAVA는 가상머신 바이트 코드로 컴파일 하며, 이를 실행 시키기 위해서는 가상머신 (JVM)이 필요하다
  • C/C++은 각각의 운영체제에 맞는 기계어로 컴파일되며 JAVA보다 실행 속도가 빠름

참고) *컴파일 언어, 인터프리터 언어, 바이트코드 언어
컴파일 언어: 원시코드 (프로그래머가 작성한 소스코드)를 모두 기계어로 변환한 후에 기계에 넣고 기계어 코드를 실행. 소스코드를 기계어로 번역하는 빌드 과정에서는 인터프리터 언어에 비해 시간이 소요되지만 런타임 상황에서는 이미 기계어로 모든 소스코드가 변환되어 있기 때문에 빠르게 실행 가능. (C, C++, Swift, Objective-c)

인터프리터 언어: 원시코드를 기계어로 변환하는 과정없이 한 줄 한 줄 해석하여 바로 명령어를 실행하는 언어. 빌드 시간이 없고 Runtime 상황에서는 한 줄씩 실시간으로 읽어서 실행하기 때문에 컴파일 언어에 비해 속도가 느림. 소스코드를 고치고 서버를 다시 시작하지 않아도 변경사항이 반영된 상태로 테스트 진행 가능, 디버깅이 쉽다 (R, Python, Ruby, JavaScript)

바이트코드 언어: 자바는 컴파일러를 이용해 우리가 작성한 Java 코드를 자바 가상 머신이 실행시킬 수 있는 자바 바이트 코드로 번역한다 (컴파일 언어)
자바 바이트 코드는 자바 가상머신의 자바 인터프리터를 이용해 한 줄씩 실행된다. 즉, 자바 바이트 코드로 되어 있는 실행 프로그램을 자바 인터프리터가 한 줄씩 읽으면서 컴퓨터가 이해할 수 있는 2진 코드로 번역한 후 실행 시킨다 (인터프리터 언어)

Reference
http://www.tcpschool.com/cpp/cpp_template_smartPointer
https://okky.kr/articles/449759
https://musket-ade.tistory.com/entry/C-%EB%8B%A4%EC%A4%91%EC%83%81%EC%86%8D-Multiple-Inheritance-%EA%B3%BC-%EA%B0%80%EC%83%81%EC%83%81%EC%86%8D-Virtual-Inheritance
https://jhkang-tech.tistory.com/136
https://jooona.tistory.com/157

profile
Backend 개발자 지망생

0개의 댓글