java란 무엇일까?
JAVA
--
Java는 1995년에 Sun Microsystems에서 처음 출시한 "객체지향 프로그래밍 언어"다.
(현재는 Oracle이 Java를 인수하여 관리 중)
--
주요 특징
--
1. 객체지향 프로그래밍 언어 (OOP, Object-Oriented Programming)
프로그램을 객체 단위로 구조화하여 코드의 재사용성을 높이고 유지보수를 쉽게 도와준다.
객체지향의 핵심인 "캡슐화", "상속", "다형성", "추상화"와 같은 개념을 지원한다.
2. 운영체제(플랫폼)에 독립적
기존의 언어(C, C++ 등)들은 하나의 운영체제(플랫폼)에 맞게 프로그램이 개발되기 때문에
운영체제나 하드웨어에 종속된다.
그래서 다른 운영체제에서는 해당 프로그램을 실행할 때 다르게 동작하거나 실행이 불가능하다.
다만 Java는 "JVM"을 이용하기 때문에 특정 운영체제(플랫폼)에 종속되지 않아 독립적으로 동작할 수 있기 때문에
어느 운영체제든지 "JVM"만 설치되어 있다면 정상적으로 동작이 가능하다.
전통적인 언어들(C, C++ 등)로 작성된 소스코드들은 컴파일러를 통해 기계어로 변환된다.
(컴파일한 기계어 파일은 프로그램 실행 파일이다.)
이때 컴파일러는 현재 운영체제가 이해할 수 있는 기계어로 변환이 되기 때문에
만약 Windows운영체제에서 컴파일하여 프로그램 실행 파일을 만들었다면
해당 프로그램은 Windows운영체제에서만 해석할 수 있기 때문에
Linux나 macOS 운영체제에서는 해당 프로그램을 실행할 때 다르게 동작하거나 실행이 불가능할 수 있다.
하지만 Java는 JDK를 설치하면 같이 제공하는 javac라는 컴파일러를 통해 컴파일을 하게 되는데
이때 전통적인 언어들과는 다르게 기계어가 아닌 "바이트코드(.class 파일)"로 변환한다.
해당 바이트코드는 컴파일된 기계어 파일처럼 운영체제나 하드웨어에 종속적이지 않고 독립적인 파일이며
컴파일을 끝낸 기계어파일(프로그램)처럼 최종 파일이지만 프로그램 파일은 아니다.
다만 실행하기 위한 모든 준비는 끝난 최종 파일이므로 "실행이 가능한 파일(프로그램)"느낌으로 알면 편하다.
(정확히는 프로그램을 실행하기 위한 "중간 형태의 코드"다.)
이 바이트코드파일을 실행하기 위해서는 JDK를 설치하면 같이 제공하는 "JVM"라는 프로그램이 필요하다.
(JVM은 바이트코드를 해석하고 실행하는 기능을 제공)
JVM을 통해 바이트코드 파일을 가지고 프로그램 실행을 할 수 있으므로
결과적으로 "바이트코드 파일"만 가지고 있으면 어느 운영체제에서든 프로그램을 실행시킬 수 있다는 것이다.
(JVM으로 프로그램을 실행시킬 때 따로 프로그램 파일이 생성되는 것이 아니라 "바이트코드 파일"을 그대로 실행시키는 것이다.)
전통 언어 소스코드 -> (컴파일러) -> 기계어파일(프로그램)
[ 컴파일된 기계어파일(프로그램)은 현재 운영체제에서만 해석할 수 있기 때문에 운영체제에 종속된다. ]
Java 소스코드 -> (javac컴파일러) -> 바이트코드 파일 -> (JVM) -> 프로그램 실행
[ 컴파일된 바이트코드 파일은 운영체제에 종속되지 않고 독립적이므로 운영체제에 JVM만 설치되어 있으면
어디서든 실행이 가능하다. ]
3. 자동 메모리 관리 (Garbage Collection)
자동으로 메모리를 관리해주는 "가비지 컬렉션(Garbage Collection)" 기능을 제공해준다.
해당 기능은 더 이상 참조되지 않는(사용하지 않는) 객체(데이터)를
JVM이 자동으로 삭제하여 메모리 누수(낭비)를 방지해준다.
그래서 개발자는 메모리를 따로 관리 하지 않아도 된다.
4. 다양한 표준 라이브러리
수많은 표준 라이브러리로 다양한 기능을 사용할 수 있다.
파일 처리, 네트워크, 스레드, 데이터베이스 연동 등 개발에 필요한 많은 기능을 기본적으로 포함되어 있다.
5. 멀티쓰레드(multi-thread) 지원
일반적으로 멀티쓰레드는 사용하는 운영체제에 따라 구현방법과 처리 방식이 다르다.
하지만 Java에서 개발하는 멀티쓰레드 프로그램(관련 라이브러리 API 제공)은
해당 시스템과는 관계없이 구현이 가능하여 일정하게 개발이 가능하다.
그리고 여러 쓰레드에 대한 스케줄링(scheduling)은 자바 인터프리터가 담당해준다.
6. 네트워크와 분산처리 지원
비교적 짧은 시간에 네트워크 관련 프로그램을 쉽게 개발할 수 있도록 다양한 네트워크 프로그래밍 라이브러리를 제공
--
환경 구성 요소
--
1. JDK (Java Development Kit)
Java 프로그램을 개발하기 위한 도구 모음(개발자용)으로
Java 소스코드를 작성하고, 컴파일하며, 실행할 수 있는 모든 도구를 포함하고 있다.
(JDK안에 JRE도 포함되어 있다.)
일부 요소
- javac : 자바 컴파일러 프로그램 (자바 소스코드를 바이트코드로 변환)
- java : 자바 인터프리터 (JVM을 통해 컴파일된 바이트코드를 해석 및 실행)
- javap : 역어셈블러 (컴파일된 바이트코드(.class 파일)을 원래 소스코드로 변환)
- javadoc : 자동 문서 생성기 (소스코드에 작성된 주석 내용을 이용하여 Java API문서와 같은 형식으로 문서 생성)
- jdb : 디버깅 (프로그램을 디버깅하는 도구)
- jar : 압축프로그램 (바이트코드(.class 파일)와 프로그램의 실행에 관련된 파일을 하나의 jar파일로 압축 or 해제)
- jre : Java 프로그램을 실행하기 위한 환경
2. JRE (Java Runtime Environment)
Java 프로그램을 실행하기 위한 도구 모음(사용자용)이다.
(개발이 아닌 실행만 필요한 경우 JRE만 설치해도 된다.)
일부 요소
- JVM : 바이트코드를 실행하는 가상 머신
- 라이브러리 : Java 애플리케이션 실행에 필요한 표준 라이브러리들이 포함
3. JVM (Java Virtual Machine)
자바를 실행하기 위한 가상 머신으로
Java 프로그램의 "바이트코드(.class파일)"을 해석하고 실행할 수 있도록 해주며,
Java의 플랫폼 독립성을 실현할 수 있도록 하는 핵심적인 역할을 한다.
가상 머신이란
물리적인 컴퓨터 시스템을 가상 컴퓨터처럼 소프트웨어로 구현한 프로그램을 의미
즉, Java의 바이트코드를 운영체제와 하드웨어에 맞게 해석하고 실행하는 방식을 통해
해당 Java 프로그램이 운영체제나 하드웨어에 종속되지 않고 독립적으로 실행할 수 있게 된다.
(JVM은 운영체제나 하드웨어에 종속된다.)
이외에도
메모리 관리, 스레드 관리 ,가비지 컬렉션 등의 다양한 기능을 제공한다.
JVM의 일부 구성 요소
- 클래스 로더 (Class Loader) : 바이트코드를 메모리에 로드하는 역할
- 실행 엔진 (Execution Engine) : 메모리에 로드된 바이트코드를 실제로 실행하는 역할
-- 인터프리터 (Interpreter) : 바이트코드를 한 줄씩 해석하고 실행
-- JIT 컴파일러 (Just-In-Time Compiler) : 바이트코드를 기계어로 변환 (다음에 더 빠르게 실행할 수 있도록)
-- 가비지 컬렉터 (Garbage Collector) : 사용되지 않는 객체들을 자동으로 메모리에서 제거 - 메모리 구조 (Runtime Data Areas) : Java 프로그램이 사용할 메모리를 여러 영역으로 나누어 관리
-- 메소드 영역 (Method Area) : 클래스에 대한 정보 저장 (메타데이터, 상수, 정적 변수, 메서드 등)
-- 힙 영역 (Heap) : 객체가 동적으로 생성되는 공간 (가비지 컬렉터가 해당 영역을 주기적으로 검사)
-- 스택 영역 (Stack) : 스레드별로 할당되어 각 스레드의 호출된 메서드와 지역 변수를 저장
-- PC 레지스터 (Program Counter Register) : 실행 중인 JVM 명령어의 주소를 저장하는 레지스터
-- 네이티브 메소드 스택 : Java 프로그램에서 호출된 "네이티브 코드(C, C++ 등)"를 처리하기 위한 스택
--
jar파일로 프로그램 실행 or 바이트코드파일로 프로그램 실행
--
바이트코드 파일로 프로그램 실행
우선 바이트코드는 Java 소크 코드를 javac 컴파일러에 의해 변환된 파일로,
JVM이 실행할 수 있는 "중간 코드"다.
프로그램 실행 과정
- Java 소스 코드를 javac 컴파일러로 컴파일
- 컴파일된 결과인 "바이트코드"파일을 JVM으로 실행
하지만 이러한 경우
해당 바이트코드를 실행할 때 필요한 부가적인 리소스 파일들도 같이 직접 따로 관리해줘야 한다.
만약 해당 프로그램에서 사용하는 이미지가 있다고 생각하면
바이트코드 파일과 해당 이미지도 따로 가지고 있어야 하며
이미지가 저장된 경로도 소스코드에 작성했던 경로에 저장하고 있어야 한다.
즉, 해당 바이트코드를 다른 운영체제(컴퓨터)에서도 실행하기 위해 해당 바이트코드 파일을 전달해줄 때
그 파일에 필요한 부가적인 리소스 파일(이미지, 데이터, 설정 파일 등)도 같이 따로 전달해줘야 하며
이 파일들을 받고 나서 경로도 직접 지정하고 실행을 해야 한다.
jar 파일로 프로그램 실행
바이트코드 파일을 바로 실행하지 않고
해당 바이트코드 파일과 프로그램을 실행할 때 필요한 부가적인 파일들을 하나로 묶어 놓은
압축 파일 형식으로 만든 것이 jar 파일이다.
(jar 파일도 바이트코드파일처럼 운영체제나 하드웨어에 독립적이다.)
프로그램 실행 과정
- Java 소스 코드를 javac 컴파일러로 컴파일
- 컴파일된 결과인 "바이트코드"파일과 해당 파일과 관련된 리소스 파일(이미지, 텍스트 파일 등)을
jar 명령어를 통해 JAR 파일로 묶는다.(압축) - jar파일을 JVM으로 실행
이러한 경우
바이트코드 파일과 필요한 리소스 파일을 모두 묶어서 압축 파일로 사용하기 때문에
직접 리소스 파일들을 관리할 필요 없이 바로 실행할 수 있게 된다.
즉, 바이트코드 파일을 바로 실행하는 방법과는 다르게 다른 운영체제(컴퓨터)에서 실행시키기 위해서
jar파일만 전달 해주면 해당 컴퓨터에서 바로 실행할 수 있게 된다.
결론
바이트코드 파일을 바로 실행하는 경우는
일반적으로 개발 중에 테스트용으로 실행하는 경우에 사용하고
jar 파일을 실행하는 경우는
일반적으로 배포 or 배포 후 실행에 사용한다.
--
'Language > Java' 카테고리의 다른 글
조건문, 반복문 (+ break, continue, label) (0) | 2024.10.06 |
---|---|
[연산자] 비교, 논리, 그 외의 연산자 (+ instanceof) (0) | 2024.10.05 |
[변수] 변수와 상수 (+ 타입, 진법, 형변환) (0) | 2024.09.22 |
자바 기본 규칙 (0) | 2024.09.21 |
Java 빌드 (+ Maven, Gradle) (0) | 2024.09.18 |