JAVA

JAVA

유혁스쿨 2021. 1. 20. 17:36
728x90
반응형

자바의 역사

 자바는 현재 일반 컴퓨터나 인터넷 환경에서 사용되고 있으나 이는 자바가 개발된 주 된 사용 목적이 아니였다.

1991년 선 마이크로시스템즈의 제임스 고슬링에 의해 그린 프로젝트(가전 제품에 사용되는) 라는 소프트웨어를 개발하기 시작했다.

 기존 프로그래밍 언어로 작성된 프로그램은 플랫폼 간에 호환성이 없었기 때문에 사용자 컴퓨터의 플랫폼에 따라 소스를 컴파일 하거나 프로그램을 재작성 해야 했다.

 가전제품은 특히나 플랫폼이 매우 다양했기 때문에 플랫폼에 독립적인 언어의 필요성이 있었으며, 가전제품과 같은 내장형 시스템은 매우 적은 양의 메모리를 요구하는 제어장치로 인해 이에 맞게끔 플랫폼에 독립적이며 메모리 사용량이 적은 OAK 라는 이름의 언어를 개발하였다. 

 이후 인터넷과 웹이 발전하면서 다양한 플랫폼에서 실행할수 있는 웹 브라우저 또한 플랫폼의 독립적인 특성을 필요로 하기 때문에 인터넷 환경에 맞도록 OAK를 발전시키게 되었는데 이렇게 탄생한 언어가 바로 자바(JAVA)이다.

 선 마이크로시스템즈에서 제공되던 자바는 데이터베이스 회사로 알려진 오라클 사에서 선 마이크로시스템즈를 2009년에 인수하게되어 2010년부터는 오라클에서 자바를 제공하고 있다. 

 

플랫폼에 독립적인 자바

 자바 이전의 C나 C++ 등의 프로그래밍 언어의 컴파일러는 컴파일(기계어 코드로 변환)할 때 해당 프로그램이 실행되는 PC의 CPU와 운영체제에 종속적인 코드(전용)로 변환된다.

 예를들면 소스 프로그램을 Intel 사의 cpu가 탑재된 PC에 맥 운영체제가 설치된 환경에서 실행되도록 컴파일 된 기계어가 있다고 가정했을 때 AMD사의 cpu가 탑재된 맥 운영체제에서는 이 컴파일된 프로그램의 실행이 불가능하며  Intel사의 cpu가 탑재된 윈도우 운영체제에서도 실행이 불가능하다.

 즉, 기계어가 CPU마다 기계어가 다르며 운영체제마다 API가 다르고 실행파일 형식이 다르기 때문에 플랫폼에 호환성이 없게되는것이다. 

이러한 특징을 플랫폼에 종속적 이라고 하며 플랫폼 종속성 이라고 정의한다.

 자바는 기존 프로그래밍 언어가 가진 플랫폼 종속성을 극복하기 위해 개발 단계에서 부터 플랫폼에 독립적으로 설계되었으며, 이것은  자바 가상머신인 JVM에 의해 자바로 작성된 프로그램은 운영체제와 하드웨어에 영향을 받지 않는 동일한 실행 환경을 제공하여 어떠한 플랫폼에서든 동일한 실행 결과가 이루어진다. 

 즉, 한번 작성한 프로그램은 어떠한 환경에서도 동일하게 프로그램을 실행할 수 있다.

 

자바의 WORA 적 특징 

 Write Once Run Anywhere 어디에서나 한번만 실행 즉, 개발자가 자바 응용프로그램을 작성하면 플랫폼에 맞도록 수정 할 필요 없이 서로 다른 플랫폼을 가진 컴퓨터에 바로 실행이 가능하다.

 즉, AMD CPU의 맥에서 프로그램을 개발하더라도 INTEL CPU의 윈도우나 리눅스 플랫폼에서 실행이 가능하다.

 

자바의 실행환경

자바가 WORA적인 특징을 가지는 이유는 바로 바이트코드와 자바 가상 머신인 JVM 때문이다.

 

바이너리 코드

바이너리코드는 컴퓨터가 인식할 수 있는 0과 1로 구성된 이진코드를 의미한다.

 

