Java
Java Programming Language
Write Once, Run Anywhere. JVM에서 실행되는 플랫폼 독립적 객체지향 언어. Spring으로 엔터프라이즈 개발의 표준.
Java Programming Language
Write Once, Run Anywhere. JVM에서 실행되는 플랫폼 독립적 객체지향 언어. Spring으로 엔터프라이즈 개발의 표준.
Java는 1995년 Sun Microsystems의 James Gosling이 개발한 객체지향 프로그래밍 언어입니다. 원래 가전제품용 임베디드 시스템을 위해 설계되었으나, 웹의 폭발적인 성장과 함께 엔터프라이즈 애플리케이션 개발의 핵심 언어로 자리잡았습니다. 2010년 Oracle이 Sun을 인수하면서 현재는 Oracle이 Java를 관리하고 있습니다.
Java의 핵심 철학은 "Write Once, Run Anywhere(WORA)"입니다. Java 코드는 바이트코드로 컴파일되어 JVM(Java Virtual Machine) 위에서 실행되므로, 운영체제에 관계없이 동일하게 동작합니다. 이러한 플랫폼 독립성 덕분에 Windows, Linux, macOS 어디서든 같은 애플리케이션을 실행할 수 있습니다.
Java는 강력한 타입 시스템, 자동 메모리 관리(Garbage Collection), 멀티스레딩 지원을 제공합니다. 컴파일 타임에 타입 오류를 잡아내어 런타임 안정성을 높이고, GC가 메모리 누수 문제를 자동으로 처리합니다. 이러한 특성으로 대규모 시스템에서 안정적인 운영이 가능합니다.
실무에서 Java는 Spring Framework와 함께 백엔드 서버 개발에 가장 많이 사용됩니다. 금융, 통신, 공공기관 등 미션 크리티컬한 시스템에서 검증된 안정성을 인정받고 있으며, Android 앱 개발의 공식 언어이기도 합니다. 2024년 기준 TIOBE 인덱스에서 Python, C와 함께 최상위권을 유지하며 전 세계 900만 명 이상의 개발자가 사용하고 있습니다.
// 1. 기본 클래스와 객체지향 프로그래밍
public class User {
private String name;
private String email;
public User(String name, String email) {
this.name = name;
this.email = email;
}
public String getName() { return name; }
public String getEmail() { return email; }
@Override
public String toString() {
return String.format("User{name='%s', email='%s'}", name, email);
}
}
// 2. Stream API와 람다 표현식 (Java 8+)
import java.util.List;
import java.util.stream.Collectors;
public class StreamExample {
public static void main(String[] args) {
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int sumOfEvenSquares = numbers.stream()
.filter(n -> n % 2 == 0) // 짝수만: [2, 4, 6, 8, 10]
.map(n -> n * n) // 제곱: [4, 16, 36, 64, 100]
.reduce(0, Integer::sum); // 합계: 220
System.out.println("짝수 제곱의 합: " + sumOfEvenSquares);
}
}
// 3. 비동기 처리 (CompletableFuture)
import java.util.concurrent.CompletableFuture;
public class AsyncExample {
public static CompletableFuture<User> fetchUserAsync(String userId) {
return CompletableFuture.supplyAsync(() -> {
// API 호출 시뮬레이션
return new User("홍길동", "hong@example.com");
}).thenApply(user -> {
System.out.println("사용자 조회 완료: " + user.getName());
return user;
}).exceptionally(ex -> {
System.err.println("오류 발생: " + ex.getMessage());
return null;
});
}
}
"이 서비스는 트래픽이 많고 안정성이 중요하니까 Java Spring Boot로 개발하는 게 좋겠습니다. JPA로 DB 연동하고, Redis 캐시 붙이면 성능도 충분히 나올 거예요."
"Java의 GC는 Young Generation과 Old Generation으로 힙을 나누어 관리합니다. Minor GC는 Eden 영역에서 자주 발생하고, Full GC는 Old 영역이 꽉 찼을 때 실행됩니다. G1GC를 사용하면 Stop-the-World 시간을 예측 가능하게 줄일 수 있습니다."
"여기 Optional을 사용하면 NullPointerException을 방지할 수 있어요. user.getName()을 직접 호출하지 말고 Optional.ofNullable(user).map(User::getName).orElse('Unknown')으로 변경해주세요."
객체 비교 시 `==`는 참조(메모리 주소)를 비교합니다. 문자열이나 객체의 값을 비교할 때는 반드시 `equals()` 메서드를 사용하세요. `"hello" == new String("hello")`는 false입니다.
Java에서 가장 흔한 런타임 오류입니다. null 체크를 철저히 하거나 Optional 클래스를 활용하세요. @NonNull 어노테이션과 IDE 경고를 적극 활용하는 것도 좋습니다.
멀티스레드 환경에서 안전한 코드를 위해 불변 객체를 적극 활용하세요. final 키워드, record(Java 16+), List.of() 같은 불변 컬렉션 팩토리 메서드를 사용하면 예상치 못한 상태 변경을 방지할 수 있습니다.