자바 언어의 특징
1. 운영체제에 독립적이다.
자바 응용프로그램은 운영체제나 하드웨어가 아닌 JVM하고만 통신하고, JVM이 자바 응용프로그램으로부터 전달받은 명령을 해당 운영체제와 하드웨어가 이해할 수 있도록 변환하여 전달한다.
자바로 작성된 프로그램은 운영체제에 독립적이지만 JVM은 운영체제에 종속적이어서 썬에서는 여러 운영체제에 설치할 수 있는 서로 다른 버전의 JVM을 제공하고 있다.
2. 객체지향언어이다.
자바는 프로그래밍의 대세로 자리 잡은 객체지향 프로그래밍언어(object-oriented programming language) 중의 하나로 객체지향개념의 특징인 상속, 캡슐화, 다형성이 잘 적용된 순수한 객체지향언어라는 평가를 받고 있다.
3. 자동 메모리 관리(Garbage Collection)
자바로 작성된 프로그램이 실행되면, 가비지컬렉터(garbage collector)가 자동적으로 메모리를 관리해주기 때문에 프로그래머는 메모리를 따로 관리 하지 않아도 된다. 가비지컬렉터가 없다면 프로그래머가 사용하지 않는 메모리를 체크하고 반환하는 일을 수동적으로 처리해야할 것이다.
4. 멀티쓰레드를 지원한다.
일반적으로 멀티쓰레드의 지원은 사용되는 운영체제에 따라 구현방법도 상이하며, 처리 방식도 다르다.
하지만 자바는 JVM이 제공해주는 API들 덕분에 운영체제과 독립적으로 쉽게 구현할 수 있다.
5. 동적 로딩(Dynamic Loading)을 지원한다.
실행시에 모든 클래스가 로딩되지 않고 필요한 시점에 클래스를 동적으로 생성하여 사용할 수 있다.
일부 클래스가 변경되어도 전체 애플리케이션은 다시 컴파일하지 않아도 되며, 애플리케이션의 변경사항이 발생해도 비교적 적은 노력만으로도 처리할 수 있는 유연한 애플리케이션을 작성할 수 있다.
자바 프로그램 실행 과정
JDK(Java Development Kit)
JDK를 설치하면 JVM과 Java API와 여러 실행파일(java.exe, javac.exe, jar.exe 등등)이 설치된다.
컴파일 (Complie) : 코드를 분석해서 기계어 혹은 바이트(중간)코드로 변환하는 과정
인터프리트(Interpret) : 코드를 한 줄씩 읽고 즉시 실행하는 과정
컴파일러(Complier) : 일반적으로 소스코드를 한번에 전체적으로 분석하여 "기계어 또는 바이트(중간)코드"로 변환한 후, 실행 파일을 생성하는 프로그램. (사용 언어 : C, C ++)
인터프리터(Interpreter) : 일반적으로 소스코드를 한 줄씩 읽고, 해석하여 바로 실행하는 프로그램.(사용 언어 : Python, JavaScript)
소스파일(.java)은 javac 컴파일러로 컴파일 가능하며 바이트코드 파일(.class)이 생성된다.
바이트코드 파일을 특정 하드웨어가 이해하는 기계어로 번역하고 프로그램을 실행시키는 명령어는 java이며 해당 명령어는 JVM을 구동시킨다.
즉, 소스파일(.java) → 바이트 코드파일(.class) → 하드웨어에 맞는 기계어
javac (컴파일) 명령어 : 소스코드파일 → 바이트코드 파일 // 완전히 컴파일된 상태가 아니다.
java (자바 프로그램 실행) 명령어 : 바이트코드 파일 → 기계어 → 실행 //실행시 JIT 컴파일하며 해석(interpret)하여 실행한다.
JVM
JVM은 인터프리터와 컴파일러의 혼합된 형태이다.
인터 프리터 역할 : 자바 소스 코드는 먼저 바이트코드로 컴파일되고, JVM은 이를 한줄씩 읽으며 인터프리터 방식으로 실행한다.
JIT(Just In Time) 컴파일러 역할 : 그때 그때 바이트코드(컴파일된 자바코드)를 기계어로 변환한다.
즉, JVM은 초기에는 인터프리터 방식으로 작동하지만, 성능 최적화를 위해 JIT 컴파일러를 사용하여 필요한 부분을 컴파일하여 실행하는 하이브리드 방식이다.
JVM이 실행하는 과정 중 로딩(클래스에 메모리에 로드하는 과정)이 일어난다.
ex) 바이트코드 파일을 JVM이 해석을해서 실행을 하기위해, 바이트코드 파일을 메서드 영역에 저장
일반 어플리케이션의 코드는 OS에 종속적으로 맞물린채 기계어를 하드웨어로 바로 전달하기 때문에, 다른 OS에서 실행시키기 위해서는 애플리케이션을 그 OS에 맞게 변경해야 한다.
반면에 Java 애플리케이션은 JVM 하고만 상호작용하며 애플리케이션 코드는 JVM을 거쳐 기계어를 하드웨어로 전달하는 덕분에, OS와 하드웨어에 독립적이다. 그래서 다른 OS에서도 프로그램의 변경없이 실행이 가능하다.
단, JVM과 javac컴파일러는 OS에 종속적이기 때문에 해당 OS에 맞는 JDK를 설치해야한다.
운영체제 별로 컴파일러(javac)와 JVM은 다르다. 하지만 javac의 기능자체(컴파일)는 운영체제와 상관없이 동일하다.
즉, 운영체제에 상관없이 동일한 소스 코드(.java)로 컴파일하면 동일한 바이트코드(.class)가 생성된다.
Java 프로그램의 시작점: main 메서드
class 클래스이름 {
public static void main(String[] args) // main메서드의 선언부
{
// 실행될 문장들을 적는다.
}
}
위 main 메서드는 프로그램을 실행할 때 java.exe에 의해 호출 되며,
main 메서드의 첫문장 부터 마지막 문장까지 수행을 마치면 종료된다.
하나의 Java 애플리케이션에는 main메서드를 포함한 클래스가 반드시 하나는 있어야 하며,
Java 애플리케이션의 시작점이므로 main 메서드 없이는 Java 애플리케이션은 실행될 수 없다.
참고 자료
자바의 정석
https://www.youtube.com/watch?v=oJlCC1DutbA&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp
'모카스터디 > Java' 카테고리의 다른 글
연산자와 반복문과 조건문 (0) | 2024.10.01 |
---|---|
변수와 기본타입과 타입변환(캐스팅) (0) | 2024.09.30 |
자바 문자열 및 배열 (0) | 2024.09.14 |