본문 바로가기

Programming/Java

Java 기초 상식 정리

 

1. Java 기초 상식

 

JVM(Java Virtual Machine)은 자바로 작성된 프로그램을 실행하는 데 사용되는 가상머신.

JVM은 자바 어플리케이션을 바이트코드로 변환하고, 이 바이트코드를 OS(운영체제)에 상관 없이 실행할 수 있게 함.

이렇게 함으로써 자바는 플랫폼 독립적인 특성을 가짐.

 

 

 

2. Java의 장점

 

* 플랫폼 독립적

    - 자바 어플리케이션은 한 번 작성하면 어떤 플랫폼이든 실행 가능.

    - JVM이 여러 OS에서 구현될 수 있기 때문.

    - 타 언어는 언어에 맞는 환경에 따라 빌드를 다르게 해야 하지만 자바는 jar, war 파일을 OS 상관없이 JVM 위에서 동작.

 

* 메모리 관리

    - JVM은 가비지 컬렉션(GC)을 통해 메모리 관리를 수행하기에 개발자가 메모리를 직접 관리할 필요가 없음.

 

* 보안

    - JVM은 클래스 로더, 바이트코드 검증을 통해 안전한 실행 환경 제공.

    - 이를 통해 악성코드로부터 시스템 보호 가능.

 

 

3. Java의 단점

 

* 느린 실행 속도

    - JVM을 사용하면 추가적인 오버헤드가 발생하여 네이티브 코드에 비해 상대적으로 느린 실행 속도를 보임.

 

* 더 많은 메모리 소비

    - JVM이 가비지 컬렉션과 같은 메모리 관리 기능을 수행하면서 더 많은 메모리를 사용할 수 있음.

 

* 추가 적인 시간 소요

    - JVM을 시작하고 클래스를 로드하는 과정에서 추가적인 시간 소요.

 

 

 

4.JDK, JRE, JVM의 구분

 

* JDK (Java Development Kit)

    - 자바 언어를 사용하여 프로그램을 개발하기 위한 도구 모음.

    - JRE와 JVM을 포함하며, 컴파일러 (javac), 디버거, 자바 라이브러리, 문서 생성 도구 (javadoc) 등을 포함.

    - 개발자는 JDK를 사용하여 자바 프로그램 작성, 컴파일, 테스트 및 디버깅을 할 수 있음.

 

* JRE (Java Runtime Environment)

    - 자바 프로그램을 실행하기 위한 환경 제공.

    - JVM과 자바 클래스 라이브러리로 구성되어 있음.

    - 사용자는 JRE를 통해 자바 애플리케이션을 실행할 수 있음.

    - 개발 과정이 아닌 자바 프로그램 실행을 위한 환경을 제공하기 때문에 개발 도구는 포함되지 않음.

 

* JVM (Java Virtual Machine)

    - 자바 프로그램의 실행을 담당하는 가상 머신.

    - 자바 코드 컴파일 후 생성된 바이트 코드를 기계어로 변환하여 실행하고 이 자바코드가 여러 플랫폼에서 동일하게 작동할 수 있는 중립적인 환경을 제공.

    - 자바로 작성된 프로그램은 JVM이 설치된 모든 운영 체제에서 실행 가능.

 

 

 

5. JAR, WAR, EAR의 구분

 

* JAR (Java Application Resource or Java Application Archive)

    - 자바 애플리케이션과 관련된 클래스 파일, 메타데이터, 리소스 파일 등을 하나의 압축 파일로 묶은 것.

    - 자바 애플리케이션을 쉽게 배포하고 설치할 수 있도록 함.

    - 자바 라이브러리를 포함할 수 있어, 재사용 가능한 코드 모듈을 효율적으로 관리 가능.

    - JRE만 있어도 실행 가능. (java -jar 프로젝트명.jar)

 

