아래 내용들은 "점프 투 자바" 내용을 기반으로 작성되었으며, 중간중간 내 생각을 더하면서 수정했다.
앞으로 이런 참고 내용들은 글 맨 아래 "참고"에 게시하겠다.
Java의 역사
Java는 썬 마이크로 시스템즈의 제임스 고슬링 (James Gosling)과 다른 연구원들이 개발한 “객체 지향적 프로그래밍 언어”로써 1995년에 발표되었다.
처음에는 가전제품 내에 탑재된 소프트웨어를 실행시키기 위해 개발했었지만, 현재는 웹 애플리케이션과 모바일 앱 개발에 가장 많이 사용하는 언어로 성장했다.
자바의 정의
Java: A simple, object-oriented, distributed, interpreted, robust, secure, architecture neutral, portable, high-performance, multithreaded, and dynamic language
feat. 썬 마이크로 시스템즈
위 정의된 내용으로 자바의 주요 특징에 대해 알 수 있다
간단하다
- 자바는 고급 언어(C, C++)에 들어 있는 여러가지 요소들 중에서 반드시 필요하지 않다고 생각된 부분들은 모두 제거했다
객체 지향적
- 자바는 숫자(int, float, long …)이나 논리값(true, false)를 제외한 거의 모든 것이 객체로 구성되어 있다.
- 실제로, 자바는 Object 클래스에서 모든 클래스를 파생한다.
이러한 이유로 자바는 int, float, long, true, false 등을 원시 자료형(primitive type)이라고 한다
인터프리티 언어
- 자바는 “컴파일 언어”인 동시에 “인터프리터 언어”이다.
- 자바는 먼저 텍스트 소스를 컴파일하여 이진 파일 즉, 클래스 파일로 만든다 → 이후, 자바 런타임이 클래스 파일을 인터프리트하면서 실행한다.
- 시스템에 무관한 이진파일을 만듬으로써 자바는 컴파일 언어에 가까운 속도와 시스템 독립성을 동시에 얻을 수 있는 것이다.
강력하다 (robust)
- 자바는 포인터 연산을 지원하지 않는다.
- 잘못된 주소를 가르킬 가능성을 사전에 없앤 것이다.
- 자바의 모든 메모리 접근은 “자바 시스템”이 관리하고 제한하며 또한 예외 핸들링을 하여 시스템 붕괴의 어려움이 없다.
- 예를 들어, 자바는 리소스 관리(grabage collection)를 하는데, 실행되지 않는 리소스를 시스템이 자동적으로 메모리에서 삭제하는 방식을 채택하고 있기 때문에 메모리 누출에 대한 고민을 프로그래머가 할 필요가 없다.
- 프로그래머가 직접 GC의 실행시점을 제어할 수 없다는 게 단점이다.
안전하다
- 자바는 프로그램 작성 시 자료형 타입에 굉장히 민감하다.
- 컴파일이 되었다면 코드에 결정적인 문제는 없는 것임을 동시에 보장하는 것이다.
플랫폼 독립적이다
- 자바의 실행 파일은 이진 파일 즉, 클래스 파일이다. 따라서, 자바 런타임이 설치된 시스템에서는 어디에서나 자바 프로그램을 실행할 수 있다.
- 자바의 가장 큰 특징 중 하나는 OS(Operating System)에 상관없이 어디서든 돌려볼 수 있다는 점이다.
- JDK(Java Development Kit)만 있으면 된다.
- JDK 내에는 JRE(Java Runtime Environment, 이 내의 JVM)와 Java 컴파일러(javac, 이를 쓰면 이진)
- JDK(Java Development Kit)만 있으면 된다.
- 이것은 자바 프로그램이 가상머신(Virtual Machine)에 의해서 실행되기 때문이다. - 바이트코드를 해석하고 해당 플랫폼에 맞는 기계어로 변환하여 실행시키는 중간자 역할
- 다른 네티이브 코드(C, C++)처럼 직접 컴파일되는 언어와 달리, 자바는 “하드웨어 - JVM - 바이트코드”의 layer를 이루고 있기 때문에 이 중간 해석과정에서 성능이 떨어지는 것이다.
- 처음에 이 방식은 자바 가상머신(JVM)을 실행시켜서 프로그램을 돌려야하고, GC로 인해 느리고 부담스러웠다. 하지만 현재는 하드웨어의 발전과 여러 최적화 기법(JIT 컴파일러, GC1, zGC 등)의 도입으로 많이 개선되었다.
이 말들을 정리해보면, 아래와 같이 될 수 있겠는데...
1. helloWolrd.java 파일을 실행시킨다.
2. JDK 내 Java컴파일러(javac)가 바이트 코드로 변환 진행
3. 컴파일이 완료되면, 이 바이트 코드들은 클래스 파일(.class) 로써 저장된다. (컴파일 := .class파일을 만드는 과정)
4. JDK 내 JRE의 JVM이 이 클래스 파일 내 바이트코드를 해석하고 실행시킨다.
5. JVM이 바이트코드를 해석하면서 필요한 경우 System call을 해서 하드웨어랑 상호작용
참고) 바이트코드: 일종의 중간코드로써, Virtual Machine에서 실행될 수 있는 행태로 컴파일된 프로그램 코드 (이 또한 특정한 형태의 이진 데이터다.)
그럼그럼!! System call은 언제 필요할까??
예를 들어보자, 음.. 메모리 할당을 보자
만약에 helloWorld.java 내에 아래와 같이 입력을 했다고 가정하자.
String yoonsu = "Hello World!";
그럼, JVM은 이에 대해 시스템 콜을 통해 OS로부터 두 가지 유형의 메모리 공간을 할당받을 수 있다.
- 스택 메모리: 기본 데이터 타입(int, float, boolean 등) 간단한 값들과 변수
- 이 때 스택 메모리에 할당된 변수는 한 블록 즉, 함수 또는 조건문 내에서만 선언된 경우에만 유효하고, 이 블록을 벗어나면 자동으로 해제된다.
- 힙 메모리: 객체나 배열같이 복잡한 데이터 구조들이 저장된다.
- 빠른 할당/해제를 지닌 스택 메모리보다 힙 메모리가 더 크다.
음.. 얘기가 잠시 딴데로 샜는데 어쨌든 이어서!!
멀티 쓰레딩을 지원한다
- 멀티 쓰레드를 지원하면, 하나의 프로세스 내 여러 쓰레드를 동시에 수행시킬 수 있다. 특히 자바는 멀티 프로세서(하드웨어) 를 지원하도록 설계되었으므로 멀티 CPU에서 높은 성능을 낼 수 있다.
- 후에 자세히 다뤄보도록 하겠다.
동적이다 (dynamic)
- 자바 인터페이스를 활용하면 하나의 모듈을 갱신할 때, 다른 모듈을 모두 갱신할 필요가 없어진다.
- 이건 인터페이스가 모든 인스턴스 변수와 도구의 실행문을 배제한 채로, 객체 간의 상호작용을 정의하기 때문이다.
참고
'Java' 카테고리의 다른 글
JVM (0) | 2023.07.10 |
---|---|
System.out.println을 쓰면 안되는 이유 (0) | 2023.07.06 |
Java Exception ( feat. Checked, UnChecked ) (0) | 2023.06.26 |
Java - equals, hashCode() (0) | 2023.06.20 |