라봉이의 개발 블로그

java의 정석 1강. 자바를 시작하기 전에 본문

Java/Java의 정석 읽고 정리

java의 정석 1강. 자바를 시작하기 전에

Labhong 2018. 5. 24. 16:09
반응형

대학교 1학년 시절, c++로 첫 개발을 시작했을 때는 검은색 화면에서 무엇인가 컴퓨터로 계산한다는 점이 매우 매력적으로 다가왔다.


하지만 C++이란 러닝커브는 매우매우 극한에 달했고 필자는 c++하다가 너무 힘들어서 한동안 스크립트 언어인 자바스크립트와 node.js를 배웠다. 하지만 그들은 뭔가 언어적으로 배워간다기보다는 남이 만든 것을 내가 잘 쓰는 것을 배우는 것이었다. 뿐만 아니라 c++보다 언어적으로 체계가 있는 것도 아니었다. 

그래서 결국 c++보다는 좀 쉽고 자바스크립트보다는 체계가 매우 잡힐 뿐만 아니라 생산성도 좋고, 우리나라에서 제일 많이 쓰는 자바를 배우게 되었다.


이 포스트의 목적은 자바의 정석 책을 읽으면서 공부했던 부분을 머릿 속 더욱 더 깊이 기억할 수 있게 정리하는 목적이다. 따라서 글이 매우 주관적일 수가 있다.



1.1 자바 언어의 특징


1) 운영체제에 독립적이다.

자바 운영 프로그램은 운영체제나 하드웨어가 아닌 자바가상머신(jvm)을 통해서만 통신하고 jvm이 자바 응용프로그램으로부터 전달받은 명령을 해당 운영체제가 이해할 수 있도록 변환하여 전달한다.

따라서 자바 응용프로그램 운영체제에 독립적이지만 jvm은 종속적이기 때문에 썬에서는 플랫폼마다 다른 jvm을 제공하고 있다.



2) 객체지향언어이다.

자바는 상속, 캡슐화, 다형성이 잘 적용된 순수한 객체지향 언어라는 평가를 받고있다.


3) 배우기 쉽다.

자바의 간단명료한 객체지향적 설계는 사용자들이 객체지향개념을 보다 쉽게 이해하고 활용할 수 있도록 하여 객체지향 프로그래밍의 저변확대에 크게 기여했다. (물론 스크립트 언어보다는 배우는 게 쉽지는 않다.)


4) 자동 메모리 관리

자바 응용프로그램이 돌아가면 가비지컬렉터(garbage collector)가 자동적으로 메모리를 관리해주기 때문에 코드 단에서 메모리를 관리할 필요가 없다. 다소 비효율적인 면모가 있지만 요즘 가비지 컬렉터 성능이 괜찮다고 한다. (이 부분에 대해서는 많은 공부가 필요할 것 같다.)


5) 네트워크와 분산처리를 지원


6) 멀티스레드를 지원한다.

자바에서 개발되는 멀티쓰레드 프로그램은 시스템에 관계없이 구현가능하며 관련된 라이브러리가 제공되므로 구현이 쉽다. 스케줄링은 자바 인터프리터가 담당하게 된다.


7) 동적 로딩을 지원한다.

자바는 동적 로딩을 지원하기 때문에 실행 시에 모든 클래스가 로딩되지 않고 필요한 시점에서 클래스를 로딩하여 사용할 수 있다는 장점이 있다. 이 장점이 프로그램 유지 보수에 큰 장점이라 스프링이 이러한 특징을 잘 살려서 많은 웹 서비스에서 스프링이 서버 개발로써의 역할을 수행한다고 알고있다.



1.2 자바로 프로그램 작성하기


JVM을 직역하면 '자바를 실행하기 위한 가상 기계'라고 할 수 있다. 자바로 작성된 어플리케이션은 모두 이 가상 컴퓨터(JVM)에서만 실행되기 때문에, 자바 어플리케이션이 실행되기 위해서는 반드시 JVM이 필요하다.


자바의 코드는 JVM을 거치는 이러한 특징 때문에, 그리고 하드웨어에 맞게 완전히 컴파일된 상태가 아니고 실행 시에 인터프리터가 돌기 때문에 속도가 느리다는 단점이 있다. 하지만 요즘엔 JIT 컴파일러와 최적화된 기술이 적용되어서 많이 완화되었다.




2.1 자바 프로그램 작성하기


java 파일을 만들어서 프로그램을 돌리기까지는 다음과 같은 과정을 겪게 된다.


자바파일 -> javac 컴파일 -> 클래스파일 생성 -> java Run

세세하게 나누어 보자. 


1) 자바 파일 작성(*.java)

2) 자바 파일 컴파일(compile): javac가 컴파일을 함 -> class 파일(Bytecode) 생성

3) Run 과정: Class 파일 안의 main함수를 찾아 실행하고 JVM을 사용함. JVM은 Bytecode(즉, class 파일 내용)을 인터프리터 방식으로 프로그램을 한 줄씩 바로바로 실행한다.

  (1) class loader가 class 파일들을 메모리로 load 하고, 또한 실행하려는 프로그램에 필요한 다른 class 파일들도 load 한다.

  (2) class 파일들이 load되면 bytecode verifier가 load된 class 파일들의 보안을 검사한다.(파일 형식, 악성코드 검사)

  (3) JVM이 특정 프로그램의 bytecode들을 읽어내 실행한다. 초기에는 인터프리터로써 역할을 수행했지만 현재 JIT 컴파일러를 추가하였다.


반응형
Comments