자바의 역사는 C++에서 시작된다.
C++을 활용해 가전제품에 탑재될 소프트웨어를 만드려고 했지만 어려움을 느끼고, Oak라는 언어를 개발하였다.
본래는 소형기기에 해당 언어가 사용될 목적이었지만, "여러 운영체제를 사용"하는 컴퓨터들이 등장하면서 운영체제에 독립적인 Oak의 장점이 대두되었다.
결국 이를 인터넷에 적합하게 언어 개발 방향을 바꾸게 되면서 Java라는 이름을 붙이게 되었다.
여러 운영체제를 사용하는 컴퓨터들이 등장하기에 생긴 언어가 Java이다. Java는 JVM의 자바 가상 머신 위에서 동작한다. 즉, 자바 응용 프로그램은 운영체제나 하드웨어랑 통신하는 것이 아닌 JVM에서 통신한다.
그 JVM은 다시 운영체제와 통신하면서 컴퓨터가 이해할 수 있게 변환하여 전달한다.
결국 자바는 운영체제에 독립적이지만, JVM은 어쩔 수 없이 운영체제에 종속적이다.
하지만 자바 개발자들이 여러 운영체제마다 다르게 동작되는 JVM을 제공하였기에, 우리는
'아, 자바는 운영체제에 독립적이구나 ! '
라는 사실만 알고, 맛있게 사용하면 된다!
JVM동작 방식
자바 어플리케이션은 JVM을 거쳐서 OS에 맞게 변환되어 하드웨어로 꽂힌다.
자바 소스코드 작성 (.java)
자바 컴파일러(javac)가 JVM이 이해할 수 있게 소스코드를 컴파일하여 byte코드로 변환 (.class)
JVM이 .class의 byte코드를 JVM 내 class loader에 전달
class loader는 동적로딩(이후 설명)을 활용하여 JVM 메모리(Runtime Data Area)에 필요한 클래스들을 로드
Java Language 규칙 대로 클래스들이 정의되어 있는지 검사(파일형식,악성코드) 후, 클래스가 필요로 하는 메모리를 할당
static과 같인 클래스 변수들은 초기화 작업을 거침
JVM내 Execution Engine이 검증된 Byte 코드들을 하나씩 순차적으로 실행함
이 때, Interpreter에 의해 하나하나 해석하고 실행하던 과정에서, JIT컴파일러를 활용해 byte 코드 전체를 컴파일해서 바이너리 코드로 변경후, '해석'하지 않고 컴파일된 바이너리 코드를 바로 실행하게 하면서 실행속도가 빨라지게 되었다.
객체지향이니까, 재사용하기도 편하고, 유지보수도 편하고, 남들이 보기에 '언어'처럼 느껴지는 마법같은 효과를 얻는다.
그러니까 막코딩을 하면 안돼요..
자바 응용프로그램은 Garbage Collector가 자동적으로 메모리를 관리한다. 따라서 프로그래머는 메모리에 신경을 쓰지 않아도 된다.
C언어를 사용할때, malloc 하고, free를 일일이 해주어야 했던 좋지 않은 기억들이 생각난다.
자바의 탄생배경은 '인터넷에 적합'하게 만들기 위함이다.
그렇기에 당연히 네트워크 프로그래밍 라이브러리가 매우 잘 되어있다. 그렇기에 스프링 프레임워크가 생겨난 것이 아닌가 싶다. 당연히 인터넷에 적합하려면 대규모 분산환경에 염두해두고, 이런 네트워크 프로그래밍 라이브러리를 설계 했을 것이다.
일반적으로 멀티쓰레드의 지원은 운영체제마다 다르다고 한다.
하지만 우리는 킹 갓 자바로 JVM위에서 이루어지기 때문에, 이를 신경쓰지 않고 구현이 가능하다.
물론 API도 제공이 되어서 구현이 쉽다.
여기에서 멀티 쓰레드를 처리하기 위한 스케줄링 기법은 자바 Interpreter가 담당한다.
객체지향의 자바 프로그래밍 언어는, 여러개의 클래스가 모여서 프로그램이 된다.
자바의 동적 로딩은, 프로그램이 실행시 모든 클래스가 한꺼번에 로딩이 되는 것이 아닌, 필요한 시점에 클래스를 로딩하게 해준다.
자바로 프로그래밍 하기 위해 JDK를 설치하여 JVM, JAVA API를 받아와야 한다.
하지만, 윈도우 유저가 항상 거쳤던 작업은 설치한 JDK를 bin디렉토리에 넣고, path설정을 했었다. (물론 MAC에서는 안그럼ㅎㅎ)
결국 OS가 해당 JDK path를 알기 위함이다. 그래야 터미널에서 java관련한 프로그래밍을 진행할 수 있을 것이다.