[JAVA] 1. 자바 시작

7 분 소요

1. 자바의 출현

자바는 애초 일반 컴퓨터나 인터넷 환경에서 사용될 목적으로 설계된 것이 아니다. 1991년에 선마이크로시스템스(SUN Microsystems)는 엔지니어 제임스 고슬링을 중심으로 그린 프로젝트라는 이름으로 가전제품에 사용할 소프트웨어를 개발하기 시작했다.

기존의 프로그래밍 언어는 플랫폼간에 호환성이 없었고, 특히 매우 다양한 플랫폼을 갖는 가전제품을 위해 플랫폼에 독립적인 언어의 필요성이 대두 되었다. 또한 가전제품에 들어가는 제어장치는 매우 적은 양의 메모리를 사용해야 하므로 새로운 언어는 이러한 내장형 시스템의 메모리 요구사항을 충족해야 했다.

이에 선마이크로시스템스는 플랫폼 독립적이며 메모리 사용량이 적은 새로운 언어와 실행 체계를 개발하였고 처음에 그 이름은 오크(OAK)라고 지었다. 그후 인터넷 환경에 적합하도록 발전시키면서 1995년 SunWorld 95에서 자바(JAVA)라는 이름으로 새로운 기술을 발표했다.

2009년에 오라클사에서 선마이크로시스템스를 인수함으로써 현재는 오라클에서 자바를 제공하고 있다.

2. WORA(Write Once Run Anywhere)

c/c++ 등 자바 이전의 프로그래밍 언어들의 컴파일러는 기계어 코드로 변환할 때 프로그램이 실행될 대상 컴퓨터의 CPU와 운영체제에 종속적인 코드로 변환한다. 그래서 이 코드를 다른 플랫폼(다른 cpu나 운영체제)에서 실행하려면 다시 컴파일하든지 플랫폼에 맞도록 코드를 수정해야 한다.

플랫폼 종속성

플랫폼 : 하드웨어 플랫폼 + 운영체제 플랫폼

플랫폼 종속성 : 모든 플랫폼에서 호환성을 갖는 프로그래밍 언어로 한번 작성된 코드는 모든 플랫폼에서 바로 실행되는 자바

프로그램의 플랫폼 호환성 없는 이유 : 기계어가 CPU마다 다름. 운영체제마다 API가 다름. 운영체제마다 실행파일 형식이 다름.

ex) 소스프로그램이 Intel CPU에 리눅스가 설치된 환경에서 실행되도록 컴파일 되었다면, 그 기계어 코드는 동일한 Intel CPU에 윈도우가 설치된 컴퓨터에서는 실행되지 않는다.

플랫폼 독립성

자바의 플랫폼 독립성을 가능하게 하는 것은 자바 가상 기계와 바이트 코드 때문이다.

운영체제나 하드웨어에 상관없이 자바 가상 기계(JVM)가 있으면 어디서나 자바로 작성된 프로그램에 동일한 실행 환경을 제공하며 동일한 실행 결과를 기대할 수 있다.

바이트 코드 : 바이트 코드는 자바 가상 기계에서만 실행되는 기계어. 어떤 CPU와도 관계없는 바이너리 코드이다. 자바 컴파일러는 자바 소스 프로그램을 컴파일하여 바이트 코드로 된 클래스 파일을 생성한다. 이 클래스 파일은 컴퓨터의 CPU에 의해 직접 실행되지 않고, 자바 가상 기계가 인터프리터 방식으로 실행시킨다. 이 클래스 파일은 어떤 운영체제를 탑재하든 CPU으 종류가 무엇이든, PC이든 노트북이든 대형 컴퓨터이든 상관없이 자바 가상 기계만 있으면, 바로 실행 가능하다.

자바 가상 기계 : 자바 가상 기계는 소프트웨어로서, 서로 다른 플랫폼에서 자바 프로그램이 실행되는 동일한 환경을 제공한다. 하지만 자바 가상 기계는 플랫폼마다 서로 다르게 작성되어 배포되며 플랫폼 종속적이다. 자바 가상기계는 자바 개발사인 오라클은 물론이고 IBM, 마이크로소프트 등 다양한 회사에서 제작 공급되고 있다. 자바 프로그램은 어떤 회사의 자바 가상 기계가 설치되어 있든지 상관없이 정상적으로 실행된다.

