language/java

[자바프로그래밍] 01_자바 특징과 역사

렁치 2026. 7. 1. 05:30

자바는 "한 번 작성하면 어디서든 돌아가는" 언어로 유명하다. 이 한마디에 자바를 이해하는 거의 모든 것이 담겨 있다. 이 글에서는 자바가 왜 그렇게 설계됐는지, 그 핵심인 JVM과 바이트코드가 무엇인지, 그리고 자바를 특징짓는 성질들을 정리한다.


1. 자바의 탄생 배경

자바의 역사
1991년 썬 마이크로시스템즈의 제임스 고슬링이 주도한 Green Project에서 시작됐고(초기 이름 OAK), 1995년 Java로 발표되어 인터넷 시대와 함께 대중화됐다. 2009년 오라클이 썬을 인수해 지금에 이른다.

자바가 풀려던 핵심 문제는 플랫폼 호환성이었다. 기존 언어는 OS나 하드웨어가 다르면 소스를 다시 컴파일하거나 고쳐야 했다. 윈도우용으로 짠 프로그램이 맥에서 안 도는 것이다.


2. 플랫폼 독립성: WORA와 JVM

WORA (Write Once, Run Anywhere)
한 번 작성한 자바 프로그램을 OS·하드웨어에 상관없이 모든 플랫폼에서 실행할 수 있다는 자바의 핵심 철학이다.

 

 

이걸 가능하게 하는 게 JVM(Java Virtual Machine)이다. 자바의 실행 흐름은 다른 언어와 다르다.

  • 자바 소스(.java)를 컴파일하면 특정 플랫폼용 실행 파일이 아니라, 플랫폼 독립적인 바이트코드(.class)가 생성된다.
  • 이 바이트코드를 각 플랫폼에 맞는 JVM이 읽어 실행한다.

즉 "프로그램은 플랫폼을 모르고, 플랫폼마다 다른 JVM이 그 차이를 흡수한다"는 구조다. 그래서 같은 .class 파일이 윈도우·맥·리눅스 어디서든 그 위의 JVM만 있으면 돌아간다. .exe 같은 OS 전용 실행 파일이 없고, main() 메서드를 가진 클래스부터 실행이 시작된다.


3. 자바의 특징

WORA 외에도 자바를 특징짓는 성질들이 있다.

  • 객체 지향 언어: 클래스·객체·캡슐화·상속·다형성을 지원한다.
  • 캡슐화 기반 보안: 모든 변수와 메서드가 클래스 안에 선언되어, 코드가 구조적으로 보호된다.
  • 멀티스레드 지원: 동시에 여러 작업을 처리하는 기능을 언어 차원에서 제공한다.
  • 가비지 컬렉션: 사용하지 않는 메모리를 JVM이 자동으로 회수한다.
가비지 컬렉션: 메모리를 알아서 정리
C/C++에서 malloc/new로 빌린 메모리를 직접 free/delete로 갚아야 했던 것과 달리, 자바는 안 쓰는 객체를 JVM이 자동으로 찾아 회수한다. 메모리 누수 부담이 크게 줄어 개발이 편해지는 대신, 회수 시점을 개발자가 완전히 통제하지는 못한다.

4. 소스 파일과 클래스 파일의 관계

 

하나의 소스 파일에 여러 클래스를 쓸 수 있지만, 규칙이 있다.

  • 한 파일에 public 클래스는 하나만 둘 수 있다(보통 main()을 포함한 클래스).
  • 소스 파일 이름은 그 public 클래스 이름과 같아야 한다.
  • 컴파일하면 클래스마다 별도의 .class 파일이 생긴다.
public class A { ... }   // A.java → A.class
class B { ... }          //        → B.class

 

"파일명 = public 클래스명"이라는 규칙은 자바를 처음 배울 때 가장 자주 부딪히는 컴파일 오류의 원인이기도 하다.


한 걸음 더

  • 자바가 "컴파일 언어이면서 인터프리터 언어"인 점이 독특하다. 소스를 바이트코드로 컴파일(앞 단계)한 뒤, JVM이 그 바이트코드를 한 줄씩 해석 실행(뒤 단계)한다. C(완전 컴파일)와 파이썬(완전 인터프리터)의 중간인 셈인데, 이 구조 덕에 플랫폼 독립성과 어느 정도의 속도를 동시에 얻는다.
  • "한 번 인터프리터를 거치면 느리지 않나?" 하는 의문은 타당하다. 그래서 현대 JVM은 자주 실행되는 바이트코드를 실행 중에 기계어로 번역해 캐싱하는 JIT(Just-In-Time) 컴파일을 쓴다. 덕분에 자바는 순수 인터프리터 언어보다 훨씬 빠르게, 때로는 C에 근접한 속도를 낸다.
  • WORA는 이상이고 현실엔 "한 번 작성, 어디서나 테스트(Write Once, Test Everywhere)"라는 농담도 있다. 플랫폼마다 미세한 동작 차이나 화면 표현 차이가 있어서다. 그래도 "소스를 안 고치고 여러 OS에서 돌린다"는 자바의 약속은 그 시대에 혁명적이었고, 지금도 자바가 서버·안드로이드에서 널리 쓰이는 기반이 됐다.