[Java] 자바 개요

Smite·2023년 7월 23일

Java

목록 보기
2/5
post-thumbnail

자바(Java)라는 이름의 기원은 개발자인 James Gosling, Arthur Van Hoff, Andy Bechtolsheim의 이름 첫 글자를 조합했다는 설과, 개발자들이 마시던 인도네시아산 커피 이름에서 따왔다는 설이 있지만, 이 기사[1]의 내용에 따르면 후자의 이야기로 기울여진다.


자바 개요

자바란 썬 마이크로시스템즈(Sun Microsystems)에서 개발한 객체지향 프로그래밍 언어이다. 자바의 슬로건은 "Write Once, Run Anywhere"이다. 이는 자바의 가장 큰 특징 중 하나로, 한 번 작성한 코드를 어떤 운영체제나 플랫폼에서든지 동일하게 실행할 수 있다는 뜻이다. 이를 가능하게 하는 것은 자바 가상 머신(Java Virtual Machine, JVM)으로 JVM은 운영체제(Operating System, OS)에 독립적으로 작동하여 자바 프로그램을 실행시켜주기 때문에 어떤 환경에서도 일관되고 안정적으로 실행될 수 있다.

자바 역사

자바는 썬 마이크로시스템즈사의 제임스 고슬링(James Gosling) 팀에 의해 개발되었다. 1991년에 오크(Oak)라는 이름으로 개발되었으며, 1995년에 첫 버전인 JDK 1.0이 정식으로 발표되었으며, 후에 1996년에 발표된 1.0.2 버전에서 Java로 이름이 바뀌었다.

1998년 발표된 J2SE 1.2에서는 웹에서도 자바를 돌릴 수 있게 해 주는 자바 애플릿(Java Applet)이 추가되었다. 당시에는 웹 브라우저에서 웹 페이지의 내용뿐만 아니라 다양한 기능을 제공하는 것이 쉽지 않았지만, 자바 애플릿은 웹 페이지에서 강력한 인터랙션과 동적인 기능을 제공할 수 있었기에 웹 애플리케이션 개발에 많이 활용되었고, 이로 인하여 자바는 인기를 끌게 되었다. (현재에는 보안 이슈와 성능 문제, 다양한 웹 기술과 프레임워크가 등장하면서 웹 애플리케이션 개발이 훨씬 더 간편해지고, 자바 애플릿보다 훨씬 안전하고 효율적인 방법들이 사용하면서 자바 애플릿을 거의 사용하지 않는다.)

이후 자바는 버전 업그레이드를 거쳐 개선되어 현재는 Java SE(Standard Edition), Java EE(Enterprise Edition), Java ME(Micro Edition) 등 다양한 에디션으로 사용되고 있다.

2009년에 썬 마이크로시스템즈사가 오라클(Oracle)과 인수 합병됨에 따라 자바 소유권은 오라클로 넘어갔다.

소유권이 오라클로 넘어간 이후에도 여전히 자바가 널리 사용되고 있으며, 현대 소프트웨어 개발에서 중요한 위치를 차지하고 있다.

자바 특징

  1. 객체지향 프로그래밍 (OOP)
    자바는 객체지향 프로그래밍 언어로, 현실 세계의 개념을 추상화하여 객체들로 프로그램을 구성한다. 클래스(class)와 객체(object)를 기반으로 데이터와 해당 데이터를 처리하는 메서드(method)를 묶어서 관리하며, 캡슐화, 상속, 다형성 등의 OOP의 특성을 지원한다.

  2. 플랫폼 독립성 (Platform Independence)
    자바는 JVM(Java Virtual Machine)을 통해 실행되기 때문에 특정 운영 체제에 종속되지 않는다. 한 번의 컴파일링으로 생성된 바이트코드(.class 파일)는 어떤 플랫폼에서라도 실행될 수 있다. 이는 "Write Once, Run Anywhere"라는 모토를 갖게 한 주요 특징 중 하나이다.

  3. 가비지 컬렉션 (Garbage Collection)
    자바는 가비지 컬렉션(GC)을 통해 메모리 관리를 자동으로 처리한다. 개발자가 명시적으로 메모리를 할당하고 해제하는 번거로움을 덜어주며, 메모리 누수를 방지하여 프로그램의 안정성을 높여준다.

  4. 멀티스레딩 지원 (Multithreading)
    자바는 멀티스레딩을 쉽게 구현할 수 있도록 지원한다. 쓰레드(thread)를 만들고 관리할 수 있는 API를 제공하여 동시에 여러 작업을 처리하는데 용이하다. 이를 통해 프로그램의 성능을 개선하고 응답성을 높일 수 있다.

  5. 높은 보안성
    자바는 웹에서의 악성 코드 실행 등으로부터 안전하게 보호하기 위해 다양한 보안 기능을 내장하고 있다. JVM은 악성 코드 실행을 방지하고, 네트워크 통신에 있어서도 보안적인 측면을 고려하여 설계되어 있다.

  6. 풍부한 API(라이브러리) 지원
    자바는 다양한 기능을 제공하는 풍부한 API와 라이브러리를 갖추고 있으며, 이를 활용하여 개발자는 간편하게 원하는 기능을 구현할 수 있다.

  7. 동적 로딩(Dynamic Loading)
    자바는 동적 로딩을 지원하여 필요한 클래스나 라이브러리를 프로그램이 실행 중에 동적으로 로드할 수 있다. 이로 인해 런타임 시에 클래스의 추가나 변경 등이 용이하다.

  8. 자동화된 메모리 관리
    자바는 포인터를 사용하지 않고, 가비지 컬렉션을 통해 메모리를 관리한다. 이로 인해 개발자가 메모리 관리에 신경 쓰지 않아도 되므로 프로그램의 안정성을 높이고 개발 효율을 향상시킨다.

  9. 대중적인 언어
    많은 개발자들이 사용하고 있으며, 자바에 관한 수많은 참고 자료를 찾을 수 있다. 오픈 소스 프로젝트부터 대규모 기업용 응용 프로그램까지 다양한 분야에서 활용되고 있다.

