Java

Java는 오라클에서 배포하는 자바 개발 도구(JDK: Java Development Kit)를 통해,
자바로 프로그램을 쉽게 개발할 수 있도록 기술적 지원을 하고 있습니다.
Java는 다음과 같은 특징을 가지고 있습니다.
1. 모든 운영체제에서 호환
Write once, run anywhere
한 번 쓰면, 어디서든 실행된다
Sun Microsystems
Java의 슬로건 같이, Java로 작성된 프로그램은 JDK만 지원한다면
흔히 사용하는 운영체제인 Windows, MacOS 뿐만 아니라,
Linux에서도 프로그램을 수정하지 않고 실행할 수 있다는 특징이 있습니다.
2. 객체 지향 프로그래밍
절차 지향인 C에서 파생된 객체 지향 프로그래밍 언어인 C++과 달리,
Java는 처음부터 객체 지향 프로그래밍을 위해 설계되었기 때문에 객체 지향 프로그래밍을 위한 최적의 언어입니다.
3. 메모리 자동 정리
Java는 가비지 컬렉터(Garbage Collector)를 통해 메모리를 자동으로 정리합니다.
사용자가 더 이상 사용하지 않는 변수, 객체, 메소드 등을 자동으로 감지하여 해제합니다.
C++과 같은 다른 언어는 메모리를 할당하고 해제하는 작업을 해야하지만,
Java는 수고를 덜어주어 개발자가 프로그램의 핵심 기능에만 더 집중할 수 있게 해줍니다.
Java 가상 머신(JVM)
Java는 모든 운영체제에서 실행이 가능하다고 했지만,
‘JVM(Java Virtual Machine)이 지원이 된다’는 전제 조건이 있어야 합니다.
Java를 실행하기 위해서는 JVM이 필수적으로 설치되어 있어야 합니다.

사용자가 만든 Java 소스 코드는 javac(Java compiler)를 통해 컴파일* 되어 바이트코드**로 변환합니다.
JVM은 Java 프로그램이 실행되는 가상 환경을 제공하고,
모든 OS에서 동일하게 실행될 수 있는 언어인 Java 바이트코드를 해석하고 실행***합니다.
즉, Java의 경우, 컴파일과 실행이 분리되어 있기 때문에 OS에 독립적일 수 있다는 특징을 가지게 된 것입니다.
JVM는 4개의 요소로 구분되어 있습니다.

