Java프로그램 개발을 위한 환경 구축


이제부터 프로그램을 짜 보려면,

그걸 하기위한 환경을 컴퓨터에 설치해야 한다.

우선, 용어 설명부터


JVM: Java Virtual Machine

이건 가상머신.

설명을 앞에서 너무 많이 해서 패스


JRE: Java Runtime Environment

이것은 JVM 더하기 Java Class Library 이다.

Java Class Library는

프로그램 짜는 데 필요한 기본적인 라이브러리를 말한다.

모든 것을 프로그래머가 일일이 다 짜려면 힘드니,

기본적으로 제공해주는 라이브러리이다.

따라서,

JRE는 가상머신과, 그 위에서 실행되는 프로그램이

필요한 라이브러리를 합쳐 놓은 것을 말한다.

그래서,

Java 프로그램을 개발하는 것이 아니라,

남이 만들어놓은 Java 프로그램을 가져다 실행만 하려면,

JRE만 설치하면 된다.


JDK: Java Development Kit

용어가 많기도 하다.

JVM, JRE, 이젠 JDK까지.

JDK는 JRE 더하기 Java컴파일러와 기타도구 들을 말한다.

뭔가 규칙이 보이지 않는가?

JDK = JRE + Java컴파일러

JRE = JVM + Java Class Library

JVM < JRE < JDK 

이런 관계에 있다.


JDK 설치

개발을 위해서는

검색엔진에 "JDK download"를 입력해서,

Oracle사의 JDK 페이지로 

이동한다.


그러면, 아래와 같이 여러가지 JDK 버전들이 나오는데,

이 중에서

Java SE (Standard Edition)을 선택한다.

그리고, JDK 다운로드를 클릭



아직 끝난 것이 아니다.

Java SE도 운영체제별로 여러 가지 버전이 있다.

이 중에서 윈도우즈 운영체제이면, 

32bit 냐, 64bit를 골라서 설치하면 된다.

제일 안전빵은

32bit를 골라서 설치한다.

이것을 다운로드 받은 다음에 실행하면, JDK 설치 끝




Java Development Kit (JDK)에 대해서 설명합니다.




반응형
LIST


Platform Independency

플랫폼 독립성.

굉장히 멋진 단어들이다.

내용은,

앞 차시에 설명했던 대로,

Java언어로 짜고, 빌드한 실행프로그램은

운영체제에 상관없이 돌아갈 수 있다는 것이다.


Platform-dependent language C:

반면에,

C언어 프로그램은 운영체제와 상관있다.

그래서,

멋진 말로 표현하자면,

C언어는 platform dependent하다고 한다.


Java 소스코드의 확장자: .java

프로그래밍 언어별로

고유의 확장자가 있다.

C언어 확장자는 .c

C++언어 확장자는 .cpp

요즘 한참 뜨고 있는 Python언어 확장자는 .py

이렇듯이

Java언어의 확장자는 .java 이다. 확장자치곤 좀 길다.


Java 빌드의 결과: 바이트 코드

Java 소스코드를 빌드하면

가상머신이 수행할 수 있는 코드가 생성되는데,

이것을 바이트코드라 하고, 아래처럼 생겼다.



바이트코드의 확장자: .class

소스코드를 빌드해서 나온 바이트코드는 

새로운 확장자를 갖게 되는데,

이것이 .class이다.

즉, hello.java 소스코드를 빌드하면,

hello.class 바이트코드가 나오게 된다.

그러면 이 바이트코드를

가상머신이 실행하게 되는 것이다. 


정리: Java 실행프로그램의 생성 순서

1. Java 소스코드를 작성한다. 이 때 확장자는 .java가 된다.

아래 그림과 같이 HelloWorld.java와 같은 소스코드가 

만들어진다.

2. 빌드를 하기 위해서, Java Compiler(컴파일러)를 이용한다.

컴파일러는 소스코드를 바이트코드로 변환시킨다.

생성되는 바이트코드의 확장자는 .class이다.

3. 마지막으로, 생성된 바이트코드는 가상머신 (JVM)위에서 실행된다.


바이트코드 생성의 진실

좀 더 자세한 내용을 들여다 보자.

바이트코드가 생성되는 과정에서

단순히 컴파일러를 사용하는 것은 아니다.

Java의 platform independency를 보장하는 것은