자바는 웹 브라우저, 분산 환경의 지원 등으로 네트워크에 연결된 어느 클라이언트에서도 실행이 가능. 자바 프로그램은 어디서든 한 번 작성하면, 다시 컴파일하거나 수정하지 않고, 어떤 하드웨어에서나 운영체제에서도 실행시킬 수 있다. 이를 WORA라고 한다.

3. 자바의 실행 환경

C/C++ 프로그램의 개발 및 실행

  1. 개발자는 보통 여러개의 소스 파일에 나누어 C/C++ 프로그램을 작성한다.
  2. 각 소스 프로그램을 컴파일하여 목적파일(.obj)을 생성
  3. 링크과정을 통해 목적파일들을 연결하여 하나의 실행파일(.exe)(기계어)(바이너리 실행 파일)을 만든다. 링크과정에서 C/C++프로그램에서 호출한 C/C++ 라이브러리 함수들을 찾고 이 함수들의 목적 코드를 라이브러리 파일에서 꺼내 .exe 파일에 삽입.
  • 링크의 과정을 통해 만들어진 .exe 실행 파일에는 실행에 필요한 모든 코드가 다 들어 있어 .exe 파일만 있으면 실행에 아무 문제가 없다.
  • 하지만, exe파일이 매우 큰 경우 적은 용량의 메모리를 가진 컴퓨터에서는 처음부터 실행조차 할 수 없는 문제점이 있다.

자바 프로그램의 개발 및 실행

  1. 자바 프로그램도 보통 여러 소스 파일(.java)로 나누어 작성.
  2. 자바 컴파일러는 각 소스 파일을 컴파일하여 클래스 파일(.class)(바이트 코드)을 생성한다. 자바에서는 이들을 하나의 실행파일로 뭉치는 링크의 과정이 없다.
  3. 개발자는 여러 클래스 파일 중 하나를 지정하여 실행을 시작시키면, 자바 가상 기계는 그 클래스 파일을 메모리에 로딩하고 실행. 실행 도중 다른 클래스 파일이나 자바 API의 클래스 파일이 필요하면 자바 가상 기계는 그 때 그 클래스 파일을 로딩하고 실행한다.
  • 처음부터 모든 클래스 파일을 로딩해놓을 필요 없이 당장 실행할 클래스 파일만 로딩하여 실행할 수 있어 적은양의 메모리를 가진 컴퓨터에서 얼마든지 큰 자바 응용프로그램을 실행 가능. 이것이 바로 플랫폼 독립성과 함께 달성하고자 하는 자바 언어의 본질이다.
  • 다만 메모리가 충분한 PC에서는 실행 중에 클래스 로딩으로 인한 시간을 줄이기 위해, 사용자 클래스 파일과 필요한 자바 클래스 파일을 미리 로딩해 둔다.

명령 프롬프트에서 자바 개발

자바 소스 컴파일 javac Hello.java      // java.class 파일 생성

자바 응용프로그램 실행 java Hello

4. 개발도구와 자바 플랫폼

JDK와 JRE

JDK(Java Development kit)는 자바 개발자에게 무료로 배포하는 소프트웨어로 자바 컴파일러 등의 개발 도구와 JRE(Java Runtime Environment)로 구성된다. JRE는 자바 응용프로그램이 실행될 때 필요한 소프트웨어들로 개발자가 활용할 수 있는 자바 API(이미 컴파일된 다양한 클래스 라이브러리)와 자바 가상 기계를 포함한다. 개발자가 아닌 일반 사용자의 경우 JRE만 필요하며, JRE만 따로 다운받을 수 있다.

jdk

Java SE의 JDK 구조

자바의 배포판

