Java는 1995년 Sun Microsystems(현 Oracle)가 발표한 객체지향 프로그래밍 언어다. "Write Once, Run Anywhere(한 번 작성하면 어디서나 실행)"를 슬로건으로, JVM(Java Virtual Machine) 위에서 실행되어 플랫폼 독립성을 제공한다. 엔터프라이즈 백엔드, Android 앱, 빅데이터 등 광범위한 분야에서 사용된다.
핵심 특징
| 특징 | 설명 |
|---|
| 플랫폼 독립성 | 소스코드 → 바이트코드 → JVM 실행 (OS 무관) |
| 객체지향 | 클래스·상속·다형성·캡슐화 완전 지원 |
| 정적 타입 | 컴파일 시 타입 검사 → 런타임 오류 감소 |
| 자동 메모리 관리 | GC(Garbage Collector)가 메모리 자동 해제 |
| 멀티스레드 | 표준 라이브러리에서 동시성 지원 |
| 강한 보안 | 샌드박스 모델, 바이트코드 검증 |
JVM 동작 원리
소스코드(.java)
↓ javac (컴파일러)
바이트코드(.class)
↓ JVM (Java Virtual Machine)
기계어 실행 (OS별 JVM이 번역)
JVM은 OS마다 별도로 존재하지만, 바이트코드는 동일하므로 플랫폼 독립성이 보장된다.
기본 문법
java
// Hello World
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
java
// 클래스와 객체
public class Person {
private String name; // 캡슐화
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
@Override
public String toString() {
return name + " (" + age + "세)";
}
}
Person p = new Person("김철수", 30);
System.out.println(p); // 김철수 (30세)
상속과 다형성
java
abstract class Shape {
abstract double area();
}
class Circle extends Shape {
double radius;
Circle(double r) { this.radius = r; }
@Override
double area() { return Math.PI * radius * radius; }
}
class Rectangle extends Shape {
double w, h;
Rectangle(double w, double h) { this.w = w; this.h = h; }
@Override
double area() { return w * h; }
}
Shape[] shapes = { new Circle(5), new Rectangle(3, 4) };
for (Shape s : shapes) {
System.out.println(s.area()); // 다형성
}
제네릭 (Generics)
java
// 타입 안전한 컨테이너
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
Map<String, Integer> scores = new HashMap<>();
scores.put("Alice", 95);
scores.get("Alice"); // 95
스트림 API (Java 8+)
java
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 짝수만 필터 → 제곱 → 합산
int result = numbers.stream()
.filter(n -> n % 2 == 0)
.mapToInt(n -> n * n)
.sum();
// 4+16+36+64+100 = 220
동시성 (Concurrency)
java
// Thread 생성
Thread t = new Thread(() -> {
System.out.println("별도 스레드 실행");
});
t.start();
// ExecutorService (스레드 풀)
ExecutorService executor = Executors.newFixedThreadPool(4);
executor.submit(() -> processTask());
executor.shutdown();
// 세마포어
Semaphore semaphore = new Semaphore(3);
semaphore.acquire(); // P 연산
try {
// 임계 구역
} finally {
semaphore.release(); // V 연산
}
Java 버전별 주요 변화
| 버전 | 연도 | 주요 기능 |
|---|
| Java 5 | 2004 | 제네릭, 어노테이션, 오토박싱 |
| Java 8 | 2014 | 람다, 스트림 API, Optional, 새 날짜 API |
| Java 11 | 2018 | LTS, var 키워드, HTTP Client API |
| Java 17 | 2021 | LTS, sealed class, 패턴 매칭 |
| Java 21 | 2023 | LTS, 가상 스레드(Virtual Thread), 레코드 패턴 |
주요 프레임워크 & 생태계
Java vs 타 언어 비교
가상 스레드 (Java 21+)
java
// 기존 OS 스레드 대신 경량 가상 스레드 사용
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
IntStream.range(0, 10_000).forEach(i ->
executor.submit(() -> {
Thread.sleep(Duration.ofSeconds(1));
return i;
})
);
}
// 10만 개의 동시 작업도 효율적으로 처리
관련 개념
- •객체지향 프로그래밍 — Java가 기반하는 핵심 패러다임
- •JVM — Java 바이트코드 실행 환경
- •세마포어 — Java Semaphore 클래스로 동시성 제어
- •해시맵 — Java HashMap 구현
- •스택 — Java Stack, Deque 구현
- •큐 — Java Queue, LinkedList 구현
참고문헌
- •Gosling, J. et al. (2022). The Java Language Specification, Java SE 21 Edition
- •Bloch, J. (2018). Effective Java, 3rd Edition
- •Horstmann, C. (2021). Core Java, Volume I & II