Java

Java의 탄생

shininghyunho 2026. 3. 11. 17:34

Java 의 탄생.

  • 1990년대 초에는 WWW의 성장과 함께 인터넷 시장이 급속도로 성장하게 됨.
  • Java는 Sun Microsystems에서 제임스 고슬링이 원래 네트워크 장치 임베디드 시스템을 위한 소프트웨어 개발 연구 프로젝트로 시작했음.
  • 목표는 작고, 신뢰성을 보장하고, 이식 가능하고, 분산 환경을 지원하며, 실시간으로 동작하는 운영 플랫폼을 만드는것.
  • 이 프로젝트는 C++로 시작되었으나 여러 문제들을 직면하고 새로운 언어를 만들게됨.
  • 그게 Java다.

그럼 C++은 어떤 문제가 있었을까?

  • 플랫폼 종속성 문제
    • 하드웨어·운영체제·GUI 환경이 제각각이라 동일한 프로그램을 여러 버전으로 만들어야 했음.
    • C++은 플랫폼 종속적이었기 때문에 이식성이 떨어졌음.
    • 👉 Java는 JVM을 통해 플랫폼 독립성을 확보.
  • 메모리 관리 문제
    • C++은 개발자가 직접 malloc, free로 메모리를 관리해야 했음.
    • 이로 인해 메모리 누수와 안정성 문제가 빈번하게 발생.
    • 👉 Java는 Garbage Collector(GC)로 자동 메모리 관리 제공.
  • 언어의 복잡성
    • 포인터 사용으로 인한 보안 취약점, 코드 가독성 저하, 유지보수 어려움.
    • 👉 Java는 포인터를 제거하고 참조(reference) 기반힘단순화.
  • 보안성 부족
    • 네트워크 환경에서 안전하게 실행하기 어려움.
    • 👉 Java는 클래스 로더, 바이트코드 검증, 샌드박스 모델로 보안 강화.

인터넷의 발전과 함께 다양한 OS, 플랫폼 위에서 안정적으로 돌아갈 언어가 Java.

Java의 설계 목표

다음 파트는 oracle 문서를 보며 정리한 내용입니다.

단순(Simple), 객체지향(Object Oriented), 친숙(Familiar)

  • 단순성
    복잡한 훈련 없이도 쉽게 배울 수 있도록 설계됨. 기본 개념의 빠른 이해가 가능해 초반부터 높은 생산성 보장.
  • 객체지향성
    초기부터 객체지향 개념 기반으로 설계. 캡슐화, 메시지 전달 등의 패러다임은 분산 클라이언트-서버 환경에 적합함.
  • 라이브러리 활용
    기본 데이터 타입, I/O, 네트워크, GUI 등 검증된 객체 라이브러리를 풍부하게 제공하며, 확장성 또한 뛰어남.
  • 친숙함
    C++ 문법과 “look & feel”을 유사하게 유지하여 기존 개발자의 적응을 도움. 불필요한 복잡성은 제거하되 객체지향적 특징은 유지함.

견고(Robust)하고 안전(Secure)

  • 견고성
    컴파일 및 런타임 시 철저한 검사를 통해 신뢰성 높은 코드 작성을 지원함.
  • 메모리 관리 단순화
    포인터 연산 제거 및 자동 가비지 컬렉션 도입으로 메모리 누수와 오류 방지.
  • 보안성
    언어 및 런타임 수준의 보안 기능 내장. 외부 침입, 바이러스, 파일 시스템 공격으로부터 애플리케이션 보호.

아키텍처 중립(Architecture Neutral) & 이식성(Portable)

  • 바이트코드
    아키텍처 중립적인 바이트코드를 생성하여 JVM이 있는 모든 플랫폼에서 실행 가능.
  • 엄격한 정의
    데이터 타입 크기와 연산자 동작을 명확히 규정하여 플랫폼 간 불일치 문제 제거.
  • JVM
    추상 가상 머신 정의 및 각 플랫폼별 JVM 구현을 통한 실행 환경 제공. POSIX 기반 설계로 다양한 환경에 적용 용이.

고성능(High Performance)

  • 인터프리터 최적화
    런타임 오버헤드를 줄여 빠른 실행 속도 확보.
  • 가비지 컬렉션
    저우선순위 백그라운드 스레드 동작으로 성능 저하 최소화.
  • 네이티브 코드 연동
    연산 집약적 부분은 네이티브 코드로 변환하여 성능 보완 가능.

인터프리터 기반(Interpreted), 멀티스레드(Threaded), 동적(Dynamic)

  • 인터프리터 기반
    가벼운 링크 과정으로 빠른 개발 주기 지원. 프로토타입 제작 및 실험에 용이함.
  • 멀티스레드
    다중 작업 동시 처리 지원. Thread 클래스 및 동기화 도구 제공, 라이브러리는 thread-safe하게 설계됨.
  • 동적 확장성
    런타임에 필요한 클래스만 동적 로드 가능. 네트워크를 통한 모듈 추가로 애플리케이션의 지속적 진화 지원.

꼬리질문

(이번 챕터는 Java가 왜 탄생했는지를 나타내는 수준의 간단한 포스팅이다. 다음 챕터부터 디테일하게 건드려보며 꼬리질문을 해보자.)

참고

'Java' 카테고리의 다른 글

JVM 은 무엇인가.  (0) 2026.03.11
Stream API(임시저장용)  (0) 2024.08.08
[객체지향설계원칙] DIP  (0) 2024.05.31
[객체지향설계원칙] ISP  (0) 2024.05.31
[객체지향설계원칙] LSP  (0) 2024.05.29