오라클은 응용데 따라 크고 작은 여러 종류의 JDK를 제공하는데 이를 배포판이라고 부른다. 배포판의 종류는 10여가지가 있지만 대표적인 배포판은 다음과 같다.

  • JAVA SE(Standard Edition) : 자바 표준 배포판으로서, 데스크톱 응용프로그램과 서버 응용프로그램을 개발하기 위한 JDK.
  • JAVA ME(Micro Edition) : 모바일용 배포판으로 Iot, Tv, 블루레이, 셋톱박스 등 작은 하드웨어 자원을 갖는 장치에 적합한 JDK이다. 스마트폰이나 고해상도 TV등은 안드로이드에 자리를 내주고 있어 존폐가 위태롭다.
  • JAVA EE(Enterprise Edition) : 기업용 배포판으로 자바를 이용한 다중 사용자, 대규모 기업 응용프로그램 개발을 위한 JDK이다.

java9 부터 시작된 모듈 프로그래밍

2017년 9월 21일 java9가 나왔고 모듈화가 이루어졌다. 모듈이란 자바 패키지들과 이미지, XML 파일 등의 자원들을 묶은 단위이다. 개발자들이 호출하는 Java SE의 모든 클래스들을 모듈들로 재설계하고 재정리하였다. ,JDK를 설치하면 jmods 디렉터리 내에 담긴 모듈을 볼 수 있다.

자바 모듈화의 목적은 세밀한 모듈화를 통해 자바 응용프로그램이 실행되는데 필요없는 모듈을 배제하여 작은 크기로 배포할 수 있도록 함에 있다.

자바 API

자바 API(Application Programming Interface)는 개발자들이 사용하도록 미리 만들어 놓은 유용한 자바 클래스들의 집합이다. Java9 부터는 모듈화 정책에 따라 모든 자바 API의 클래스들은 서로 관련된 클래스끼리 패키지로 묶고, 다시 패키지들을 모듈로 묶어 계층화해 놓았다. 자바 API는 워낙 광범위해 개발자는 이 API를 이용하여 쉽고 빠르게 자바 프로그램을 개발할 수 있다.

5. 자바 언어의 활용

프로그래밍 언어의 인기 순위를 매기는 TIOBE 인덱스에 따르면 자바는 다양한 분야에서 가장 많이 사용되는 언어이다.

데스크톱 응용프로그램 : PC 등의 데스크톱 컴퓨터에 실행되는 자바 응용프로그램. 이클립스도 자바 언어로 개발된 데스크톱 응용프로그램. 자바 실행 환경(JRE)이 설치된 어떤 컴퓨터에서도 실행되며 다른 응용프로그램의 도움 없이 단독으로 실행된다.

자바 서블릿(servlet) 응용프로그램 : 서블릿은 웹 서버에서 실행되는 서버용 자바 프로그램으로 쇼핑몰이나 온라인 뱅킹 등을 구현할 때 쓰인다. 서블릿은 웹 브라우저의 요청에 따라 웹 서버에 탑재된 데이터베이스를 검색하거나 요청받은 내용을 처리하고 웹 페이지로 만들어 웹 브라우저에 응답하는 방식으로 작동한다. 서블릿ㅇ른 웹 브라우저상에서 실행되는 자바 스크립트 코드와 통신하기도 한다. 서블릿은 사용자 인터페이스를 필요로 하지 않으며 웹 서버에 의해 실행이 제어된다.

안드로이드(Android) 응용프로그램 : 구글의 주도로 여러 모바일 회사가 모여 구성한 OHA(Open Handset Alliance)에서 개발한 무료 모바일 플랫폼을 안드로이드라고 한다. 개발 언어는 자바를 사용하나 오라클 사의 라이선서를 피하기 위해 별도의 개발 도구를 개발했으며, Dalvik이라는 새로운 자바 가상 기계를 개발. 또한 오라클의 바이트 코드의 효율을 개선한 바이트 코드 체계를 개발했으며, 기존 오라클의 바이트 코드와는 호완성이 없어 변환이 필요하다.