바이트 코드

 자바의 컴파일러가 자바 소스프로그램을 컴파일 한 기계어로서, 플랫폼에 대한 종속성이 없고 자바 가상 머신에서 실행되는 바이너리 코드이다.

 바이트 코드는 컴퓨터 상의 cpu에 의해 직접 실행되지 않으며, 자바 가상머신이 인터프리터 방식으로 해석하여 플랫폼에서 실행시킨다. (인터프리터란 프로그래밍 언어의 소스 코드를 바로 실행하는 컴퓨터 프로그램 또는 환경을 말한다.)

쉽게 말해 자바 가상머신에서 실행되는 기계어 정도로 정의할 수 있다.

 

JRE(Java Runtime Environment) - 자바 실행 환경

JVM이 자바 프로그램을 동작 시킬 때 필요한 라이브러리 파일들과 기타 파일들을 가지고 있다.

 

JDK(Java Development Kit) - 자바 개발 환경

자바 응용 프로그램의 개발에 필요한 컴파일러 및 기타 도구, JRE, 클래스 라이브러리의 소스 및 자바 응용프로그램 샘플 소스 등을 포함 한다.

 또 개발자가 바이트코드를 직접 볼 수 있도록 이미 컴파일된 자바 클래스 파일을 디 어셈블(Diassemble) 즉, 기계어를 어셈블리어로 변환하는 도구를 제공한다.

 

디 어셈블

디 어셈블은 컴파일 된 클래스 파일의 내부 기본 구조와 역 어셈블 코드 즉, JVM의 바이너리 코드만을 출력하는데 이것으로 특정 클래스 내부의 상수와 함수들의 목록을 간단히 볼 수 있다.

 

JVM(Java Virtual Machine) - 자바 가상 머신

 자바 가상 머신은 서로 다른 플랫폼에서 동일한 실행 환경을 제공하지만 각 플랫폼에 맞게 이식되어야 하므로 즉, 실행 되는 운영체제에 맞게 컴파일 되어야 하므로 플랫폼에 종속적인 특성을 가진다.

 각 운영체제 별로 프로그램을 실행하고 관리하는법이 다르기 때문에 자바 프로그램을 개발할 때 운영체제 별로 개발하는 것이 아닌 운영체제와 자바 프로그램의 중간에서 중계 역할을 하여 여러 운영체제 에서 동일한 실행 결과가 나오도록 해주도록 설계된 것이 바로 JVM이다.

 자바 프로그램을 실행하면 자바 언어로 작성된 코드를 기계어로 번역해서 실행해야 하게 되는데 각 운영체제가 이해하는 기계어가 제각각 다르기 때문에 JVM은 운영체제에 맞게 설치되어야 한다 이 때문에 플랫폼에 종속적이라 하는것이다.

 즉, 자바를 사용하여 프로그래밍을 하게되면 컴파일이 되며 컴파일 된 바이너리 코드는 서로 다른 플랫폼 별로 공통이지만 자바 프로그램을 실행할때에는 컴파일 된 바이너리 코드가 각 운영체제에 맞는 언어로 변환되기 때문에 운영체제에 맞는 JVM이 설치되어 있어야 하는것이다. (JVM안에 들어있는 JRE;자바실행환경 영향)

JVM은 컴파일되어 생성된 자바 클래스파일(.class) 내부의 바이트 코드를 하나씩 실행하며 프로그램을 실행하는 도중, JDK 라이브러리에 들어 있는 다른 클래스 파일이나 사용자가 작성한 다른 클래스 파일을 필요로 하면 그때 필요한 클래스 파일을 로딩하고 실행한다.

 JVM은 대부분 실행중에 JDK 라이브러리 로딩으로 인한 지연시간을 줄이기 위해 자바 프로그램 실행 시작 전인 JVM이 시작할 때 JDK 라이브러리를 미리 로딩해둔다.

 


자바의 특징

 

1. 이식성 높은 언어

 서로 다른 실행 환경을 가진 시스템 간에 프로그램을 옮겨서 실행할 수 있는 것을 이식성이라 하는데, 자바언어로 개발된 프로그램은 자바 실행환경인 JRE가 설치되어 있는 운영체제 라면 프로그램 소스파일 수정없이, 즉 재컴파일 과정 없이 실행이 가능하다.

 