공짜로 얻는 것이 아니다.

이를 위해서 가상머신을 사용하는 것은 물론,

컴파일러도 운영체제별로 별도로 있다.

아래 그림에서 

컴파일러는 javac.exe 프로그램이지만,

각 운영체제, HW별로 다 다르다.

따라서, Java 프로그램을 작성하는 운영체제와 HW에 따라

별도의 컴파일러를 설치해서 사용해야 한다.

정리하자면,

Java 소스코드와 바이트코드는 platform independenct하다.

그러나,

컴파일러는 platform dependent하다.

또한,

가상머신도 patform dependent하다.

아래 그림에서 java.exe로 표시된 것이 가상머신이고,

그림에는 Java interpreter라고 표시되어 있다.

Interpreter라는 것은 사전적인 의미로 '통역자'인데,

바이트코드를 실제 '통역'해서 컴퓨터가

실행하도록 하는 것이다.

사실, Java interpreter가 가상머신을 구동시키는 구조로 되어 있다. 



바이트코드의 진실

만약 바이트코드에 대해서 좀 더 알고 싶다면,

아래 그림을 보자.

왼쪽은 Java코드로 작성한 것이고,

오른쪽은 이에 해당하는 바이트코드이다. 

그러면 중간은 무엇인가?

이건 바이트코드를 사람이 볼 수 있는 형태로

line-by-line으로

바꾸어 놓은 것이다.

이런 과정을 '역어셈블' (disassemble)이라고 한다. 

왜? 

이런 것이 필요할 때가 있다. 특히 디버깅할 때.


짧은 Java 소스코드지만,

바이트코드로 바꾸면, 

아주 간단한 명령들의 긴 순서로 바뀌는 것을 볼 수 있다.

사실, 컴퓨터는 아주 간단한 일들만 빠르게 할 수 있다.

그러므로, 복잡한 일을 시키려면,

간단한 일들을 조합해서 시켜야 하는 것이다.




Java 컴파일러와 인터프리터, 가상머신의 설치

Java 프로그램을 개발해서 실행해 보려면,

대충 감 잡았듯이,

컴파일러, 인터프리터, 그리고 가상머신을 먼저 설치해야 한다.

그것도 운영체제에 따라 각각 다른 것을..

그런데, 굿뉴스가 있다,

이 모든 것이 무료이고,

한 방에 다운로드 할 수 있다는 것이다.

컴파일러+인터프리터+가상머신, 이 세 개의 종합세트를

Java Development Kit (JDK)라고 하고,

이것에 대해서는 다음 차시에서 배운다.


Java언어의 patform independency에 대해서 설명합니다.



반응형
LIST


자동차 vs. 전기자동차




위 사진은 Elon Musk라는 사람이다.

'일란 머스크'라고 읽는다.

남자다.

남아프리카공화국 태생이지만,

미국에 산다. 미국 영주권이나 시민권이 있을 것이다.


이 사람이 한 일 중에 하나가

전기자동차를 대중화시킨 것이다.

'테슬라'라는 회사를 세워서

다소 가격은 비싸지만 실제로 사람들이 구매할 수 있는 전기차를 

생산해 낸 것이다.



기름을 넣고 달리는 자동차와

전기로 달리는 자동차는 확연히 다르다.

이런 차이만큼이라,

서로 다른 것이

C언어와 Java언이다.


C언어: 함수기반으로 프로그래밍

C언어로 프로그래밍 한다는 것은,

함수들을 만들고,

이것들을 레고블럭처럼 조합해서

프로그램을 완성하는 것이다.

예를 들어, 

C언어가 제공하는 printf, scanf, 등등 여러 가지 함수들이 많았다.

결국 C 프로그래밍한다는 것은

이런 함수들을 호출하는 순서와 방법들의

조합이었던 것이다.


Java언어: 객체기반으로 프로그래밍

반면에,

Java 언어는 object기반, 혹은 객체기반 언어이다.

여러 가지 객체들을 만들어 놓고,

이것들을 조합해서 프로그램을 완성하는 것이다.

그러면,

객체란 무엇인가?

쉽게 말해서, 데이터와 그 데이터를 접근할 수 있는 함수들로 이루어진 것을 말한다.

이 객체에 대해서 배우는 것이

Java언어를 배우는 것이니,

지금 당장 와닿지 않더라도 걱정할 필요가 없다.