6. 자바 언어의 특징

  • 플랫폼 독립성 자바는 하드웨어, 운영체제 등 플랫폼에 종속되지 않는 독립적인 바이트 코드로 컴파일되며 자바 가상 기계만 있으면 하드웨어/운영체제를 막론하고 자바 프로그램의 실행이 가능하다.

  • 객체 지향 자바는 객체지향 언어로 캡슐화, 상속, 다형성을 지원한다.

  • 클래스로 캡슐화 자바는 객체 지향 언어의 캡슐화 원칙을 철저히 지켜, 변수나 메소드는 반드시 클래스 내에 구현하도록 한다. 클래스에 속하지 않은 변수나 메소드는 있을 수 없다. 자바는 클래스 안에 새로운 클래스, 즉 내부 클래스를 만들 수 있다.

  • 소스와 클래스 파일 클래스파일에는 반드시 하나의 자바 클래스만 들어 있다. 그러므로 하나의 자바 소스 파일에 여러개의 클래스를 작성한 경우, 컴파일하면 클래스마다 별도의 클래스 파일이 생성된다.

public class A{

}
class B{

}
class C{
  class D{

  }
}

위 소스코드는 A.java로 컴파일을 하면 A.class, B.class, C.class, D.class 4개의 클래스 파일이 생성된다.

하나의 자바 소스 파일에 작성된 클래스 중 오직 한 클래스만 public으로 선언할 수 있다. 소스 파일 내에 public으로 선언된 클래스의 이름으로 자바 소스 파일을 저장해야 한다.

  • 실행 코드 배포 자바 응용프로그램은 한 개의 클래스 파일 또는 다수의 클래스 파일로 구성. 다수의 클래스 파일을 jar파일 형태로 압축하여 배포하거나 실행 가능.
  • 패키지 서로 관련 있는 클래스는 패키지로 묶어 관리. 패키지는 파일 시스템의 폴더와 같은 개념으로 java.lang.System 클래스는 java\lang 폴더의 System.class 파일을 나타낸다. 여기서 java.lang을 패키지라고 한다.

  • 멀티스레드 하나의 자바 프로그램이 다수의 작업을 처리할 수 있도록 다수의 스레드가 동시에 실행할 수 있는 환경을 지원한다. C/C++ 등 많은 언어들은 자체적으로 멀티스레드를 지원하지 않아 운영체제의 도움을 받는다. 그러나 자바는 운영체제의 도움 없이 멀티스레드 프로그래밍이 가능하기 때문에, 멀티스레드를 지원하지 않는 운영체제에서도 자바를 이용하면 멀티스레드 프로그램을 개발할 수 있다.
  • 가비지 컬렉션 자바 언어는 메모리를 할당받는 기능은 있지만, 메모리를 반환하는 기능은 없다. 프로그램의 부담을 대폭 줄여준다. 프로그램 내에 사용되지 않는 메모리(가비지)는 자바 가상 기계의 가비지 컬렉션 기능에 의헤 자동으로 회수된다.
  • 실시간 응용 시스템에 부적합 자바 응용프로그램은 실행 도중 예측할 수 없는 시점에 가비지 컬렉션이 실행되므로, 프로그램 실행이 일시적으로 중단된다. 이런 문제로 인해 일정시간 내에 반드시 실행결과를 내야만 하는 실시간 시스템에는 자바 언어가 적합하지 않다.
  • 자바 프로그램은 안전하다 자바 언어는 타입체크가 매우 엄격하며, C/C++와 달리 메모리의 물리적 주소를 사용하는 포인터 개념이 없기 때문에, 잘못된 자바 프로그램으로 인해 컴퓨터 시스템이 중단되는 일이 없다.
  • 프로그램 작성이 쉽다 자바 언어는 C/C++에 있는 포인터 개념이 없기 때문에 프로그램 작성에 부담이 적다. 또한 프로그램 개발을 쉽게 도와주는 다양한 라이브러리와 스윙 등 강력한 GUI 라이브러리를 지원하므로 프로그램 작성이 빠르고 쉽다.
  • 실행속도를 개선하기 위해 JIT 컴파일러가 사용된다. 자바는 자바 가상 기계가 인터프리터 방식으로 바이트 코드를 실행하므로 일반적으로 C/C++로 작성된 프로그램보다 실행이 느리다고 알려져 있지만, 최근에는 실행하는 도중 자바 프로그램을 해당 CPU의 기계어 코드로 컴파일하고 CPU가 바로 기계어를 실행 하도록 하는 JIT(Just In Time) 컴파일링 기법을 이용하므로, 실행 성능이 C/C++와 거의 비슷하도록 개선되었다.

태그:

카테고리:

업데이트: