TIL - 24/03/01
2024/03/01
Java란
썬 마이크로시스템즈에서 개발한 플랫폼 독립적인 객체지향 프로그래밍 언어다.
빅 데이터에 사용되는 하둡(Hadoop)도 자바로 만들어졌다.
모던 프로그래밍 언어(객체지향+함수형)다.
역사
자바의 역사는 1991년 썬 마이크로시스템즈의 엔지니어들에 의해 고안된 오크(Oak)라는 언어에서 시작했다.
썬의 엔지니어들의 원래 목표는 가전제품에 탑재할 소프트웨어를 만드는 것이었다.
처음에는 C++을 확장해서 사용하려 했지만 여러 이유에서 목적에는 부족하다고 결론지었다.
- 제한된 리소스로 임베디드 시스템을 개발한다.
- C++는 많은 메모리를 사용할 때 개발자가 수동으로 메모리를 관리해야 하기 때문에 오류가 발생하기 쉽다.
- 이식성이 부족하다.
- 운영체제 및 하드웨어에 따라 컴파일이 필요하다.
- 모든 유형의 장치에 쉽게 이식할 수 있는 플랫폼을 원했다.
이후 여러 종류의 운영체제를 사용하는 컴퓨터들이 통신하는 인터넷이 등장하자 오크가 이에 적합하다고 판단했다.
오크를 인터넷에 적합하도록 개발 방향을 바꾸며 이름을 자바(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.0 | 1996년 1월 23일 |
JDK 1.1 | 1997년 2월 19일 |
J2SE 1.2 | 1998년 12월 8일 |
J2SE 1.3 | 2000년 5월 8일 |
J2SE 1.4 | 2002년 2월 6일 |
J2SE 5.0 (1.5) | 2004년 9월 30일 |
Java SE 6 | 2006년 12월 11일 |
Java SE 7 | 2011년 7월 28일 |
Java SE 8 (LTS) | 2014년 3월 18일 |
Java SE 9 | 2017년 9월 21일 |
Java SE 10 | 2018년 3월 20일 |
Java SE 11 (LTS) | 2018년 9월 25일 |
Java SE 12 | 2019년 3월 19일 |
Java SE 13 | 2019년 9월 17일 |
Java SE 14 | 2020년 3월 17일 |
Java SE 15 | 2020년 9월 15일 |
Java SE 16 | 2021년 3월 16일 |
Java SE 17 (LTS) | 2021년 9월 14일 |
Java SE 18 | 2022년 3월 22일 |
Java SE 19 | 2022년 9월 21일 |
Java SE 20 | 2023년 3월 21일 |
특징
- 객체지향 언어
- 추상화 - 객체의 공통적인 속성과 기능을 추출하여 정의
- 상속 - 상위 클래스로부터 확장된 여러 하위 클래스에서 중복되는 속성, 기능을 사용할 수 있게 하는 것
- 다형성 - 한 타입의 참조변수를 통해 여러 타입의 객체를 참조할 수 있도록 만드는 것. 즉, 상위 클래스 타입 참조변수로 하위 클래스 객체를 참조할 수 있도록 하는 것
- 캡슐화 - 클래스 안에 서로 연관된 속성, 기능을 캡슐로 만들어 데이터를 외부로부터 보호하는 것
- 데이터 보호 - 외부로부터 클래스에 정의된 속성, 기능을 보호
- 데이터 은닉 - 내부 동작을 감추고 필요한 부분만 노출
- 자동 메모리 관리(Garbage Collection)
- 가비지 컬렉터(Garbage Collector) - 메모리 체크, 반환을 수동적으로 처리하지 않을 수 있다. 하지만 비효율적인 면이 있기도 하다.
- 멀티 쓰레드 지원
- 풍부한 라이브러리
- 운영체제에 독립적
- 자바 가상 머신(JVM) - 자바 응용 프로그램은 운영체제, 하드웨어가 아닌 JVM과 만 통신하고 해당 명령을 운영체제에 변환하여 전달한다. 따라서 JVM은 운영체제에 종속된다.
- Write Once, Run Anywhere
JDK
자바 개발 키트(Java Developement Kit)는 개발자들이 자바로 개발하는데 사용되는 SDK(소프트웨어 개발 키트)이다.
JDK는 라이브러리, javac, javadoc같은 개발 도구, 프로그램을 실행할 JRE가 포함되어있다.
javac
javadoc
html을 따로 작성하지 않고 주석을 통해 소스코드의 코드 문서 생성을 해준다.
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에서 해당 객체에 접근이 가능한지를 해제의 기준으로 삼음
- Mark - Root Space부터 그래프 순회를 통해 연결된 객체(Reachable)를 찾고
- Sweep - 연결이 끊어진 객체(Unrechable)는 지운다
- 아래 메모리가 정리되는 것은 메모리 파편화를 막는 compaction인데 이 과정에서 필수적이지는 않음
- 단점
- GC를 의도적으로 실행시켜야 함
- 어플리케이션 실행 중 GC에게 컴퓨터 리소스를 내주어야 함
출처: https://rebelsky.cs.grinnell.edu/Courses/CS302/99S/Presentations/GC/