본문으로 건너뛰기

Ch 1.1 자바(Java) 개요

대상 버전: Java 17 / 21 (LTS) 공식 문서: Oracle Java Documentation

자바는 1995년 썬 마이크로시스템즈(Sun Microsystems)에서 발표한 객체지향 프로그래밍 언어입니다. 현재는 오라클(Oracle)에서 관리하고 있으며, 엔터프라이즈 서버, 안드로이드 앱, 빅데이터 시스템 등 다양한 분야에서 사용되고 있습니다.


1. 자바란?

자바는 "Write Once, Run Anywhere"(한 번 작성하면 어디서든 실행된다)라는 철학을 가지고 설계되었습니다. 이는 자바 바이트코드가 특정 하드웨어가 아닌 JVM(Java Virtual Machine) 위에서 실행되기 때문입니다.

자바 코드(.java 파일)를 작성하면 컴파일러가 이를 바이트코드(.class 파일)로 변환하고, 이 바이트코드는 각 운영체제에 맞는 JVM이 실행합니다. 따라서 윈도우에서 작성한 프로그램이 리눅스, macOS에서도 동일하게 동작합니다.

소스코드(.java) → javac 컴파일러 → 바이트코드(.class) → JVM → 실행
노트

자바는 성능과 안정성, 그리고 생산성 사이의 균형이 매우 잘 잡힌 언어로 평가받습니다. 전 세계 취업 시장에서 가장 수요가 높은 언어 중 하나입니다.


2. 자바의 역사

자바는 30년 이상의 역사를 가진 성숙한 언어입니다.

연도버전주요 사건
1991Oak제임스 고슬링(James Gosling)이 가전제품 제어용 언어 'Oak' 프로젝트 시작
1995Java 1.0'Java'라는 이름으로 공식 발표. 웹 브라우저 Applet으로 폭발적 인기
1997Java 1.1내부 클래스, JDBC, RMI 도입
2004Java 5제네릭, 어노테이션, 향상된 for문, 오토박싱 도입
2006Java 6성능 개선, 웹 서비스 지원 강화
2010-오라클이 썬 마이크로시스템즈를 인수
2011Java 7try-with-resources, 다이아몬드 연산자 도입
2014Java 8 LTS람다 표현식, 스트림 API, Optional, 날짜/시간 API 도입 (대규모 패러다임 전환)
2017Java 9모듈 시스템(JPMS) 도입, 6개월 릴리즈 주기로 변경
2018Java 11 LTSHTTP Client API, var 키워드 확장, 무료 Oracle JDK 변경
2021Java 17 LTSsealed class, pattern matching, record 클래스 정식 도입
2023Java 21 LTS가상 스레드(Virtual Thread), sequenced collections, record pattern

LTS(Long Term Support) 버전은 장기 지원이 보장되어 실무에서 주로 사용합니다. 현재 기준으로 Java 21 LTS 가 최신 LTS 버전이며, 학습에 추천합니다.


3. 주요 LTS 버전별 핵심 기능

Java 8 (2014) - 패러다임의 전환

Java 8은 함수형 프로그래밍 패러다임을 대거 도입하며 자바의 역사를 바꾼 버전입니다.

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Java8Features {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

// Java 8 이전 방식
List<Integer> evensBefore = new java.util.ArrayList<>();
for (int n : numbers) {
if (n % 2 == 0) evensBefore.add(n);
}

// Java 8 람다 + 스트림 방식
List<Integer> evens = numbers.stream()
.filter(n -> n % 2 == 0) // 짝수만 필터링
.collect(Collectors.toList());

System.out.println("짝수 목록: " + evens); // [2, 4, 6, 8, 10]
}
}

Java 8 주요 기능:

  • 람다 표현식 (Lambda Expression)
  • 스트림 API (Stream API)
  • Optional 클래스
  • 새로운 날짜/시간 API (java.time 패키지)
  • 인터페이스 default 메서드

Java 11 (2018) - 현대적 API 정착

public class Java11Features {
public static void main(String[] args) {
// 문자열 API 개선
String text = " Hello, Java! ";
System.out.println(text.strip()); // "Hello, Java!" (앞뒤 공백 제거)
System.out.println(text.isBlank()); // false
System.out.println("".isBlank()); // true

// 여러 줄 문자열 반복
"Java\n".repeat(3).lines()
.forEach(System.out::println);
}
}

Java 17 (2021) - Record와 패턴 매칭

// record: 불변 데이터 클래스를 간결하게 정의
record Point(int x, int y) {}

// sealed class: 상속 가능한 클래스를 제한
sealed interface Shape permits Circle, Rectangle {}
record Circle(double radius) implements Shape {}
record Rectangle(double width, double height) implements Shape {}

public class Java17Features {
public static void main(String[] args) {
Point p = new Point(3, 4);
System.out.println("x=" + p.x() + ", y=" + p.y()); // x=3, y=4

Shape shape = new Circle(5.0);

// 패턴 매칭 (instanceof)
if (shape instanceof Circle c) {
System.out.println("원의 반지름: " + c.radius());
}
}
}

