참고
자바의 정석
자바란?
- 자바는 썬 마이크로시스템즈에서 개발하여 공식적으로 발표한 객체지향 프로그래밍 언어이다.
- 운영체제(플랫폼)에 독립적이다.
- C++의 장점을 채택하는 동시에 잘 사용하지 않은 부분은 과감히 제외시켜 비교적 배우기 쉽고 간결한 표현이 가능하도록 했다.
- 자바는 풍부한 클래스 라이브러리를 통해 프로그래밍에 필요한 요소들을 기본적으로 제공한다.
2010년부로 썬 마이크로시스템즈가 오라클사에 인수되면서 자바는 오라클사의 제품이 되었다.
자바의 유료화?
많은 사람들은 JAVA 8버전 이후로는 유료라고 많이 오해를 하고 있다.
물론 유료가 맞다. 오라클에서 만든 Oracle JDK 11 버전부터 상용으로 사용할 때 유료이다.
하지만 위의 강조된 조건에 하나라도 부합하지 않는다면 무료로 사용이 가능하다.
https://medium.com/@javachampions/java-is-still-free-c02aef8c9e04
자바의 역사
- 자바는 오크(Oak)라는 언어로부터 시작되었다.
- 자바의 처음의 목적은 가전제품에 소프트웨어를 탑재하는데 목적을 두었다.
- 오크는 처음에는 가전제품이나 PDA와 같은 소형기기에 사용될 목적이었으나 여러종류의 운영체제를
사용하는 컴퓨토들이 통신하는 인터넷이 등장하자 오크의 개발방향을 인터넷에 적합하도록 변경하며
명칭을 자바로 바꾸었다.
- 자바로 작성된 애플릿 (Applet)은 정적인 웹페이지에 사운드와 애니메이션 등의 멀티미디어적인
요소들을 제공할 수 있는 유일한 방법이었기 때문에 많은 인기를 얻고 사용자층을 많이 확보하였다.
- 하지만, 보안상의 이유로 최신 웹브라우저에서 더 이상 애플릿을 지원하지 않게되었고, 대신, 서버쪽
프로그래밍을 위한 서블릿 (Servlet)과 JSP가 더 많이 사용되었다.
- 그리고 현재에는 스마트폰 운영체제인 안드로이드에서도 자바를 사용한다.
자바 언어의 특징
- 운영체제에 독립적이다.
- 일종의 에물레이터인 자바가상머신 (JVM)을 통해서 가능
- 자바응용프로그램은 운영체제나 하드웨어가 아닌 JVM하고만 통신
- JVM은 전달받은 명령들을 해당 운영체제가 이해할수 있도록 변환
- JVM은 운영체제에 종속적이기 때문에 여러 운영체제에 설치할 수 있는
서로 다른 버전의 JVM 제공
- 자바로 작성된 프로그램은 운영체제와 하드웨어에 관계없이 실행 가능하며
이것을 '한번 작성하면 어디서나 실행된다. (Write once, run anywhere)'고 표현
- 객체지향 언어이다.
- 프로그래밍 언어 + 객체지향 개념 (ex. C++, JAVA, Python..)
- 객체지향 프로그램으로 유지보수와 확장성이 좋다.
- C나 C++보다 안정적이다.
- 비교적 배우기 쉽다.
- 자바의 연산자와 기본구문은 C++, 객체지향관련 구문은 스몰톡이라는 객체지향언어에서
가져왔다.
- 풍부한 라이브러리가 제공되고 오픈소스와 연동된다.
- 하지만 개인적인 생각으로는 이런 풍부한 라이브러리때문에 배울 양이 많고 혼동이
오는것 같다.
- 자동 메모리 관리 (Garbage Collection)
- 가비지 컬렉터 (garbage collector)가 자동적으로 메모리를 관리해주기 때문에
개발자는 메모리를 따로 관리할 필요가 없다.
- 예를 들어 C++같은 경우 가비지 컬렉터가 없어서 객체를 생성하고 꼭 소멸자로 소멸
시켜줘야 한다.
- 네트워크 분산처리를 지원한다.
- 멀티쓰레드를 지원한다.
- 일반적으로 멀티쓰레드 (multi-thread)의 지원은 사용되는 운영체제에 따라 구현방법도
상이하며 처리 방식도 다르다.
- 그러나, 자바는 관련된 라이브러리가 제공되므로 구현이 쉽다.
- 여러 쓰레드에 대한 스케줄링을 자바 인터프리터가 담당한다.
- 동적 로딩을 지원한다.
- 자바는 실행 시에, 모든 클래스들이 로딩되지 않고 필요한 시점에 클래스를 로딩하여
사용할수 있는 장점이 있다.
멀티쓰레드란?
하나의 프로그램으로 여러 작업을 하는 행위
ex) 카카오톡 (채팅 + 데이터 전송)
자바의 단점으로 속도문제가 있었지만, 바이트코드를 하드웨어가 알아들을 수 있는 기계어로 변환해주는
JIT 컴파일러와 Hotspot과 같은 신기술 도입으로 JVM의 기능이 향상되어 속도문제가 상당히 개선되었다.
JVM (Java Virtual Machine)

- JVM은 직역하면 자바를 실행하기 위한 가상 컴퓨터
- 자바로 작성된 애플리케이션은 모두 이 가상 컴퓨터 (JVM)에서만 실행되기 때문에
자바 애플리케이션이 실행되기 위해서는 반드시 JVM이 필요하다.
- 일반 애플리케이션 코드는 OS만 거치고 하드웨어로 전달되는 반면,
자바 애플리케이션은 JVM을 한번 더 거치기 때문에, 그리고 하드웨어에 맞게 완전히 컴파일된
상태가 아니고 실행시에 해석되기 때문에 속도가 느리다는 단점이 있지만 위에서 언급했듯이
JIT 컴파일러와 향상된 최적화 기술이 적용되어 속도를 많이 개선되었다.
- JVM은 플랫폼에 독립적이며 OS에 종속적이다.
- 그래서 해당 OS에서 실행가능한 JVM이 필요하다.

JIT 컴파일러: https://aboullaite.me/understanding-jit-compiler-just-in-time-compiler/
JDK, JRE 그리고 JVM: https://howtodoinjava.com/java/basics/jdk-jre-jvm/
https://en.wikipedia.org/wiki/List_of_JVM_languages