💡 해당 글은 『자바의 신 3판』을 복습하며 도서의 내용과 본인의 주관적인 생각을 정리한 글입니다.
☁️ 내용정리
자바의 창시자는 제임스 고슬링이다.
JDK 6 이전과 이후로 각각 SUN, Oracle이 개발하고 있다.
JDK는 여러 벤더가 존재한다. 각 벤더의 JDK는 내부 동작이 다를 수 있다. 하지만 버전만 동일하다면 자바 프로그램을 실행하는 데에는 아무런 문제가 없다.
나는 레퍼런스가 많은 오라클이나 OpenJDK를 자주 사용하는 편이다.
용어 정리
JDK
: Java Development Kit- 자바 개발 키트이다. 소스 코드를 바이트 코드로 변경할 수 있게 javac를 제공하며, 디컴파일 할 수 있는 javap 등 여러 툴과 API를 제공한다. JRE가 포함된다.
JRE
: Java Runtime Environment- 자바 실행 환경이다. 직역한 뜻과 동일하게 자바 프로그램을 실행하는 환경을 제공한다. JVM과 여러 라이브러리들이 포함되어 있다.
자바 버전에 추가된 기능과 용어 정리
- JDK 1.1
JavaBeans
: javaBeansConvention을 지키는 클래스이다. 재사용을 위한 컴포넌트 모델이다.컴포넌트
: 재사용이 가능한 특정 기능을 통틀어 말하는 개념, 웹 페이지에서 헤더, 푸터가 그 예시이다.모듈
: 특정 기능을 수행할 수 있는 하나의 애플리케이션
- JDK 1.2
JIT
: Just-In-Time 라고 불리는 동적 컴파일러, 런타임에 바이트 코드를 기계어(바이너리 코드)로 컴파일하는 작업을 수행한다. 이미 기계어로 컴파일한 코드를 재사용할 때, 컴파일 된 코드를 캐싱해서 사용한다는 특징을 가지고 있다. 이렇게 정적 컴파일과 동적 컴파일을 모두 수행하여 성능이 좋다.collections
: 자바에서 자료구조를 표현하기 위한 프레임워크이다. List, Queue, Set, Map이 있다.
- JDK 1.3
HotSpot JVM
: 프로그램 성능에 중점을 둔 JVM 구현체JNDI
: 객체를 쉽게 찾을 수 있도록 이름을 지정한 뒤 나중에 빠르게 접근하는 서비스
- JDK 1.4
assert
: 프로그램 상태를 확인하기 위한 예약어. assert 뒤의 구문이 false면 AssertionError 발생NIO
: java.io의 성능적인 단점을 보완하여, non-blocking 방식을 지원하는 라이브러리정규표현식
: 문자열의 패턴을 표현하는 문자열
- JDK 1.5
generic
: 컴파일 타임에 타입을 지정할 수 있는 기능annotation
: 컴파일 혹은 런타임에 부사적인 정보를 전달하기 위한 메타데이터autoboxting
,nuboxing
: 원시타입과 래퍼클래스간의 변환을 자동으로 수행하는 기능enum
: 상수 객체를 나열하는 열거 클래스varargs
:…
키워드를 통해 파라매터로 넘어온 데이터를 배열로 받을 수 있는 기능for-each
: 컬렉션, 배열의 요소를 순차적으로 접근할 수 있는 기능static import
: 클래스의 정적 자원에만 접근할 수 있는 기능concurrent
: 스레드를 쉽게 처리할 수 있게 도와주는 패키지
JIT
Just-In-Time의 약자이다. 자바 외 .NET
등의 언어에서 사용된다.
컴퓨터 프로그램을 실행시키는 방법에는 두 가지가 있다.
- 인터프리터: 프록그램을 실행시키며 필요한 코드를 동적으로 해석한다. 실행 시 오버헤드 발생
- 정적 컴파일: 프로그램을 실행시키기 전 모든 코드를 정적으로 해석한다. 실행 전 오버헤드 발생
JIT는 위의 두 가지 방식을 혼합하여 사용한다. 코드를 해석하는 작업은 인터프리터에 의해 지속적으로 수행되다. 하지만 재사용하는 코드의 경우 캐싱하여 반환하므로 정적 컴파일의 방식을 따른다.
HotSpot
JDK 1.3부터 Hotspot 클라이언트 컴파일러와 서버 컴파일러 두 가지의 컴파일러를 제공한다.
비교적 성능이 떨어지는 클라이언트의 PC에서 수행되는 프로그램을 위한 것이 클라이언트 컴파일러, 그 반대로 코어가 많은 장비에서 실행하기 위해 만들어진 것이 서버 컴파일러이다.
현재 JVM으로 불리는 것이 HotSpot JVM이다.
오라클에서는 이전 버전의 JVM을 Classic VM이라고 표현한다.
GC
GC는 JVM의 heap에서 더 이상 참조되지 않는 메모리를 수거하는 프로세스이다.
아래의 포스팅에 상세하게 정리해놨다.
오라클 GC방식은 크게 4가지가 있으며 Java 7에 추가된 G1까지 총 5개의 가비지 컬렉터가 존재한다.
- Serial GC (클라이언트용 GC이므로 WAS에서 사용하면 성능이 안 좋다.)
- Parallel Young Generation GC
- Parallel Old Generation GC
- Concurrent Mark & Sweep Collecter (CMS)
- Shenandoah GC
- ZGC
G1GC 관련 포스팅
☁️ 내 생각
내가 개발을 C로 시작하고 Java를 사용하는 이유는 메모리와 관련되어 있다.
나의 첫 개발은 HTML5과 CSS3였다. 디자인과 시각적인 면에서 즐거움을 느끼는 나는 컴퓨터 화면에서 보이는 장면을 내가 만들 수 있다는 점이 너무 재밌었고 흥미로웠다. 그래서 이후 컴퓨터공학과로 진학하게 된다.
대학교에서는 처음으로 C를 접했다. C를 배우며 가장 답답했던 점은 메모리 할당과 해제, 포인터의 개념이었다. 컴퓨터의 메모리에 대해서 제대로 알지도 못하는데 코드도 처음 배우는 입장에서 메모리를 할당하고 해제하고 접근하려다 보니 개발에 흥미가 점점 떨어졌었다. 내가 좋아하는 눈에 보이는 개발과는 거리가 있었다는 것도 컸다.
그렇게 나는 개발과 맞지 않는 것 같다는 생각과 함께 진로를 직업 군인으로 선택하려 했었다. 군대에서 병 생활을 마치고 하사관 생활을 하며 근무를 해보니 군대는 나랑 잘 맞다는 생각이 들었다.
하지만 어느 시점을 기준으로 그 생각은 바뀌었고, 나는 다시 개발자로의 꿈을 키우게 되었다.
(대충 내 부서 밑으로 개발팀이 들어와서 관리하다가 진로가 바뀌었다는 얘기)
JAVA를 배우며 가장 신기했던 점은 메모리를 C만큼 관리하지 않아도 된다는 것이었다. 한층 마음이 편해졌었다. 하지만 여전히 시각적인 개발을 배우지는 못했기에 크게 흥미는 없었다. 일단 학점이라도 따놓자라는 마음가짐으로 학점에 몰두했다.
얘기가 이상하게 흘러갔는데 결국 포인터가 마음에 안 들어서 C를 쓰지 않고 JAVA를 쓰게 되었다는 얘기이다.
'JAVA > 자바의 신' 카테고리의 다른 글
21장. 실수를 방지하기 위한 제네릭이라는 것도 있어요 (0) | 2024.01.09 |
---|---|
20장. 가장 많이 쓰는 패키지는 자바랭 (1) | 2024.01.09 |
18장. 이제 기본 문법은 거의 다 배웠으니 정리해 봅시다 (1) | 2024.01.08 |
17장. 어노테이션이라는 것도 알아야 한다. (0) | 2024.01.08 |
16장. 클래스 안에 클래스가 들어갈 수도 있구나 (0) | 2024.01.07 |