본문으로 바로가기

Java Basic Architecture

category Study/JVM 2013.04.11 03:12

Java의 철학

  • 객체 지향 방법론을 사용해야 한다
  • 같은 프로그램(바이트코드)이 여러 운영 체제(마이크로프로세서)에서 실행될 수 있어야 한다
  • 컴퓨터 네트워크 접근 기능이 기본으로 탑재 되어 있어야 한다
  • 원격 코드를 안전하게 실행할 수 있어야 한다
  • 다른 객체 지향 언어들의 좋은 부분만 가지고 와서 사용하기 편해야 한다

 

Java의 특징

  • 자바는 간단하다 (simple)
    하나의 소프트웨어가 제작될 때는 소프트웨어를 제작하는 비용도 많이 들지만 유지 보수하는 비용도 어마어마하다. 자바 언어는 이러한 점을 고려하여 디자인되었다. 자바 언어는 C++를 기반으로 개발되었음에도 C++에서 혼란을 일으키는 부분을 제거했다. 예를 들면 연산자 오버로딩, 다중 상속 같은 것들이다. 그리고 C++에서 문제가 되는 기억 장소 경영 문제를 자동 쓰레기 회수와 할당(auto garbage collection)으로서 극복했다. 그러므로 프로그래머는 이것에 더이상 신경을 쓸 필요가 없다.
  • 자바는 객체 지향 언어이다 (object-oriented)
    요즘의 컴퓨터 언어는 객체 지향 언어로 개발된다. 자바도 객체 지향 언어이다. 객체 지향 언어에 대해 여기서 자세히 언급할 수는 없고 간단한 일례를 들면 상속이라는 것이 있다. 부모 객체로부터 자식 객체는 상속을 한다. 자식 객체가 부모 객체로부터 상속을 받으면 부모 객체의 데이터와 메소드를 사용할 수 있음을 의미한다. 따라서 소프트웨어를 개발할 때 재활용 측면에서 많은 장점을 가진다.
  • 자바는 보안에 강하다 (secure)
    자바는 원래부터 네트워크 분산 처리 환경에서 사용하기 위해 디자인된 언어이다. 네트워크 환경은 다른 환경보다 보안의 측면이 강조되는 환경인 만큼 자바는 보안에 중점을 두고 있다. 자바는 바이러스가 침투하지 못하는 구조를 가지고 메모리에서 데이터 접근을 제한할 수 있다. 접근을 허용하지 않으면, 애플리케이션의 데이터 구조 또는 데이터에 대한 접근은 불가능하다.
  • 자바 아키텍처는 중립적이다 (architecture neutral)
    네트워크는 다양한 기종의 컴퓨터와 다양한 플랫폼(예를 들면, 윈도 NT, 솔라리스, 매킨토시 OS 등의 운영 체제를 일컫는 말이다)과 다양한 하드웨어로 이루어져 있다. 자바는 자바 코드 소스를 컴파일하여 바이트 코드를 만들어내며 이 바이트 코드는 다양한 플랫폼에 설치된 자바 인터프리터에 의해 해석되기 때문에 어떠한 플랫폼에서도 실행 가능하다. 따라서 새로운 기계라도 자바 인터프리터만 설치되어 있으면 바이트 코드를 해석할 수 있다.
  • 자바는 이식성이 높다 (portable)
    기존의 언어는 각각의 플랫폼마다 수치 연산 문제 등으로 인하여 약간씩 다른 코드를 사용한다. 그러나 자바는 이식성이 강하여 다른 운영 체제, 다른 CPU에서도 같은 코드를 사용할 수 있다. 이식성이 높을 때의 단점은 각각의 시스템의 특성을 고려하지 않기 때문에 최적의 성능을 얻어낼 수 없는데, 자바는 이러한 것을 극복한 언어이다.

 

Java는 "Write Once, Run Everywhere'라는 하나의 철학으로 시작되어 발전된 개념입니다.

특정한 곳에서 개발한 프로그램을 어디에서나 수행하겠다는 이 철학을 실현하기 위해 Java는 네 가지의 상호 연관된 기술을 엮어놓았습니다.

  • The Java Programming Language
  • The Java Class File Format
  • The Java Application Programming Interface (Java API)
  • The Java Virtual Machine (JVM)

다른 언어와 같이 Java Source 파일은 단순히 코드만을 담고 있는 파일일 뿐, 이 자체로 수행은 불가능합니다. 이 Source 파일을 실행하기 위해서는 Compile을 통해 Class파일의 형태로 변경해주어야 합니다. Java 의 Compile 은 보통 JDK에 내장되어 있는 'javac'라고 하는 Compiler를 이용하여 수행합니다. Compile 이후에는 Source File과 같은 이름이지만 Class라는 확장자를 가지는 Binary 파일이 생성됩니다.

이 Class 라는 확장자를 가진 파일은 수행이 가능한 형태의 파일입니다. 그리고 수행을 하기 위해서는 JRE(Java Runtime Environment)가 필요합니다. 바로 이 JRE에서 취약점이 많이 발생합니다. JRE에서 발생한 취약점은 곧 java를 모든 권한에서 실행이 가능하다는 의미이며 Java의 철학에 의거하여 특정 플랫폼에 의거한 공격이 아닌 어디에서나 공격을 수행할 수 있다는 것을 의미합니다.

JRE를 수행하기 위해서는 'java'라는 프로그램을 호출하여 우리가 생성한 Class 파일을 인수로 제공하면 됩니다. 이때 'java'라고 하는 프로그램은 Java 실행 환경에 Class 파일을 가지고 들어가는 역할을 하게 됩니다. 즉, 'java'라고 하는 프로그램은 Java Virtual Machine을 하나의 프로세스로 올리는 작업과 함께 Class 파일의 로딩도 수행합니다. 그 이후 Class 파일을 분석하여 JRE 내에 있는 Java Application Program Interface(Java API)와 더불어 프로그램을 수행하도록 하는 것입니다.

위의 과정 중 java라는 확장자를 가진 Source 파일로 Class 파일을 생성하는 시점을 가리켜 Compile Time이라 합니다. 그리고 Compile을 거쳐 생성된 Class 파일을 수행하는 시점을 RunTime이라고 합니다.

다음 도식화는 Java의 철학을 모두 담고 있습니다. 처음 프로그램을 작성할 때 사용한 것은 Java Programming Language입니다. 그리고 작성한 프로그램을 Compile하면 Java Class File Format으로 변경됩니다. 이를 수행하기 위해서는 Java Virtual Machine을 구동시켜 Class파일로 로딩합니다. Java Virtual Machine을 구동할 때 사용하는 Java API는 플랫폼에 맞춰 사용하게 되므로 다른 곳에서 개발한 프로그램이라도 어디서나 실행이 가능한 형태를 가지게 되는 것 입니다.

[그림 1] Java 프로그래밍의 수행과정

Reference

[1] : Java Performance Fundamental, 2009 - 김한도 저

 

전반적인 내용은 언급한 책의 내용을 따라가므로 문제가 될 시 이 포스트는 내리도록 하겠습니다.

'Study > JVM' 카테고리의 다른 글

The Java Language and JVM  (0) 2013.04.14
Javocalypse  (0) 2013.04.11
Java Basic Architecture  (0) 2013.04.11
ClassLoader 3 : Classloader & JAVA Packages  (0) 2012.11.28
ClassLoader 2 : Java Application Server ClassLoader  (0) 2012.11.22
ClassLoader 1 : ClassLoader Delegation Model  (2) 2012.11.20

댓글을 달아 주세요

티스토리 툴바