* WAR (Web Application Resource or Web Application Archive)

    - WAR 파일은 웹 어플리케이션과 관련된 파일들을 하나의 압축 파일로 묶은 것.

    - JSP, Servlet, 클래스 파일, XML 설정 파일, 웹 리소스 (HTML, CSS, 자바스크립트, 이미지 등) 등 웹 애플리케이션 구성 요소 포함.

    - WEB-INF, META-INF 같은 사전 정의된 구조를 사용함.

    - 실행하려면 별도의 웹 서버 (WEB)나 웹 컨테이너 (WAS)가 필요.

 

* EAR (Enterprise Application Resource or Enterprise Application Archive)

    - 자바 기반의 엔터프라이즈 애플리케이션을 패키징 하는 데 사용되는 파일 형식.

    - 웹 애플리케이션 (WAR 파일), EJB (Enterprise Java Bean) 모듈, 자바 어플리케이션 (JAR 파일) 및 관련 리소스를 포함하며, 이들은 각각 서로 다른 계층의 구성 요소를 나타냄.

    - 여러 모듈과 리소스가 포함된 대규모 엔터프라이즈 애플리케이션을 하나의 파일로 통합하여 배포하고 관리 가능.

    - 주로 자바 EE 애플리케이션 서버에서 사용되며, 서버 관리자는 EAR 파일을 통해 애플리케이션의 배포와 관리를 용이하게 함.

 

 

 

6. 자바 라이프사이클

 

(1) 소스코드 작성

    - 개발자는 텍스트 에디터를 사용하여 자바 소스 코드 (.java)를 작성.

    - 작성된 소스코드는 컴파일 과정을 거쳐 .class로 변경될 것.

    - 소스코드를 작성할 때는 자바 언어의 표준 라이브러리 (Java Standard Library)를 활용하거나 사용자 정의 라이브러리를 사용하여 재사용성을 높일 수 있음.

 

(2) 컴파일

    - 소스코드의 구문 및 의미를 분석하여 바이트 코드 (.class)로 변환.

    - 이 과정에서 자바 컴파일러의 문법 분석기는 자바 코드의 구문을 검사하고, 올바르게 작성되었는지를 검증함.

    - 자바 소스 코드가 다른 클래스나 라이브러리를 사용하는 경우, 이를 참조할 수 있도록 해당 클래스나 라이브러리를 검색 (Classpath).

 

(3) 클래스 로딩

    - 클래스 로더는 JVM의 일부로, .class 파일을 메모리에 로드하는 역할.

    - 개발자가 클래스 로더의 역할을 알게 되면, 자바와 스프링 구조를 디테일하게 파악 가능.

    - 클래스 로더는 클래스를 로드한 후, 링크하고 초기화 된다.

    - 링크는 클래스나 인터페이스의 레퍼런스를 해결하고, 필드와 메소드를 준비하는 과정을 의미함.

    - 초기화는 스태틱 (static) 블록을 실행하고, 스태틱 변수를 초기화하는 과정을 의미함.

    - 클래스 로더는 로드되는 클래스의 종류에 따라서 우선 순위를 다르게 부여하고 부트스트랩 클래스 로더, 확장 클래스 로더, 시스템 클래스 로더로 JVM에 내장되어 있으며, 사용자 정의 클래스 로더로 구분할 수 있음.

    - 부트스트랩 클래스 로더: JVM을 시작하면 부트스트랩 클래스 로더를 이용하여 기본적으로 제공되는 자바 클래스를 모두 로드함.  대표적으로 JVM 핵심 라이브러리인 rt.jar가 있음.  부투스트랩 클래스 로더는 JDK에 내장되어 있고 가장 먼저 클래스를 로드하는 역할 담당.

    - 확장 클래스 로더: 표준 클래스 로더와 시스템 클래스 로더의 중간 단계에 해당함. JDK가 설치된 경로에 있는 클래스들을 로드하는 등 플랫폼별로 클래스를 로드함.

    - 시스템 클래스 로더: 앱 개발자가 작성한 클래스를 포함하는 애플리케이션 클래스를 로드함. 확장 클래스 로더의 하위 단계에 해당하며, 클래스 패스에 지정된 경로에 있는 클래스들을 로드함. 이 때, 애플리케이션 클래스 패스에 있는 클래스 파일을 검색하고 없을 시 에러를 발생 시킴.

    - 추가로, 라이브러리의 jar 파일은 시스템 클래스 로더와 확장 클래스 로더 그리고 사용자 정의 클래스 로더 중 하나에 의해 로드되지만, 일반적으로 시스템 또는 확장 클래스 로더에 의해 로드됨. 이 때, 시스템 클래스 로더는 JRE의 라이브러리 디렉터리 (lib/)와 애플리케이션 클래스 패스를 검색하며, 확장 클래스 로더는 JRE의 확장 디렉토리 (ext/)를 검색함.

 