Java 21 (2023) - 가상 스레드와 미래

public class Java21Features {
public static void main(String[] args) throws InterruptedException {
// 가상 스레드(Virtual Thread): 경량 스레드로 대규모 동시성 처리
Thread vThread = Thread.ofVirtual().start(() -> {
System.out.println("가상 스레드에서 실행 중: " + Thread.currentThread());
});
vThread.join();

// sequenced collections: 순서 있는 컬렉션 인터페이스
var list = new java.util.ArrayList<>(java.util.List.of("a", "b", "c"));
System.out.println("첫 번째: " + list.getFirst()); // a
System.out.println("Last: " + list.getLast()); // c
}
}

4.4 멀티스레드 지원

자바는 언어 차원에서 멀티스레드 프로그래밍을 지원합니다.

4.5 강한 타입 시스템 (Strongly Typed)

자바는 컴파일 시 타입 검사를 엄격하게 수행하여 런타임 오류를 미리 방지합니다.

int number = 42;
String text = "Hello";
// number = text; // 컴파일 에러! 타입 불일치

5. JDK, JRE, JVM 차이점

자바 생태계에서 자주 등장하는 세 가지 용어를 명확히 구분해야 합니다.

JDK, JRE, JVM 차이점

구분역할대상
JVM바이트코드를 OS 기계어로 변환하여 실행자바 런타임 핵심 엔진
JREJVM + 표준 라이브러리 (자바 프로그램 실행 가능)자바 프로그램 사용자
JDKJRE + 개발 도구(javac, javadoc, jar 등)자바 개발자
경고

Java 11부터 JRE가 별도 배포되지 않습니다. 개발자와 사용자 모두 JDK를 설치해야 합니다.


6. JVM 내부 구조

JVM은 단순한 실행 엔진이 아니라 여러 하위 시스템으로 구성된 정교한 가상 머신입니다.

JVM 내부 구조

6.1 Class Loader (클래스 로더)

.class 파일을 JVM 메모리에 적재합니다. 세 단계로 구성됩니다.

  • Bootstrap ClassLoader: JDK 핵심 라이브러리(java.lang 등) 로드
  • Extension ClassLoader: 확장 라이브러리 로드
  • Application ClassLoader: 개발자가 작성한 클래스 로드

6.2 Runtime Data Area (런타임 데이터 영역)

JVM이 프로그램을 실행하는 동안 사용하는 메모리 공간입니다.

영역저장 데이터공유 범위
Heapnew로 생성된 객체, 배열모든 스레드 공유
Stack메서드 호출 정보, 지역 변수, 매개변수스레드별 독립
Method Area클래스 구조, static 변수, 상수 풀모든 스레드 공유
PC Register현재 실행 중인 명령어 주소스레드별 독립
Native Method StackC/C++ 네이티브 메서드 실행 정보스레드별 독립

6.3 JIT 컴파일러 (Just-In-Time Compiler)

자바는 처음에 인터프리터 방식으로 바이트코드를 한 줄씩 실행합니다. JIT 컴파일러는 자주 실행되는 코드(핫스팟)를 발견하면 이를 네이티브 기계어로 컴파일하여 캐싱합니다. 이를 통해 반복 실행 시 C/C++에 근접한 성능을 달성합니다.

6.4 Garbage Collector (가비지 컬렉터)

더 이상 참조되지 않는 객체를 Heap 메모리에서 자동으로 제거합니다.

public class GcExample {
public static void main(String[] args) {
// 객체 생성 - Heap에 할당
String s1 = new String("Hello");
String s2 = new String("World");

s1 = null; // s1이 참조하던 "Hello" 객체는 GC 대상이 됨

System.gc(); // GC 실행 요청 (보장은 안 됨)
System.out.println(s2); // World
}
}

7. 자바 컴파일 과정 상세

1단계: 소스코드 작성
Hello.java

2단계: javac 컴파일 (Java Compiler)
javac Hello.java
→ Hello.class (바이트코드 생성)

3단계: JVM 로드
java Hello
→ Class Loader가 Hello.class를 메모리에 로드

4단계: 바이트코드 검증 (Bytecode Verifier)
→ 유효하지 않거나 위험한 코드 검사

5단계: 실행 (Execution Engine)
→ Interpreter: 바이트코드를 한 줄씩 실행
→ JIT Compiler: 핫스팟 코드를 네이티브로 컴파일

6단계: 화면 출력
Hello, Java LLC!

8. 자바 생태계 지도

자바는 단순한 언어를 넘어 광대한 생태계를 형성하고 있습니다.

백엔드 웹 개발

  • Spring / Spring Boot: 가장 널리 사용되는 자바 웹 프레임워크
  • Jakarta EE (구 Java EE): 엔터프라이즈 표준 플랫폼
  • Quarkus, Micronaut: 클라우드 네이티브 경량 프레임워크