Class Loader
바이트코드를 동적으로 로드하고 JVM 내부의 메모리에 배치합니다.
Garbage Collector
더 이상 사용하지 않는 객체 및 함수를 자동으로 해제해, 메모리를 관리합니다.
직접 메모리를 해제해야하는 C++과 달리 Java는 자동으로 해제하므로,
메모리를 직접 관리할 수 있는 기능을 제공하지 않습니다.
Execution Engine
바이트코드를 실행하는 역할을 담당합니다.
주로, 인터프리터와 JIT 컴파일러로 구성되는데, 전자의 경우는 코드를 한 줄씩 해석하여 실행하고,
반복되는 코드 영역을 기계어로 컴파일하여 실행 속도를 향상시킵니다.
Runtime Data Area
JVM이 프로그램을 실행하는 동안 사용하는 메모리 영역입니다.
컴파일(Compile)*: 소스 코드를 컴퓨터가 이해할 수 잇는 언어인 기계어로 변환하는 과정
바이트코드(Bytecode)**: 고급 언어로 작성된 소스 코드를 가상머신이 이해할 수 있는 중간 코드
실행(Execution)***: 컴파일된 프로그램이 실제로 실행하는 것
JDK와 JRE
결론부터 말하자면, JRE는 JDK에 포함되어 있습니다.
JRE(Java Runtime Environment)는 Java 프로그램을 실행하기 위해
필요한 런타임 환경을 제공하는 소프트웨어로, 여기에는 JVM이 포함됩니다.
개발 도구 및 컴파일러가 포함되지 않기 때문에, Java 프로그램을 실행만 하려는 사용자가 설치합니다.
JDK(Java Development Kit)는 Java 프로그래밍을 위해 사용하는 개발 키트로,
개발 도구 및 라이브러리를 제공합니다.
Java로 개발을 하기 위해서는 JDK가 필요합니다.
개발자가 개발을 하기 위해 요구하는 통합 키트이므로,
당연히 Java 프로그램을 실행하는 소프트웨어인 JRE가 포함되는 것입니다.
JIT 컴파일
Java는 실행될 때, 바이트코드로 변환된 후 다시 기계어로 번역되기 때문에 다른 언어들에 비해 실행 속도가 길다는 단점이 있습니다.
이를 보완하기 위해 등장한 것이 바로 JIT(Just In Time) 컴파일러입니다.
JIT 컴파일러는 프로그램을 실행할 때, 필요한 부분을 즉석으로 컴파일하는 방식으로,
인터프리터 언어의 느린 실행 속도를 높이기 위해 사용됩니다.
쉽게 말해서, JIT 컴파일러 바이트코드를 기계어로 변환하여 실행하는데,
이때 반복되는 코드 영역을 기계어로 컴파일 후 캐시에 저장합니다.
캐시에 저장된 코드는 나중에 같은 코드가 다시 실행될 때 재사용되므로, 실행 속도가 향상됩니다.
하지만, 소스 코드가 짧을수록 반복되는 코드가 줄어드는 경향이 있기 때문에,
JIT 컴파일러의 장점이 희석된다는 단점이 있으나,
이 경우에는 일반적인 컴파일과 의미 있는 속도 차이를 내지는 않으므로 크게 신경 써야할 부분은 아닙니다.
Java 소스 코드 컴파일 및 실행
Java로 프로그래밍을 하기 위해 우선, IDE가 필요합니다.
Java IDE로는, Eclipse, Intellij, VS code를 사용할 수 있습니다.
JDK는 OpenJDK와 Oracle JDK가 있습니다.
JDK 설치시 버전이 여러 개가 있을 텐데,
가장 최신 버전보다는 최신 장기 지원(LTS: Long Term Support) 버전을 사용하는 것이 좋습니다.
장기 지원 버전은 안정성에 초점을 맞춘 버전으로, 다른 버전보다 신기능이 부족할 수 있지만,
보안 업데이트를 길게 해주는 버전입니다.
글을 쓰고 있는 시점으로, JDK 21이 최신 LTS 버전입니다.
Java를 통해, 코딩 공부의 시작을 알리는 ‘Hello, World!’를 출력하는 프로그램입니다.
우선, 이 코드는 사용자가 지정한 WEEK1이라는 패키지(Package)에 속해 있습니다.
패키지란, 자바 클래스를 모아놓은 디렉토리(폴더)입니다.
이름이 같은 파일이라도, 다른 디렉토리에 있다면 사용 가능하듯,
이름이 같은 클래스라고 하더라도, 다른 패키지에 저장되어 있다면 정상적으로 사용할 수 있습니다.
특정 패키지에 속해 있다면, 가장 위에, ‘package (패키지명);’을 명시하면 됩니다.
코드가 어떤 패키지에도 속하지 않는 경우, 기본 패키지(Default Package)에 생성됩니다.
클래스(Class)란, 객체를 만들어내는 틀이고, main() 메소드를 가진 클래스를 실행 클래스라고 부릅니다.
클래스를 선언할 경우, public 제어자를 가진 클래스명은 소스 파일명과 동일해야 한다는 특징을 가집니다.
public과 같은 접근 제어자는 추후에 다룹니다.
객체(Object)는 자료를 저장하고 특정 기능을 수행합니다.
자료를 저장하기 위해서는 변수가 필요할 것이고, 특정 기능을 하기 위해서는 함수가 필요합니다.
즉, 객체는 변수와 메소드를 묶은 것입니다.
메소드(Method)는 객체 내의 함수를 의미합니다.
Java를 통해 바이트 코드 파일을 실행한다면, 클래스 블록 내부에 있는 main() 메소드를 실행하게 되며,
이는 프로그램 실행 진입점(Entry Point)이라고 부릅니다.
코드를 실행하게 된다면, 바이트코드가 생성됩니다.
바이트코드는 '.class'라는 확장자명을 가지며, 이 코드를 실행한 경우에도 동일한 결과가 출력됩니다.
정리
작성자도 마찬가지로 Java를 공부하고 있기 때문에, 설명이 불친절하거나 부정확할 수도 있습니다.
또한, 1주일마다 파트를 나눠서 공부한 것이기 때문에, 패키지마다 'WEEK0'가 붙습니다.
Java 1주차부터, 어려운 개념과 복잡한 설명이 많아 이해하기 어려웠겠지만,
Java를 배우기로 한 이상, Java의 작동 방식과 구조는 반드시 이해하고 넘어가야 합니다.
개념을 정확히 이해하면, 등장하는 어려운 코드의 작동 방식도 쉽게 이해할 수 있을 것입니다.
지금은 가장 기초적인 부분이므로, Java를 간단히 다루었고 추후에 기회가 된다면,
심층적으로 공부할 예정입니다.
다음 주차에는 '변수와 자료명'을 다룹니다.
'Java > 기본 개념' 카테고리의 다른 글
| 6. 클래스와 객체 (1) (0) | 2024.05.23 |
|---|---|
| 5. 조건문과 반복문 (0) | 2024.05.20 |
| 4. 연산자 (0) | 2024.05.17 |
| 3. 변수와 자료명 (2) (0) | 2024.05.16 |
| 2. 변수와 자료명 (1) (1) | 2024.05.15 |