[면접질문] Java VS C++

chiyongs·2022년 7월 4일
2
post-thumbnail

최근 면접 본 두 곳에서 Java를 제외하고 할 줄 아는 언어가 있냐는 질문을 받았습니다.
저는 Java가 주 언어이고 다른 언어에 대해 깊게 공부하지 않아서 없다는 말씀을 드렸지만, 할 줄 아는 언어에 대한 답변을 원하셔서 학부 때 사용해 본 C++을 말씀드렸습니다.
하지만, 여기서부터 고비가 시작되었는데요... 저는 Java말고 다른 언어 할 줄 모른다고 말씀드렸잖아요 😥
바로, Java와 C++의 차이점은 무엇이냐는 질문이 들어왔습니다.
Java는 GC(가비지컬렉션)로 메모리를 자동적으로 관리해주지만 C++은 개발자가 직접 메모리 해제 작업을 해야 한다는 것이 제가 알고 있는 유일한 차이점이었습니다.
하지만, 답변에 이어 객체지향적으로 Java와 C++에 대한 차이점이 무엇인지 아시냐는 꼬리 질문에 차마 대답하지 못했습니다.
이번 글에서는 Java와 C++에 대한 차이점에 대해 공부하며 정리해보았습니다.

차이점

1. 메모리 관리

Java는 객체를 항상 Heap 영역에만 할당하고 가비지 콜렉터가 이를 수거합니다. 하지만, C++에서는 객체를 Heap과 Stack 영역 모두에 할당할 수 있습니다.

C++에서는 유효하지 않은 메모리(메모리에 할당하였지만 접근 가능한 참조가 없는 객체)가 존재할 수 있습니다. 이런 접근 불가능한 객체는 소멸될 수 없기 때문에 메모리 누수로 이어집니다. 하지만, Java는 GC(Garbage Collection)을 지원하여 이러한 대부분의 메모리 누수를 예방합니다.

C++에서는 객체를 초기화하지 않고 생성할 수 있습니다. 이로 인해 쓰레기 값을 가질수 있습니다. 하지만 Java에서는 기본 초기화가 강제로 수행됩니다.

2. 상속 👨‍👩‍👧‍👦

C++은 클래스 다중 상속을 지원하지만, Java는 클래스 다중 상속을 지원하지 않습니다. 다중상속을 지원하는 언어는 다이아몬드 문제(Diamond Problem)가 발생합니다.

다이아 몬드 문제는 다중 상속을 지원하는 언어에서 하나의 클래스가 여러 상위 클래스를 상속 받고 상위 클래스들에 동일한 메소드가 존재할 때 하위 클래스에서 어느 상위 클래스의 메소드를 상속받아야 하는지 모호한 문제입니다.

C++에서는 가상 상속(virtual)을 통해 다이아몬드 문제를 회피할 수 있습니다. Java는 다중 상속을 지원하지 않기 때문에 당연히 다이아몬드 문제가 발생하지 않습니다.

Java는 Interface를 지원하고 C++은 지원하지 않습니다. Java는 클래스 다중 상속이 지원되지 않지만 Interface 다중 상속이 가능합니다.
Java에서 Interface 다중 상속을 지원하는 이유는 Interface는 추상메소드로 구성되어 있기 때문에 다중 상속을 받은 클래스에서 해당 메소드를 구현하기 때문에 다이아몬드 문제가 발생하지 않기 때문입니다.

3. 라이브러리 📚

Java는 C++에 비해 상당히 거대한 표준 라이브러리를 가지고 있습니다. Java SE 표준 라이브러리는 컴퓨터 네트워크, 그래픽 사용자 인터페이스, XML 처리, 로깅, 데이터베이스 접근, 암호학, 기타 요소들을 모두 제공합니다.
C++의 표준 라이브러리는 문자열, 컨테이너, 입출력 스트림 등의 비교적 범용적인 요소들만 제공합니다. 따라서, C++에서 이런 추가 기능을 사용하기 위해선 써드파티(제3자) 라이브러리를 주로 이용합니다.

4. 런타임 👟

C++은 보통 기계어로 직접 컴파일되고, 운영체제에 의해 실행됩니다. 하지만, Java는 바이트코드로 컴파일된 후, JVM(Java Virtual Machine,자바 가상 머신)이 인터프리터 방식으로 실행합니다.
또한, Java는 항상 자동으로 배열의 인덱스 검사를 진행합니다. 인덱스 검사는 불안정성을 줄이지만 일반적으로 프로그램의 실행 속도가 느려지게 만듭니다. 하지만, C++은 인덱스 검사를 선택적으로 진행합니다.

5. 연산자 오버로딩

C++은 연산자 오버로딩을 지원하지만, Java는 지원하지 않습니다. 연산자 오버로딩은 기존 제공하고 있는 연산자를 재정의하여 사용자 정의 클래스로 사용하는 것입니다.

6. 매개변수 전달 방식

C++은 Call by ReferenceCall by Value방식 모두를 사용하지만, Java는 Call by Value방식만을 채택하여 사용합니다.
Java에서도 매개변수로 객체에 대한 참조값을 사용할 수 있습니다. 하지만, 참조 대상의 내용을 변경할 수는 있지만, 참조 값 자체를 변경할 수 없습니다.

  • Call by Reference : 참조에 의한 호출을 말합니다. 전달받은 값을 직접 참조합니다. 따라서, 전달받은 값을 변경할 경우 원본 값도 변경됩니다.
  • Call by Value : 값을 호출하는 것을 말합니다. 전달받은 값을 복사하여 처리합니다. 따라서, 전달받은 값을 변경하여도 원본 값은 변경되지 않고 영향을 받지 않습니다.

마무리❗️

Java

  • Heap영역에만 객체를 할당합니다.
  • 유효하지 않은 메모리를 GC가 관리합니다.
  • 클래스 다중 상속을 지원하지 않습니다.
  • Interface 다중 상속을 지원합니다.
  • 상당히 거대한 표준 라이브러리를 지원합니다.
  • JVM으로 인해 운영체제에 종속되지 않습니다.
  • 자동으로 인덱스 검사를 진행합니다.
  • 연산자 오버로딩을 지원하지 않습니다.
  • Call by value만을 채택하여 사용합니다.

C++

  • Stack, Heap 영역 모두 객체를 할당할 수 있습니다.
  • 유효하지 않은 메모리를 개발자가 직접 관리해야 합니다.
  • 클래스 다중 상속을 지원합니다.
  • 기계어로 직접 컴파일되고, 운영체제에 의해 실행됩니다.
  • 인덱스 검사를 선택적으로 지원합니다.
  • 연산자 오버로딩을 지원합니다.
  • Call by value와 Call by reference 모두 사용 가능합니다.

저는 Java와 C++이 같은 객체지향 언어이지만, 많은 부분이 다르다는 것을 알게 되었습니다.
잘못된 내용이나 오타가 있다면 댓글로 알려주시면 감사하겠습니다.


Ref

0개의 댓글