Post

TIL - 24/03/01

2024/03/01

Java란

썬 마이크로시스템즈에서 개발한 플랫폼 독립적인 객체지향 프로그래밍 언어다.

빅 데이터에 사용되는 하둡(Hadoop)도 자바로 만들어졌다.

모던 프로그래밍 언어(객체지향+함수형)다.

역사

자바의 역사는 1991년 썬 마이크로시스템즈의 엔지니어들에 의해 고안된 오크(Oak)라는 언어에서 시작했다.

썬의 엔지니어들의 원래 목표는 가전제품에 탑재할 소프트웨어를 만드는 것이었다.

처음에는 C++을 확장해서 사용하려 했지만 여러 이유에서 목적에는 부족하다고 결론지었다.

  1. 제한된 리소스로 임베디드 시스템을 개발한다.
    1. C++는 많은 메모리를 사용할 때 개발자가 수동으로 메모리를 관리해야 하기 때문에 오류가 발생하기 쉽다.
  2. 이식성이 부족하다.
    1. 운영체제 및 하드웨어에 따라 컴파일이 필요하다.
    2. 모든 유형의 장치에 쉽게 이식할 수 있는 플랫폼을 원했다.

이후 여러 종류의 운영체제를 사용하는 컴퓨터들이 통신하는 인터넷이 등장하자 오크가 이에 적합하다고 판단했다.

오크를 인터넷에 적합하도록 개발 방향을 바꾸며 이름을 자바(Java)로 변경했다.

자바는 애플릿(Applet)이란 정적 웹사이트에 사운드, 애니메이션 등 멀티미디어 적 요소들을 제공하는 방식을 사용했지만 보안상 이유로 지원이 종료되었다.

대신 서버 프로그래밍을 위한 서블릿(Servlet)과 JSP(Java Server Pages)가 많이 사용된다.

J2SE는 전보다 달라진게 많아 Java2라 불린다.

  • J2SE
    • Standard Edition
    • 일반적
  • J2ME
    • Micro Edition
    • 모바일, 소형기기
  • J2EE
    • Enterprise Edition
    • 기업

버전 3개 뛸 때마다 큰 변화가 있었다고 한다.

9 ~ 20까지는 6개월에 한 번 씩 나옴

JDK버전날짜
JDK 1.01996년 1월 23일
JDK 1.11997년 2월 19일
J2SE 1.21998년 12월 8일
J2SE 1.32000년 5월 8일
J2SE 1.42002년 2월 6일
J2SE 5.0 (1.5)2004년 9월 30일
Java SE 62006년 12월 11일
Java SE 72011년 7월 28일
Java SE 8 (LTS)2014년 3월 18일
Java SE 92017년 9월 21일
Java SE 102018년 3월 20일
Java SE 11 (LTS)2018년 9월 25일
Java SE 122019년 3월 19일
Java SE 132019년 9월 17일
Java SE 142020년 3월 17일
Java SE 152020년 9월 15일
Java SE 162021년 3월 16일
Java SE 17 (LTS)2021년 9월 14일
Java SE 182022년 3월 22일
Java SE 192022년 9월 21일
Java SE 202023년 3월 21일

특징

  1. 객체지향 언어
    1. 추상화 - 객체의 공통적인 속성과 기능을 추출하여 정의
    2. 상속 - 상위 클래스로부터 확장된 여러 하위 클래스에서 중복되는 속성, 기능을 사용할 수 있게 하는 것
    3. 다형성 - 한 타입의 참조변수를 통해 여러 타입의 객체를 참조할 수 있도록 만드는 것. 즉, 상위 클래스 타입 참조변수로 하위 클래스 객체를 참조할 수 있도록 하는 것
    4. 캡슐화 - 클래스 안에 서로 연관된 속성, 기능을 캡슐로 만들어 데이터를 외부로부터 보호하는 것
      1. 데이터 보호 - 외부로부터 클래스에 정의된 속성, 기능을 보호
      2. 데이터 은닉 - 내부 동작을 감추고 필요한 부분만 노출
  2. 자동 메모리 관리(Garbage Collection)
    1. 가비지 컬렉터(Garbage Collector) - 메모리 체크, 반환을 수동적으로 처리하지 않을 수 있다. 하지만 비효율적인 면이 있기도 하다.
  3. 멀티 쓰레드 지원
  4. 풍부한 라이브러리
  5. 운영체제에 독립적
    1. 자바 가상 머신(JVM) - 자바 응용 프로그램은 운영체제, 하드웨어가 아닌 JVM과 만 통신하고 해당 명령을 운영체제에 변환하여 전달한다. 따라서 JVM은 운영체제에 종속된다.
    2. Write Once, Run Anywhere

JDK

자바 개발 키트(Java Developement Kit)는 개발자들이 자바로 개발하는데 사용되는 SDK(소프트웨어 개발 키트)이다.

JDK는 라이브러리, javac, javadoc같은 개발 도구, 프로그램을 실행할 JRE가 포함되어있다.

javac

javadoc

html을 따로 작성하지 않고 주석을 통해 소스코드의 코드 문서 생성을 해준다.

JVM

JVM 출처 https://en.wikipedia.org/wiki/Java_virtual_machine

가비지 컬렉션(Garbage Collection)

가비지 컬렉션(GC)은 메모리 관리 기법 중 하나로 JVM의 Heap 영역에서 사용하지 않는 객체를 삭제하는 프로세스이다.

C언어에서는 free()를 사용해 직접 메모리를 해제해야 하지만 Java, Kotlin을 사용하면 GC 작업을 하는 JVM의 가비지 컬렉터가 불필요한 메모리를 메모리 누수가 일어나지 않게 알아서 정리한다.

가비지 컬렉터는 주기적으로 검사하여 메모리를 청소한다.

Java에서 System.gc()를 이용해 호출이 가능하지만 시스템의 성능에 영향을 미치기 때문에 호출하면 안된다.

  • 장점
    • 메모리 누수를 막음
    • 프로그래머가 메모리 관리에 대한 걱정이 줄어듬
      • 헤제된 메모리에 접근 시도
      • 이중 메모리 해제
  • 단점
    • GC 작업은 오버헤드가 일어남
    • 개발자가 언제 GC가 메모리 해제하는지 정확기 알기 어려움
      • 실시간성이 크게 강조되는 경우 GC에게 메모리 관리를 맡기는 것이 알맞지 않을 수 있음

Stop The World

GC를 수행하기 위해 JVM이 프로그램 실행을 멈추는 현상

GC 알고리즘: Mark And Sweep

Root Space는 JVM 메모리의 stack의 로컬 변수, Method area에 저장된 Static 변수, Native Method Stack의 C/C++로 작성된 JNI 참조전역 변수 등 heap 영역 참조를 담은 변수

  • Reference Count의 순환 참조 문제 해결 가능
  • 방식 - Root Space에서 해당 객체에 접근이 가능한지를 해제의 기준으로 삼음
    1. Mark - Root Space부터 그래프 순회를 통해 연결된 객체(Reachable)를 찾고
    2. Sweep - 연결이 끊어진 객체(Unrechable)는 지운다
    3. 아래 메모리가 정리되는 것은 메모리 파편화를 막는 compaction인데 이 과정에서 필수적이지는 않음
  • 단점
    1. GC를 의도적으로 실행시켜야 함
    2. 어플리케이션 실행 중 GC에게 컴퓨터 리소스를 내주어야 함

Mark And Sweep 출처: https://rebelsky.cs.grinnell.edu/Courses/CS302/99S/Presentations/GC/

This post is licensed under CC BY 4.0 by the author.