C언어 프로그램과 운영체제

C언어로 프로그램을 만들면,

빌드 과정 (컴파일 + 링크 과정)을 거쳐서

실행파일로 만든 다음에

사용한다.

예를 들어, 이렇다.

윈도우즈가 깔린 PC에서

Visual Studio 같은 것을 이용해서 프로그램을 만든다고 하자.

C언어 소스코드로 프로그램을 짜고,

빌드하고, 실행파일이 나오면 그걸 수행시킨다.

이 때,

이 실행파일을 다른 운영체제,

예를 들어, Linux, Android, Mac OS X, iOS가 설치된

PC나 기기에 넣고 돌릴 수 있을까?

안 된다.

되게 하려면, 소스코드를 가져다가,

그 PC나 기기에서 빌드를 해서

새로 실행파일을 만들어야 한다.

왜냐하면,

빌드하는 과정에서 '그 운영체제'에만 돌아가도록 만들어진

실행파일이 만들어지기 때문이다.


크로스 컴파일

윈도우즈 PC에서 빌드하면서 리눅스 PC에서 돌아가도록 실행프로그램을

만들 수도 있다. 

그런데, 이 실행프로그램은 윈도우즈 PC에서는

실행이 안 되고.

리눅스 PC에서만 돌아간다. 

이렇게 빌드하는 것을 크로스 컴파일(cross compile)이라고 한다.

여기에서 빌드해서 저리로 넘겨 (cross) 주기 때문이다.


포팅

윈도우즈 PC에서 작성한 C언어 소스파일을

리눅스 PC로 옮겨서 빌드만 다시 해서 실행파일을 만들면,

바로 수행이 가능할까?

결론은 그럴 수도 있고, 아닐 수도 있다.

'아닐 수 있는' 경우는

소스코드를 작성하면서, 

윈도우즈 운영체제만 제공하는 특수한 함수를 사용하는 경우이다.

당연히 리눅스에서는 그런 함수를 제공하지 않으니,

리눅스에서는 빌드과정이 제대로 될리 없다.

그러면 어떻게 해야 하나?

'특수 함수'를 리눅스에서 유사한 기능을 제공하는 함수로

바꿔야 한다. 즉, 소스코드를 수정해서.

이 과정을 포팅 (porting)이라고 한다.

실제로 이 포팅과정을 회사에서는 많이 한다.

같은 윈도우즈 운영체제라 할지라도 버전에 따라서,

예를 들어 윈도우즈 XP, 7, 8, 10 등등,

제공함수가 달라지기 때문에,

이 때마다 소스코드를 수정해서 포팅을 해야 하는 것이다. 


Java프로그램과 운영체제

Java언어로 소스코드를 작성하면,

C언어와 마찬가지로 빌드과정을 거쳐서

실행파일을 만든다.

그런데, 이 실행파일은

윈도우즈, 리눅스, 맥, 어디서든 돌아간다.

원래

Java언어의 설계 목적 중의 하나가

C언어가 운영체제때문에 겪는 문제점을 없애기 위한 것이기 때문이다.

어떻게 이런 마법이 가능한 걸까?

세상에 공짜는 없다.

결론부터 말하자면 가상머신 (Virtual machine) 때문이다.

어느 운영체제이든,

우선 가상머신을 동작시키고,

그 위에서 Java 프로그램을 동작시킨다.

이러면,

Java프로그램 입장에서는

자기가 어느 운영체제 위에 있는지

알 수도, 알 필요도 없어진다.

그래서, 운영체제와 상관없이

한 번 빌드된 Java프로그램은

어떤 컴퓨터든지 가상머신만 있다면

수행될 수 있는 것이다.

그럼,

가상머신은 무엇인가?

쉽게 말하자면, 하나의 프로그램에 불과하다.

다만 이 프로그램은 자기 안에서 다른 프로그램이 수행되도록 한다.




위 그림에서

JVM이라고 표시된 것들이,

Java Virtual Machine (자버 가상머신)이라고,

위에서 설명한 가상머신들이다.


그리고,

참고로

C언어에서는 소스코드를 컴파일해서 나오는 

이진파일들을 오브젝트코드라고 부르는데,

Java언어에서는 바이트코드라고 부른다.


C언어와 비교하여 Java 언어를 설명합니다.





반응형
LIST

+ Recent posts