JAVA

[JAVA]자바와 객체지향(1) - JAVA가 만들어진 이유와 실행환경 간단히 살펴보기

채야미 2024. 2. 13. 13:55

이 도서를 기반으로 글을 작성하였습니다.

 

자바의 탄생

자바는 제임스 고슬링이 객체지향적인 개발을 하기위해 만들어졌습니다. 

또한 WORA - "Write once, Read anywhere"를 하기 위해 만들어졌다고 하는데. 그렇다면 이전의 c언어와는 어떤 차이가 있는지

코드라는 것이 당연히 한번 쓰면 어디서든 읽을 수 있는거 같은데 그 의미가 무엇인지 알아보겠습니다.

 

c언어의 비효율성

c언어의 등장 이후, 하나의 소스파일 만으로 각 컴퓨터에 맞는 컴파일만 하면 프로그램을 실행시킬 수 있었습니다. 그러나 c언어는 네이티브 기계어로 컴파일되기 때문에  ( 현재 프로그램이 돌아가는 환경에 적합한 기계 언어

컴퓨터의 버전과 os에 따라 기계어가 다르고 따라서 컴파일 하는 방식도 바뀌어야하는 단점이 있습니다. 

 

자바의 등장

자바는 이러한 단점을 없애기 위해 하나의 코드로 플랫폼(os나 버전 등) 에 구애받지 않고 실행되기 위해 만들어졌습니다.

위에서 말하는 Write once, Read anywhere에서의 read는 recompilation을 의미하는 것으로

한번 컴파일된 자바는 어떤 하드웨어에서나 읽고 작동할 수 있는 것 입니다.

이처럼 컴파일된 자바 언어를 어디에서나 읽게 해주는 것이 JVM입니다.

 

 

자바 프로그램의 개발과 구동

 

자바 바이트 코드

한편 자바 소스파일은 컴파일이 되면 자바 바이트 코드라는 JVM이 이해할 수 있는 언어로 변환됩니다.

이러한 자바 바이트 코드는 JVM이 설치가 되어있다면, 어떤 os에서라도 실행될 수 있습니다. 자바 바이트 코드의 확장자는 .class입니다.

인텔리제이의 경우 build나 out과 같은 폴더에서 .class 파일을 확인할 수 있습니다.

 

 

 

 

 

 

JVM? JDK나 JRE는 도대체 뭘까

JVM은 앞서 말했듯이 자바 바이트 코드를 실행시켜주는 가상기계 입니다.

책에서는 나머지 JRE와 JDK의 개념은 책에서 다음과 같이 비유하고 있습니다.

 

현실 세계 가상 세계(자바 월드)
소프트웨어 개발 도구 JDK - 자바 개발 도구 JVM용 소프트웨어 개발 도구
운영 체제 JRE - 자바 실행 환경 JVM용 os
하드웨어 -  물리적인 컴퓨터 JVM - 자바 가상 세계 가상의 컴퓨터

 

결론적으로 자바 개발도구인 JDK를 이용해 개발된 프로그램은 JRE에 의해 가상의 컴퓨터인 JVM상에서 구동이 되는 것입니다.

 

JDK에는 자바 소스 컴파일러(javac.exe)라는 것을 포함하고 있어 hello.java와 같은 코드를 hello.class 라는 바이트 코드 파일로 변환을 할 수 있습니다.

또한 JRE는 자바 프로그램 실행기(java.exe)를 포함하고 있고 이것은 JVM을 시작하고 Java 애플리케이션을 실행하는 일종의 런처 역할을 합니다. 따라서 JVM은 이 hello.class, 즉 바이트코드를 실행하면서, 바이트코드를 해당 플랫폼의 기계어로 변환하여 실행합니다.

 

 

아래의 그림으로 컴파일 과정을 간단하게 살펴볼 수 있습니다. 

java 파일 컴파일 과정

 

JIT (Just-In-Time) 컴파일러

한편 JVM가 바이트코드를 해당 플랫폼의 기계어로 변환하여 실행할때 Just-In-Time 컴파일러(JIT 컴파일러)가 사용되어 바이트코드를 해당 플랫폼에 최적화된 기계어로 번역하고 실행합니다. JIT 컴파일러는 런타임 중에 필요한 부분만을 컴파일하여 성능을 향상시키는 역할을 합니다.

https://hyeinisfree.tistory.com/26

위의 글을 참조하여 자바가 JIT를 사용하는 이유에 대해 상세히 알아 볼 수 있습니다. 

 

 

 

추가 개념 - 런타임과 런타임 환경


런타임은 '어떤 프로그램이 실행되고 있는 동안의 동작'
구체적으로 말하면 "해당 프로그램이 필요한 시스템 자원(RAM, 시스템 변수, 환경변수 등)을 할당받고 실제로 시스템 자원을 사용해서 어떤 처리를 하고 있는 것 (그러한 상태/그런 처리가 행해지고 있는 것)"이다.

런타임 환경(Runtime Environment)은 애플리케이션이 운영체제(OS)의 '시스템 자원 (ex: RAM, 시스템 변수, 환경 변수 등과 같은 시스템 리소스)에 액세스 할 수 있도록 해주는 실행 환경'이다.

 

 

 

참고 자료

https://www.yes24.com/Product/Goods/17350624

 

스프링 입문을 위한 자바 객체 지향의 원리와 이해 - 예스24

자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량 애플리케이션 프레임워크인 스프링은 자바와 객체 지향이라는 기반 위에 굳건히 세워져 있다. 따라서 스프링을 제대로 이해하고 활용

www.yes24.com

 

https://yeon-kr.tistory.com/118

 

왜 JVM이 필요할까?

누군가 저에게 물었습니다. "어차피 JVM도 C로 만들어진 가상 머신인데, 처음부터 C처럼 바로 기계어로 컴파일해주면 되지 않나요? 왜 굳이 속도 저하를 가지면서 두 번의 과정을 거쳐야 하죠?" 답

yeon-kr.tistory.com