안드로이드 앱 개발

  • 안드로이드 앱의 공식 언어는 Kotlin이지만, 자바도 완전 지원
  • Android SDK 대부분이 자바로 작성됨

빅데이터 / 분산 시스템

  • Apache Hadoop: 분산 데이터 처리 플랫폼
  • Apache Kafka: 고성능 메시지 스트리밍 플랫폼
  • Apache Spark: 대규모 데이터 분석 엔진
  • Elasticsearch: 분산 검색 엔진

데이터베이스 / 검색

  • JDBC: 자바 데이터베이스 연결 표준 API
  • Hibernate / JPA: 객체-관계 매핑(ORM) 프레임워크

빌드 도구

  • Maven: XML 기반 빌드 및 의존성 관리
  • Gradle: Groovy/Kotlin DSL 기반 현대적 빌드 도구

9. 자바 vs 다른 언어 비교

특성JavaC++PythonKotlin
패러다임OOPOOP + 절차적멀티패러다임OOP + 함수형
메모리 관리자동(GC)수동자동(GC)자동(GC)
타입 시스템정적 타입정적 타입동적 타입정적 타입
실행 방식JVM 바이트코드네이티브인터프리터JVM 바이트코드
성능높음매우 높음보통높음
학습 난이도보통높음쉬움보통
주요 용도백엔드, 안드로이드시스템, 게임데이터 과학, AI안드로이드, 백엔드
취업 시장매우 넓음넓음매우 넓음성장 중
노트

Kotlin과 Java의 관계: Kotlin은 JVM 위에서 실행되며 Java와 100% 상호 운용됩니다. 안드로이드에서는 Kotlin이 공식 언어이지만, Java의 풍부한 라이브러리와 생태계를 그대로 활용할 수 있습니다.


10. 자바를 배워야 하는 이유

취업 시장

  • 국내 대기업 및 SI 업체의 백엔드 서버 상당수가 Spring(Java/Kotlin) 기반
  • TIOBE, Stack Overflow 등 주요 개발자 설문에서 지속적으로 상위권 유지
  • 안드로이드, 핀테크, 공공기관 시스템 등 다양한 분야에서 수요 높음

언어 학습의 토대

  • 자바의 객체지향 개념을 이해하면 C#, Kotlin, Swift 등 학습이 훨씬 쉬워짐
  • 엄격한 타입 시스템은 코드 품질과 설계 능력을 향상시킴
  • 컴파일, JVM, GC 등의 개념은 컴퓨터 과학 이해에 도움

풍부한 학습 자료

  • 30년 역사로 인해 책, 강의, 블로그, StackOverflow 답변 등 학습 자료가 방대함
  • 커뮤니티가 크고 활발하여 문제 해결이 용이함

11. 첫 번째 자바 프로그램

자바의 기본 구조를 이해하는 가장 좋은 방법은 직접 작성해보는 것입니다.

/**
* 첫 번째 자바 프로그램 - Hello World
* 자바의 기본 구조를 보여주는 예제입니다.
*/
public class HelloWorld {

/**
* 프로그램의 시작점 (Entry Point)
* JVM은 프로그램 실행 시 가장 먼저 이 메서드를 찾습니다.
*
* @param args 명령줄 인수 배열
*/
public static void main(String[] args) {
// 콘솔에 텍스트 출력 (줄바꿈 포함)
System.out.println("Hello, Java!");

// 자바 버전 정보 출력
System.out.println("현재 자바 버전: " + System.getProperty("java.version"));

// 운영체제 정보 출력
System.out.println("운영체제: " + System.getProperty("os.name"));
}
}

출력 결과:

Hello, Java!
현재 자바 버전: 21.0.2
운영체제: Windows 11

코드 구조 설명

  • public class HelloWorld: 클래스 선언. 파일명(HelloWorld.java)과 반드시 일치해야 함
  • public static void main(String[] args): 프로그램 진입점. 이 형태를 정확히 지켜야 JVM이 인식
  • System.out.println(...): 표준 출력 스트림에 텍스트 출력
  • System.getProperty(...): JVM 시스템 속성 조회 메서드

자바 학습 로드맵:

  1. 기본 문법 (변수, 조건문, 반복문) → Ch 1~3
  2. 객체지향 개념 (클래스, 상속, 인터페이스) → Ch 4~6
  3. 핵심 API (컬렉션, 스트림, 예외 처리) → Ch 7~10
  4. 실전 프로젝트 (파일 처리, 네트워킹, DB 연동) → Ch 11~15

각 단계를 충분히 이해하고 코드를 직접 작성해보는 것이 중요합니다!


요약

항목내용
탄생1995년 썬 마이크로시스템즈
철학Write Once, Run Anywhere
실행 방식JVM 위의 바이트코드
현재 최신 LTSJava 21 (2023년)
주요 용도백엔드 서버, 안드로이드, 빅데이터
핵심 특징OOP, 플랫폼 독립성, 자동 메모리 관리