요구 사항에 맞지 않는 다음 답변을 제외하고 답변을 찾지 못했다는 질문이 있습니다.
"제임스 고슬링은 원하지 않았기 때문에"
Java는 인터페이스 (순수 가상 함수 만, 속성 없음)를 가질 수 있지만 클래스 정의와 정확히 같은 것은 아닙니다.
요구 사항에 맞지 않는 다음 답변을 제외하고 답변을 찾지 못했다는 질문이 있습니다.
"제임스 고슬링은 원하지 않았기 때문에"
Java는 인터페이스 (순수 가상 함수 만, 속성 없음)를 가질 수 있지만 클래스 정의와 정확히 같은 것은 아닙니다.
답변:
내 요구 사항을 충족하지 않는 다음 답변 : "James Gosling이 원하지 않기 때문에."
그래도 정답입니다. 언어 디자인 팀 (Gosling, Sheridan, Naughton, 나중에 Bill Joy, Ken Arnold 등)은 헤더가 해결하는 것보다 더 많은 문제를 야기 한다고 결정했습니다 . 그래서 그들은 그것들을 디자인하고 그것들이 필요없이 완벽하게 유용한 언어를 만들 수 있음을 보여주었습니다.
Java로 작성된 소스 코드는 간단합니다. 전 처리기, #define 및 관련 기능, typedef 및 해당 기능이 없으며 더 이상 헤더 파일이 필요하지 않습니다. Java 언어 소스 파일은 헤더 파일 대신 다른 클래스 및 해당 메소드의 정의를 제공합니다.
중복 정의, 파일 동기화, 충돌 정의, 숨겨진 정의 유지-헤더가 없기 때문에 Java에서 발생하지 않습니다. 베어 클래스 정의를 보려면 .java 파일에서 직접 클래스 정의를 생성 할 수 있습니다. 예를 들어 대부분의 IDE는 사이드 바의 클래스 구조를 보여줍니다.
C ++에서는 클래스 정의와 선언을 별도의 파일로 가질 필요가 없습니다. 그것은 적어도 C 일에 다시 코드의 단일 맨 아래 스캔으로 구문 분석을 수행 할 수 있음을 의미합니다. 랜덤 액세스 스토리지가없는 머신에서 이것은 대단했습니다!
헤더를 사용하면 소스 코드를 공개하지 않고도 헤더를 제공하여 인터페이스를 코드 라이브러리에 공개 할 수 있습니다. 불행히도 C ++에서는 개인 데이터 멤버를 공개해야하므로 pimpl 의 공포와 같은 솔루션으로 이어졌습니다 .
모든 것이 데이터베이스 유형 구조에 저장되고 파일이 없지만 포착되지 않은 C ++ 환경을 만들려고 시도했습니다.
모든 언어에서-최종 바이너리 코드를 생성하기위한 두 단계-컴파일 및 링크 (물론로드는 있지만 여기에는 큰 영향을 미치지 않음)가 있습니다. 컴파일 할 때 적절한 위치 에 후크 (호출 할 함수의 스펙) 만 넣으면 됩니다. 링커 는 실제 코드를 모두 사용할 수있을 때 실제로 연결 됩니다. 지금까지 C ++과 Java 사이에는 차이가 없습니다.
가 이다 C ++는 선언과 정의 분리를 할 필요가 있지만,. 구현을 헤더로 유지하고 헤더 파일이 변경되면 이와 연결된 코드를 다시 컴파일해야합니다. 정의가 별도의 파일에있는 경우 코드는 다시 연결하기 만하면됩니다.
C ++에는 정적 링크를 위한 옵션이 있는데, 이는 호출하는 응용 프로그램과 함께 오브젝트 코드가 고정됨을 의미합니다. C와 C ++ 둘 다에서 헤더 파일에 프로그래밍을하거나 #include를 수행하는 것은 유효하지 않습니다. 단지이 오브젝트 파일들과의 링크가 어떻게 발생하는지 고민해야한다는 것을 의미합니다.
Java의 상황은 매우 다릅니다. 각 클래스 파일은 .class 파일로 컴파일됩니다. 실제로 .class 파일에서 헤더 섹션으로 제공되는 호출자 클래스 함수 컴파일이 필요합니다. 그러나 Java에서 최종 연결은 클래스 파일의 바이트 코드 사양이 지정된 경우에만 런타임 (가상 머신) 내에서만 수행됩니다.
포함해야 할 한 가지 좋은 이유는 재사용하려는 코드 (예 : 공통 정의)를 주어진 프로젝트에 특정한 코드와 분리하는 것입니다. Java는 파일 당 하나의 클래스 또는 인터페이스 만 지정하기를 원하며 포함 된 헤더의 필요성이 줄어 듭니다. 이미 공유 파트를 자체 파일에 저장하기 때문입니다.
또한 컴파일러와 빌드 시스템은 사전 컴파일 된 헤더를 캐시하여 두 번 이상 구문 분석하지 않도록 할 수 있습니다.