2. 객체 지향 언어

 현실 세계에서 부품에 해당하는 '객체' 들을 먼저 만든 후, 만들어진 객체들을 하나씩 조립하고 연결하여 전체적인 프로그램을 완성하는 기법을 객체 지향 프로그래밍 (OOP; Object Oriented Programming) 이라고 하며 자바가 바로 객체지향 프로그램이 언어이다.

 먼저 객체를 만들기 위한 설계도인 클래스를 작성하고 이 클래스를 객체화 한 후 각각의 객체를 연결하여 목적에 맞는 프로그램을 만든다. 자바는 어떠한 프로그램이라도 객체를 만들어 사용하며 애초에 객체지향으로 설계된 언어이기에 객체 지향 언어의 기능적 특징인 캡슐화, 상속, 다형성 등의 기능을 지원한다.

 

3. 함수적 스타일의 코딩 지원

대용량 데이터의 병렬 처리와 이벤트 지향 프로그래밍을 위해 적합한 장점을 가진 함수적 프로그래밍을 위해 자바 8부터 람다식을 지원하며, 람다식을 활용하면 컬렉션의 요소를 필터링, 매핑, 집계 처리하는데 쉬워지며 코드가 매우 간결해지는 장점이 있다.

 

4. 메모리를 자동으로 관리

 C++은 생성된 객체를 제거하여 메모리 관리를 해주지 않으면 갑자기 다운되는 현상을 겪는 등 프로그램이 불완전해 지는데 이것을 개발자가 직접 코드를 통해 제거해야 한다.

 자바는 개발자가 메모리에 직접 접근할 수 없도록 되어있기 때문에 객체 생성시 자동으로 메모리 영역을 찾아 할당하고, 사용 완료시에는 가비지컬렉터라는 쓰레기 수집기가 실행되어 사용하지 않는 객체를 자동으로 제거시켜 자바가 메모리를 직접 관리하도록 설계되어 있다.

 이러한 자바의 자동 메모리 관리는 개발자가 코드작성에 집중할 수 있도록 도와준다.

 

5. 다양한 어플리캐이션 개발

 자바는 윈도우, 리눅스, 유닉스, 맥 등 다양한 운영체제 플랫폼에서 실행되는 프로그램을 개발할 수 있다.

단순한 콘솔프로그램, 클라이언트용 윈도우 어플리캐이션, 서버용 웹 어플리캐이션, 모바일 안드로이드 앱 등 많은 영역에서 사용할 수 있는 프로그램의 개발이 가능하다.

 

6. 멀티 스레드 구현

 하나의 프로그램이 동시에 여러 작업을 처리할 경우와 대용량 작업을 빨리 처리하기 위해 작업들을 분리하여 병렬처리하기 위해서 멀티 스레드 프로그래밍을 필요로 한다.

자바는 스레드 생성및 제어에 대한 라이브러리를 제공하기 때문에 운영체제와 상관없이 쉬운 멀티스레드 구현이 가능하다

 

7. 동적 로딩 지원

 자바에서의 동적 로딩이란 객체가 필요한 시점에 맞게 해당 객체의 클래스를 로딩하여 객체를 생성하는것을 말한다.

이것은 프로그램이 실행될때 내부적으로 연결되어 있는 모든 객체를 생성하지 않고 필요한 객체만 로딩하는것 으로 쉽게 정의할 수 있으며, 개발 완료 후 유지보수 시에 해당 클래스만 수정하면 되기 때문에 전체적으로 컴파일 할 필요가 없어 유지보수 차원에서 쉽고 빠른 장점을 갖게된다.

 

8. 방대한 오픈소스 라이브러리

오픈 소스 기반의 자바언어는 고급기능을 구현하는 코드를 직접 작성할 경우 많은 시간과 노력과 오류 등의 안정성을 보장할수 없는 등의 어려움이 따르게 되나, 이러한 검증된 오픈소스 라이브러리를 활용하면 개발 기간 단축에 도움을 주어 높은 생산성을 보장해준다.

728x90
반응형