일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 감사주
- 술담화
- 포도알
- 색상설정
- 제주술
- 클래스파일
- 다이나믹프로그래밍
- 제주몬순커피주
- DB기초
- 백준
- 스킨설정
- 클래스로딩
- 어린날의추억
- iTerm테마
- 전통주
- 데이터베이스
- 자바언어의본질
- 아규먼트
- 테마설정
- iTerm스킨
- 스프링부트
- 술샘
- iterm
- 자바
- 11057
- 커피냑
- 응답상태
- 술쟁이
- 개발용어
- iTerm2
- Today
- Total
배니스트의 개발추적기
[Java] 꼭 Java를 써야할까? 본문
여전히 많은 개발자들의 사랑을 받고 있는 Java(TIOBE PYPL Rank 2, 위 사진)는 객체지향 언어로서 C 프로그래밍 언어의 단점을 극복하고 등장한 것으로 알려져 있다. 이 포스팅에서는 Java 언어가 탄생한 본질적인 배경 두 가지를 짚어보고자 한다.
1] WORA(Write Once Run Anywher)
자바는 WORA의 본질을 갖고 있다. 즉, 한번 써서 어디든 실행한다는 뜻이다. 그런데 '어디든' 실행한다는 건 어디를 말하는 걸까? 그렇다면, 원래는 한번 쓰면 한번밖에 실행하지 못한다는 뜻인가?
차근차근히 따라오길 바란다. 이를 이해하기 위해서는 소스 프로그램이 실행되는 과정을 살펴보아야 한다.
가장 먼저 프로그래머가 소스 프로그램(or 프로그램 소스)을 작성하면 컴파일러가 컴파일을 하여 실행파일을 만든다. 컴파일(Compile)이란 프로그램 소스를 컴퓨터가 실행하는 기계어 코드로 변환하는 작업을 말한다. 이때 컴파일을 해주는 프로그램을 컴파일러(Compiler)라 한다.
C/C++ 소스 프로그램
자 그렇다면, C/C++와 같이 C 기반의 언어들로 이루어진 프로그램들을 먼저 살펴보자.
컴파일러가 C/C++ 소스로 이루어진 프로그램을 컴파일하면 각 플랫폼에 맞춰 실행파일들이 만들어진다.
(간단한 설명을 위해 .obj 파일이 만들어진 후 링크되는 과정은 생략했다.)
갑자기 웬 플랫폼이냐고? 여기서 말하는 플랫폼은 HW+OS 조합을 말한다. 예를 들어,
1) i5 Intel CPU + Redhat Linux OS
2) Apple Mac PC + Mac OS
3) AMD CPU + Window OS 등 다양한 하드웨어 기반에 다양한 OS가 조합된다.
C/C++언어의 경우, 1), 2), 3)에서 만들어진 실행파일 모두 다르다.
그 이유는 CPU마다 기계어가 다르기 때문이고, 운영체제마다 API와 실행파일 형식이 다르기 때문이다.
이를 보고 '플랫폼 종속적이다.'라고 한다.
Java 소스 프로그램
반면, Java 코드로 짜여진 소스 프로그램을 보자.
자바 컴파일러가 컴파일을 하면 .class 파일이 만들어진다. 이 파일 역시 실행파일로서 기계어로 번역되어 있다.
하지만, 이 파일이 곧바로 1), 2), 3) 플랫폼 위에서 실행되지 않는다. JDK(Java Development Kit)을 오라클에서 다운로드하면 JVM(Java Virtual Machine)*이라는 프로그램이 포함되어 설치된다.
* JVM은 IBM이나 Microsoft 등 다양한 회사에서 공급하고 있다.
JVM은 바이트 코드로 이루어진 .class 파일을 각 플랫폼에 맞는 기계어로 번역한다. 한번 만들어진 .class 파일은 JVM에 의해서 1), 2), 3) 뿐만 아닌 모든 플랫폼에서 동작할 수 있게 된다. 그래서 자바 언어는 '플랫폼 독립적이다.'라고 할 수 있는 것이다.
한번 작성하면 어디에서든 동작할 수 있다는 특성으로 WORA(Write Once Run Anywhere)한 성질을 갖고 있는 것이며, 이것이 Java 언어를 이용하는 본질적인 이유가 된다.
2] 클래스 로딩(Class Loading)
두 번째 자바언어의 본질은 Class Loading으로서, Run-time 환경에서 드러난다. 먼저 아래 그림을 먼저 보자.
기존 C/C++에서는 .c 소스파일이 C 컴파일러를 통해 .obj로 변환된다.
이 .obj 파일들은 링커에 의해 하나의 실행파일로 묶이고, 각 플랫폼(OS+HW)에서 실행한다.
이 실행파일은 실행에 필요한 모든 코드를 포함한다.
Java에서는 .java 파일이 자바 컴파일러에 의해 .class 파일로 변환된다.
이 클래스 파일들은 JVM에 의해 '필요할 때마다' 사용된다. JVM은 .class 파일을 그 클래스가 실행될 때 메모리에 로딩한다. 이를 클래스 로딩(Class Loading)이라 한다. 곧, 실행 도중에 다른 클래스 파일 혹은 JDK 클래스 파일이 필요하면 그때 그 클래스 파일을 로딩하여 실행한다. 그래서 필요한 소스를 하나로 묶는 링커가 필요없다.
이는 어떠한 차이를 만들어내는가? 전자의 경우 적은 양의 메모리를 가진 컴퓨터에서는 실행이 불가하다. 실행을 위해서는 실행 파일이 필요한데, 그 파일의 크기가 메모리에서 안정적으로 동작할 수 있는 크기를 초과할 수 있다. 극단적인 경우 메모리 크기보다 클 수도 있다. 반면, 자바 언어에서는 모든 클래스 파일을 로딩할 필요가 없으므로 적은 양의 메모리를 가진 컴퓨터에서도 얼마든지 프로그램을 실행할 수 있다는 장점이 있다.
이상 살펴본 것처럼, 자바 언어의 본질은 한번 작성하여 어디에서든 동작할 수 있는(WORA) 플랫폼 독립적 성격과 JVM의 클래스 로딩을 통해 유연한 실행이 가능하다는 성격으로 정의할 수 있다.
그래서, 어디서든 실행하고 싶은 프로그램을 작성하고 싶거나 적은 용량의 메모리로도 실행을 시키고 싶다면 자바를 선택할 수 있겠다.
'CS Basic > Programming Language' 카테고리의 다른 글
[OOP] 객체 지향 언어의 기본 (0) | 2020.09.01 |
---|