개발하는 햄팡이

[Java 기초] Java란? 본문

Back-End/Java

[Java 기초] Java란?

hampangee 2025. 4. 15. 10:17

1. Java의 개요

Java는 1995년 썬 마이크로시스템즈(Sun Microsystems)에서 발표된 객체 지향 프로그래밍 언어이자, 이를 기반으로 한 실행 환경(런타임)이다. James Gosling을 비롯한 팀이 설계한 Java는 “Write Once, Run Anywhere”(한 번 작성하면 어디서나 실행 가능)라는 슬로건 아래, 플랫폼에 독립적인 개발을 목표로 만들어졌다.

 

2. Java의 주요 특징

  1. 플랫폼 독립성
    Java 바이트코드로 컴파일 → JVM에서 실행 JVM만 설치되어 있으면 어디서나 실행 가능
    Python 소스코드(또는 바이트코드) 인터프리트 인터프리터가 설치된 환경에서만 실행
    C++ 네이티브 머신코드로 컴파일 플랫폼별로 별도 컴파일 필요
    • Java 컴파일러(javac)는 소스 코드를 바이트코드(.class 파일)로 변환.
    • 이 바이트코드는 JVM(Java Virtual Machine)이 설치된 어떤 운영체제에서도 동일하게 실행된다.
      • Java는 .class 바이트코드를 JVM이 해석하기 때문에, Windows/Mac/Linux 구분 없이 “한 번 작성하면 어디서나 실행”이 가능
  2. 객체 지향(Object‑Oriented) 언어
    • 모든 코드가 클래스(class) 단위로 구성되며, 상속(inheritance), 캡슐화(encapsulation), 다형성(polymorphism) 등의 OOP 원칙을 따라야 함.
    • 유지보수에 용이하다.
  3. 자동 메모리 관리(Garbage Collector)
    • 개발자가 직접 메모리를 해제할 필요 없이, JVM이 사용하지 않는 객체를 자동으로 수집.
    • C는 개발자가 메모리를 직접 관리하여 최적화를 할 수 있다는 장점이 있지만 메모리 누수, 이중 해제 등의 위험이 있다.
    • Python도 Java와 같이 Garbade Collector가 존재하지만 메모리 구조나 GC의 동작 차이로 인해 Java의 GC는 다양한 옵션을 선택할 수 있지만 Python은 오버헤드가 발생할 수 있다.
  4. 강력한 표준 라이브러리
    • 컬렉션, 네트워킹, 파일 입출력, 스레딩, GUI, 데이터베이스 연동(JDBC) 등 방대한 표준 API를 제공
    • Java는 기업용 웹·엔터프라이즈 시스템에 강하며, 안정적이고 방대한 프레임워크가 특징
    • Python은 데이터 과학·머신러닝, 스크립팅에 특화된 생태계가 발달해 있다.
  5. 멀티스레딩 지원
    • Thread 클래스와 java.util.concurrent 패키지를 통해 동시성 프로그래밍을 간편하게 구현할 수 있음
  6. 안전성 & 보안성
    • JVM의 바이트코드 검증, 클래스 로더(class loader) 분리, 보안 매니저(Security Manager) 등을 통해 외부 코드 실행 시에도 안전성을 보장

3. Java의 역사와 발전

1991년 Green 프로젝트 시작
1995년 Java 1.0 발표 (“Write Once, Run Anywhere” 등장)
1998년 Java 2 플랫폼(J2SE) 출시
2004년 Java 5(Generics, 애노테이션, 향상된 for문, enum 추가)
2006년 OpenJDK 오픈소스 공개
2011년 Oracle, Sun Microsystems 인수
2014년 Java 8(람다 표현식 및 스트림 API, java.time 패키지 추가)
2018년 Java 11(Http Client API 표준화)

 

4. JDK, JRE, JVM

4.1. JVM (Java Virtual Machine)

 

  • 역할
    • 바이트코드(.class 파일)를 해석·실행하는 런타임 엔진
    • 메모리 영역(Heap, Stack, Metaspace 등) 관리
    • 가비지 컬렉션(GC)을 통해 객체 메모리 해제
  • 구성 요소
    1. Class Loader Subsystem
      • .class 파일을 읽어들여 JVM 메모리로 로드
      • Bootstrap, Extension, Application 클래스 로더로 구분
    2. Runtime Data Areas
      • Method Area: 클래스 메타데이터, 상수 풀, static 변수
      • Heap: 모든 객체 인스턴스 저장
      • Stack: 각 스레드별 호출 프레임, 로컬 변수 및 연산 스택
      • PC Register: 현재 실행 중인 바이트코드 주소 저장
      • Native Method Stack: 네이티브(C/C++) 코드 호출용 스택
    3. Execution Engine
      • Interpreter: 바이트코드를 한 줄씩 해석 실행
      • JIT Compiler: 자주 실행되는 바이트코드를 네이티브 코드로 변환하여 성능 최적화
    4. Garbage Collector
      • 세대별(Young/Old) 혹은 region 기반(G1, ZGC 등)으로 자동 메모리 회수

4.2. JRE (Java Runtime Environment)

  • 역할
    • JVM과 Java 표준 라이브러리(API)를 묶은 실행 환경
    • 개발 없이 “Java 애플리케이션 실행”만 필요할 때 설치
  • 구성 요소
    1. JVM 구현체 (위 1번)
    2. Core Libraries
      • java.lang, java.util, java.io, java.net, java.nio 등
    3. Runtime Tools
      • java(애플리케이션 실행), javaw(윈도우 GUI용)

4.3. JDK (Java Development Kit)

  • 역할
    • Java 애플리케이션 개발에 필요한 도구 모음
  • 구성 요소
    1. JRE (위 2번)
    2. Compiler (javac)
      • .java 소스 코드를 바이트코드(.class)로 컴파일
    3. Development Tools
      • jar: 클래스와 리소스를 JAR(Java ARchive) 파일로 패키징
      • javadoc: 소스 주석을 기반으로 API 문서 생성
      • jdb: Java 디버거
      • javap: 바이트코드 디스어셈블러
      • jconsole, jvisualvm: 런타임 모니터링·프로파일링 도구
    4. Additional Libraries & Headers
      • 네이티브 코드(Native) 연동을 위한 jni.h 헤더 등