(4) 바이트코드 검증

    - 클래스 로더는 바이트 코드를 로딩한 후, JVM 내부에서 안전성과 보안성을 보장하기 위한 과정으로 바이트 코드의 구문 및 의미를 분석하고 유효성을 검증함. 

    - 이 과정에서 JVM은 스택을 검사하고, 사용되지 않는 로컬 변수를 제거하는 등의 작업을 수행함.

    - 유효하지 않은 바이트 코드는 JVM에서 실행되지 않으며, 실행 중 예기치 못한 오류가 발생 가능.

 

(5) Just-In-Time

    - 자바 바이트코드를 실행하는데, 일반적으로는 인터프리터 방식으로 동작함.

    - 인터프리터 방식은 바이트 코드를 한 줄씩 읽어들이면서 실행하는 방식으로, 실행 속도가 느리다는 단점 있음.

    - 이를 해결하기 위해 Just-In-Time 컴파일러 (JIT Compiler)를 도입하여 속도 저하 문제를 보완함.

    - JIT Compiler는 인터프리터 방식으로 바이트 코드를 실행할 때, 실행 속도가 느린 부분을 파악하여 해당 부분을 native code로 변환하고, 이후에는 인터프리터 대신에 native code를 직접 실행하는 방식으로 동작함.

 

(6) 실행

    - 실행 전까지의 과정을 통해 변환된 기계어 코드는 JVM에서 실행됨.

    - 이 때, JVM은 자바 Thread를 생성하여 여러 작업을 동시 처리할 수 있으며, Thread는 동기화된 코드를 실행하거나, I/O 작업을 수행할 때 유용함.

    - JVM은 자바 언어에서 제공하는 가비지 컬렉터(Garbage Collector)를 사용하여 메모리 누수를 방지함.

 

(7) 메모리 관리

    - JVM은 자바 프로그램에서 사용하는 메모리를 관리함.

    - 이 과정에서 메모리 할당, 해제, 가비지 컬렉션 등을 수행하여 자원의 효율성을 높이고, 메모리 누수 등의 문제를 방지함.

    - JVM은 메모리를 Stack과 Heap으로 구분하여 관리함.

    - Stack은 지역 변수와 메소드 호출을 위한 메모리를 할당함.

    - Heap은 객체와 배열 등을 위한 메모리를 할당함.

 

(8) 종료

    - 자바 프로그램이 실행을 마치면, JVM은 프로그램에서 사용한 자원을 해제하고 종료됨.

    - 사용한 자원에는 파일, 네트워크 연결, 데이터베이스 커넥션 등이 포함됨.

    - JVM의 가비지 컬렉션은 일정 시간 동안 사용되지 않는 객체를 메모리에서 해제함.

 

 

참고

https://yozm.wishket.com/magazine/detail/1979/

 

초보 Spring(Java) 개발자를 위한 완전 기초 지식(이론편) | 요즘IT

모든 프로그램에는 시작과 끝이 있습니다. 개발자가 코드를 작성하고 실행하면 JVM에서 프로그램이 실행된 후 종료됩니다. 이때, JVM 상에서 어떤 식으로 동작하며 개발자가 작성한 코드는 어떤

yozm.wishket.com

 

'Programming > Java' 카테고리의 다른 글

JAVA 버전별 특징  (0) 2023.06.04
JSON 파싱 2020. 06 .24  (0) 2020.06.29
국립국어원_HTTP적용 2020. 06 .24  (0) 2020.06.29
HttpClient 또오해영  (0) 2020.06.29
우리말샘 API 2020. 06 .24  (0) 2020.06.29