JVM(Java Virtual Machine)

JVM(Java Virtual Machine)은 자바 프로그램을 실행하는 가상 머신으로, 자바 프로그램을 컴파일하여 생성된 바이트코드를 해석하고 실행하는 역할을 한다. "Write Once, Run Anywhere"를 실현시키는 핵심 컴포넌트로서, 다양한 운영 체제와 하드웨어에서 동일한 바이트코드를 실행하여 자바 프로그램의 플랫폼 독립성을 보장한다.

JVM의 주요 기능

  • 자바 바이트코드 실행: JVM은 자바 바이트코드를 읽고 해석하여 해당 플랫폼에서 실행 가능한 기계어로 변환하고 실행한다. 이로써 자바 프로그램은 운영 체제와 하드웨어에 독립적으로 실행될 수 있게 된다.
  • 메모리 관리: JVM은 가비지 컬렉션(Garbage Collection)을 통해 더 이상 사용되지 않는 객체들을 자동으로 제거하여 메모리를 관리한다.
  • 스레드 관리: JVM은 멀티스레딩을 지원하며, 여러 개의 스레드를 생성하고 관리하여 동시에 여러 작업을 처리할 수 있으며, 병렬 처리를 통해 프로그램의 성능을 향상시킬 수 있다.
  • 예외 처리: JVM은 자바에서 발생하는 예외를 적절하게 처리하여 프로그램의 비정상 종료를 방지하고 안정성을 유지한다. 개발자는 예외를 적절히 처리하여 프로그램의 오류를 예방하거나 처리할 수 있다.
  • 클래스 로딩 및 링킹: JVM은 필요한 클래스들을 동적으로 로딩하고, 링킹과정을 거쳐 실행에 필요한 최종적인 바이트코드를 생성한다.

JVM-Architecture

JVM의 동작 방식

  • 클래스 로더(Class Loader)
    JVM은 클래스 로더를 통해 필요한 클래스 파일을 로딩한다. 클래스 로더는 클래스 파일을 찾고, 메모리에 로드하여 해당 클래스를 사용할 수 있도록 준비한다.

  • 바이트코드 실행
    클래스가 로드되면 JVM은 해당 클래스의 바이트코드를 실행한다. 바이트코드는 JVM이 이해할 수 있는 명령어로 해석되고, JVM은 이를 실행하면서 프로그램이 동작한다.

  • 가비지 컬렉션
    JVM은 메모리 사용을 최적화하기 위해 가비지 컬렉션(GC)을 수행한다. 가비지 컬렉션은 더 이상 사용되지 않는 객체들을 식별하고 자동으로 메모리를 해제하여 프로그램의 메모리 누수를 방지한다.

  • JIT 컴파일러(Just-In-Time Compiler)
    일부 JVM 구현은 JIT 컴파일러를 통해 바이트코드를 기계어로 변환하고, 이를 캐싱하여 빠르게 실행할 수 있도록 한다. 이로 인해 반복적으로 사용되는 코드의 실행 성능이 향상된다.

JVM 구성 요소

  • Class Loader: 클래스 로더는 클래스 파일을 로딩하고 JVM 내부에 클래스를 정의하는 역할을 담당한다.
  • Runtime Data Area: JVM은 프로그램 실행에 필요한 데이터를 저장하는 메모리 영역으로, 메소드 영역, 힙 영역, 스택 영역 등으로 구성된다.
  • Execution Engine: 실행 엔진은 바이트코드를 실제 기계어로 변환하고, 실행하는 역할을 수행한다.
  • Garbage Collector: 가비지 컬렉터는 더 이상 사용되지 않는 객체들을 제거하여 메모리를 관리하는 역할을 한다.
  • Native Interface: JVM은 Java와 네이티브 코드(C, C++ 등) 간의 인터페이스를 지원하여 네이티브 코드를 호출하거나 호출 받을 수 있다.

📖Java Index

참고 자료
[1] : ‘IT 브랜드의 전설’··· 자바의 이름이 자바인 사연
   (Kieron Murphy | JavaWorld, CIO Korea, 2022.07.19.)

0개의 댓글