Java의 탄생
자바는 1990년 Sun Microsystem에서 탄생했습니다. Sun Microsystem은 토스터, 전자 레인지 및 양방향 TV 시스템과 같은 임베디드 가전 제품에 프로그래밍 언어가 필요하다고 판단하였고, Reliability(안전성)은 해당 언어의 주요 목적중 하나였습니다.
Reliability가 주요한 목적이었던 이유는 같은 모델의 TV가 수 백만 대 제조되어 판매되었는데, 오류가 있는 것으로 판매되면 상당한 비용이 발생할 것이기 때문입니다. 때문에 Reliability는 매우 중요한 특성이었습니다.
C 및 C++을 고려했지만, 전자 기기용 소프트웨어를 개발하는 데는 부족하다고 판단했습니다. C는 상대적으로 컴퓨터 자원을 적게 소모하지만, 객체 지향 프로그래밍을 지원하지 않았고, C++은 객체 지향 프로그래밍을 지원하였지만 부분적으로 절차적 프로그래밍을 지원하기 때문에 너무 크고 복잡하다고 판단했습니다. 그래서 Java라는 새로운 언어가 설계됩니다.
Java는 C++이 제공하는 것보다 더 단순하고 Reliability를 제공한다는 목표에 따라 설계되었습니다. 처음 Java 설계는 전자 기기 소프트웨어를 위한 것이었지만, 초기에는 어떠한 제품도 자바를 사용하지 않았습니다. 1993년 월드 와이드 웹(WWW)이 널리 사용되면서, 그래픽 기반 브라우저 덕분에 자바는 웹 프로그래밍에 유용한 도구로 판명될 수 있었습니다. 특히 웹 브라우저에서 interpreted되고 결과가 웹 문서에 포함되어 보일 수 있는, 상대적으로 작은 자바 프로그램인 ‘Java applets’는 1990년대 중 후반 급속히 대중화됩니다. 자바가 인기를 끌던 처음 몇 년 동안, 웹은 가장 일반적인 응용 프로그램이었습니다.
Java 디자인팀은 과거 ‘UNIX emacs editor’와 ‘NeWS windowing system’을 설계한 ‘제임스 고슬링’ 이었습니다.
Java의 디자인
Java는 C++을 기반으로 하지만 작고 단순하며 안정적(Reliability)으로 설계되었습니다. C++과 마찬가지로 Java에도 클래스와 Primitive types가 있습니다.
(C++과 공통점↖, C++및 기존 언어와 Java의 차이점 ↘)
Java에서 배열은 미리 정의된 클래스의 인스턴스이지만, C++에서는 사용자가 배열의 wrapper class를 작성하여 Java에서 암시적인 인덱스 범위 검사와 같은 기능을 추가합니다. Java에는 포인터가 없지만 Reference Types은 포인터의 일부 기능을 제공합니다. 이러한 Reference Types는 클래스 인스턴스를 가리키는 데 사용됩니다.
모든 인스턴스는 힙에 할당됩니다. 필요한 경우 참조(Reference)는 항상 암시적으로 참조 해제됩니다. Java는 ‘boolean’이라는 primitive Boolean type을 가지고 있고, 주로 제어 명령문(if, while)의 제어 표현식에 사용됩니다. C 및 C++과 달리, 수식은 제어 표현식에 사용할 수 없습니다.
Java와 C++을 포함한 객체 지향 프로그래밍을 지원하는 이전 언어들의 차이점중 하나는 Java에서 독립형 서브 프로그램을 작성할 수 없는 것입니다. 모든 Java 서브 프로그램은 메소드이며, 클래스에서 정의됩니다. 또한 메서드는 클래스 또는 객체를 통해서만 호출 할 수 있습니다. C++은 프로시저와 객체 지향 프로그래밍을 모두 지원하지만, Java는 객체 지향 프로그래밍만 지원합니다.
C++과 Java의 또 다른 중요한 차이점은 C++ 클래스 정의에서 다중 상속을 직접 지원하는 점입니다. Java는 클래스의 단일 상속만 지원하지만 '인터페이스' 상속을 사용하면 다중 상속의 이점을 얻을 수 있습니다. Java에서 사용되지 않은 C++ 구문중에는 '구조체'와 'union'이 있습니다.
Java는 synchronized modifier를 통해 상대적으로 간단한 형태의 동시성 제어를 포함합니다. 이것은 메소드나 블록(중괄화에 묶여있는 것.)에서 표현됩니다. 두 경우 모두 lock이 부여되고, lock은 상호 배타적 액세스 또는 실행을 보장합니다.
Java는 '가비지 콜렉션(garbage collection)'이라고 불리는, 오브젝트가 저장된 스토리지를 암시적으로 할당 해제하는 방법을 사용합니다. 이를 통해 프로그래머는 더 이상 필요하지 않는 오브젝트를 명시적으로 삭제할 필요가 없습니다. 가비지 콜렉션이 없는 언어로 작성된 프로그램은 종종 메모리 유수로 고생하는 경우가 있습니다. 이는 메모리가 할당되었지만, 사용후 해제되지 않은 것을 의미합니다. 이것의 문제점은 사용 가능한 스토리지의 고갈로 이어질 수 있다는 점입니다.
C및 C++과 달리 Java는 '더 작은 유형'에서 '더 큰 유형'으로 할당 타입의 강제화(assignment type coercions) 기능이 포함됩니다.
예를들어
double a ;
a = 1;
위 문장이 가능합니다.
Java는 C++에서 안전하지 않은 기능을 보완하고 추가적인 기능을 제공합니다. 예를 들어 배열 접근시에 인덱스 범위 검사를 합니다. 또한 동시성의 추가로 GUI, DB 액세스 및 네트워킹을 위한 클래스 라이브러리처럼 언어로 작성될 수 있는 응용 프로그램의 범위를 향상시킵니다.
Java의 이식성(portability, 다른 환경에서 같은 소프트웨어를 사용할 수 있는 것.): 모든 언어는 중간 단계의 언어로 변환되고(기계어로 변환되기 전 언어. C언어와 어셈블리어, .Net과 CIL), 해당 중간 단계 언어를 위한 가상머신이 있는 모든 플랫폼에서 실행될 수 있습니다. 이러한 종류의 이식성은 변환 비용이 추가적으로 발생하고, 기존에 기계 코드를 실행하는 비용보다 훨씬 높았습니다. JVM(자바 가상머신)의 초기 자바 인터프리터 버전은 컴파일 된 C 프로그램보다 10배 더 느렸다. 그러나 현재의 Java 프로그램은 JIT(Just-In-Time) 컴파일러를 사용하여 실행되기 전에 기계 코드로 변환되는 방식으로 속도를 개선했습니다.
결론: Java는 C ++의 많은 기능을 제공하지만 더 간단하고 안전한 언어로 대체 할 수 있는 대안을 제공합니다.
출처
CONCEPTS OF PROGRAMMING LANGUAGES 10th EDITION
'자바' 카테고리의 다른 글
[Java] 자바의 제어문2, 조건문 (2) | 2020.12.12 |
---|---|
[Java] 자바의 제어문1, 반복문 (0) | 2020.12.12 |
[Java] 람다(Lambda)와 java.util.function패키지 (0) | 2020.04.17 |
[Java] 람다(Lambda) (0) | 2020.04.14 |
[Java] super - 조상클래스 참조하기 (0) | 2020.04.06 |
댓글