면접에서 가장 많이 나오는 빈도 높은 질문은 단연 이 질문이 아닐까 싶다....
객체지향, 절차지향과 같은 단순한 점들만 알고 있었는데 좀 더 자세하고 구체적인 것들을 나열해 보겠다.
- Java는 typedef, enum, defined 또는 preprocessor를 지원하지 않는다.
- Java는 클래스를 지원하지만 구조체와 유니온은 지원하지 않는다.
- 모든 c++ 프로그램은 main 함수가 필요하다.
- 모든 자바 클래스는 Object 클래스를 상속해야 합니다.
- Java에서 선언하는 모든 함수 혹은 메소드는 클래스 선언 내에 포함된다.
- C++과 Java 모두 클래스의 객체를 인스턴스화 하지 않아도 호출할 수 있는 클래스 메소드나 함수를 지원한다.
- Java에서 'interface' 키워드는 함수에 대한 선언과 상수만을 가지는 ABC(Abstract Base Classes)와 동등한 효과를 내기 위해 사용한다. 멤버 함수와 변수는 정의되어서는 안된다. 이 'interface' 개념은 C++에서는 지원하지 않는다.
- Java는 다중 상속을 지원하지 않는다. Java 프로그램에서 interface 기능은 어느 정도 기본적인 문제 없이 다중 상속의 주요 기능을 제공한다.
- Java는 자동 형 변환을 지원하지 않는다.
- C++과 달리 Java는 String 형을 가지고 있으며, 이것의 객체는 변경할 수 없다. 인용문으로 표현된 문자열은 자동으로 String 객체로 전환된다. Java는 또한 StringBuffer 형을 가지고 있는데, 이 형의 객체는 수정이 가능하다.
- C++과는 달리 Java는 배열이 얼마나 큰지 알려주는 length 멤버 변수를 가진 객체로 배열을 제공한다. 배열의 범위를 넘어서 접근하면 예외를 발생시킨다.
- Java는 포인터를 지원하지 않는다. (적어도 포인터 내 주소 변경이나 포인터 연산을 수행할 수 없다.) 포인터에 대한 필요성은 Array나 String 형을 제공하면서 제거되었다. 자바에서는 문자열 자체가 객체이기 때문에 필요없다.
- C++에서는 스코프 해석 연산자(::)가 필요하지만 Java에서는 사용하지 않는다. Java에서 .(도트)는 전체 참조 경로를 구성하는데 사용된다. 당연히 자바에서는 -> 를 쓰지 않는다.
- C++에서는 정적 멤버와 함수들이 클래스의 이름과 스코프 해석 연산자로 연결한 정적 멤버 이름을 사용하여 호출하게 된다. Java에서는 이와 같은 목적으로 '.'을 사용한다.
- C++ 처럼 Java는 int, float 등과 같은 원시 자료형을 가지고 있다. c++과는 달리, 원시 자료형의 크기는 플랫폼과 상관없이 동일하다. java에서는 unsigned integer 형이 없다. 유형 검사 및 유형 요구 사항은 c++에 비해 java에서 훨씬 엄격하다.
- C++과 달리 JAVA는 실질적인 boolean 형을 제공한다. (실질적인? 이 무슨 의미일까?)
- Java에서 조건문은 c++처럼 정수로 표현하기 보다 boolean으로 판단해야 한다. (왜?)
- C++에서 문자형은 아스키코드 문자 집합에 연결된 1바이트 (8bit) 이다. java에서 문자형은 2바이트 (16bit)이다.
- C++은 모든 유형의 객체 혹은 변수를 정적 메모리의 경우 컴파일 시에, 동적 메모리의 경우 실행 시에 인스턴스화 할 수 있다. 하지만 Java의 모든 원시 자료형은 컴파일 시 인스턴스화 되어야 하며 모든 객체는 실행 시 동적 메모리에 인스턴스화 되어야 한다. 실행 시 동적 메모리에 객체를 인스턴스화 할 수 있도록 byte와 short를 제외한 모든 원시 자료형에 대한 래퍼 클래스들이 제공된다.
- C++에서 명확하게 초기화하지 않는 경우 원시 자료형의 변수들은 쓰레기 값을 가지게 된다. 비록 원시 자료형의 지역 변수들이 선언 시 초기화될 수 있다고는 하지만, 클래스의 원시 데이터 멤버들을 클래스 정의 시 초기화될 수 없다.
- Java에서 원시 데이터 멤버들을 클래스 정의 시 초기화 할 수 있으며, 생성자에서 초기화할 수도 있다. 초기화에 실패할 경우 이들은 0 값으로 초기화 될 것이다.
- C++처럼 Java는 다중정의 할 수 있는 생성자를 지원한다. (Overloading) C++에서와 같이 생성자를 제공하지 않을 경우 기본 생성자를 제공하고 있다. 만일 생성자를 제공한다면(내가) 기본 생성자는 자동으로 무시된다.
- Java에서 모든 객체는 해당 생성자가 복사되는 것을 방지하기 위해 참조에 의한 전달을 한다.
(실제 Java에서 모든 매개 변수는 값에 의해 전달된다. 참조변수를 복사해서 전달함으로써 수신 함수의 코드에서 변수에 의해 참조되고 있는 객체에 접근할 수 있으며, 해당 객체의 내용을 변경할 수 있다. 그러나 수신 함수의 코드에서 원래 참조 변수가 다른 객체를 참조하도록 할 수는 없다)
- Java에서는 소멸자가 없다. 사용되지 않는 메모리는 메인 프로그램과 다른 스레드에서 실행하는 가비지콜렉터에 의해 운영체제로 반환된다.
- C++과 마찬가지로 Java도 함수의 다중 정의를 지원한다. 그러나 기본 인자는 제공하지 않는다.
- C++과 달리 Java는 템플릿을 지원하지 않는다. 따라서 제네릭 함수 혹은 클래스도 없다.
- C++과 달리 몇몇 자료 구조 클래스들이 Java의 표준 버전에 포함되어 있다.
- 멀티 쓰레딩은 Java 언어의 표준 기능이다.
- 비록 Java가 접근제어를 위해 c++과 같은 키워드(private, public, protected)를 사용하더라도, 이 키워드들에 대한 해석은 Java와 c++ 사이에 상당한 차이가 있다.
- Java에서는 virtual 키워드가 없다. 정적이 아닌 모든 함수는 언제나 동적 바인딩을 사용한다. 따라서 C++에서 사용되는 것과 같은 목적으로 virtual 키워드가 필요하지 않다.
- Java는 함수가 다중 정의될 수 없으며 정적으로 바인딩될 수 있다고 정의할 때 사용되는 'final'이라는 키워드를 제공한다. (이 경우 컴파일러가 인라인으로 만들 수 있다.)
- 예외처리 시스템의 상세한 구현은 C++의 그것과 크게 다르다.
- C++과 달리 Java는 연산자 다중 정의를 지원하지 않는다. 그러나 +와 += 연산자는 문자열들을 연결하고 그 과정에서 다른 형들을 문자열로 전환하도록 자동으로 다중 정의 된다.
- C++과 같이 Java 어플리케이션은 다른 언어로 작성된 함수를 호출할 수 있다. 이것을 일반적으로 네이티브 메소드라고 한다. 그러나 애플릿은 네이티브 메소드를 호출할 수 없다.
'Kotlin & Java' 카테고리의 다른 글
매개변수를 통해 JVM 메모리 할당과 회수 전략에 대해서 알아보자! (1) | 2024.11.24 |
---|---|
생성자보다 정적 팩터리 메서드를 고려해보자 (0) | 2023.01.11 |
Kotlin 설치 및 실습 환경 구축하기 (0) | 2019.12.24 |
안드로이드 apk 파일 만들기 (0) | 2019.06.20 |