Java를 사용 하기전 기초지식
용어의 정립 개념으로 정리함

1. JVM (Java Virtual Machine)
- 자바 JVM은 자바로 작성된 프로그램을 싱행하는 데 사용되는 가상머신
- JVM은 자바 어플리케이션을 바이트코드로 변환하고, 이 바이트코드를 OS(운영체제)에
관계없이 실행 가능하다.
- 독립적인 플랫폼 특성을 가짐.
2. JRE (Java Runtime Environment)
- 자바 어플리케이션을 실행환경을 구현
- JVM과 핵심 라이브러리 및 자바 런타임 환경에서 사용하는 리소스 파일을 가지고 있다.
- 개발 관련 도구는 포함하지 않는다.
3. Server JRE
- JRE에서 PC용기능을 제거하고 서버기능을 추가한 제품
- 서버실행에 최적화 되있음
4. JDK (Java Development Kit)
- 자바 언어를 사용하여 프로그램을 개발하기 위한 도구(tool)
- JRE와 JVM이 포함되있다.
- 자바프로그램 작성, 컴파일, 테스트 및 디버깅을 할 수 있다.
5. Java EE (Java Enterprise Edition)
- 기업용 자바 개발도구
- 동시, 멀티 유저용 APP 제작기술 지원
- 일반적으로 J2EE(Java 2 Platform, Enterprise Edition) 로 알려져있음
- 주의! Java SE를 포함하지 않음.
그외 알아두면 좋은 용어정리 (지속 업데이트 예정)
- 바이트코드 (bytecode)
- 컴파일의 결과물 Java에선
.class에 번역된 코드
- p-code라고도 불림
- p-code
- JVM에서 실행되는 중간언어
- 플랫폼에 독립적
- 스택 기반 언어 즉, 연산에 사용되는 데이터는 스택에 저장 또는 피연산자를 가져와 연산을 수행
- 스택에서 잘못된 값을 참조하는것을 방지
⚠️ 스택이란?
LIFO(Last In First Out) 자료구조
마지막에 들어온 데이터가 가장 먼저나가는 구조
함수호출을 추적하는데 사용
함수를 호출하면 함수의 호출 정보가 스택에 저장 -> 종료되면 스택에서 호출정보 OUT
- 암호화 해시함수 (MD5, SHA256)
- 해시함수란?
- 입력 데이터를 고정길이의 출력 데이터로 변환하는 함수
- 데이터의 무결성을 검사하고, 비밀번호를 암호화 하는데 사용
- MD5
- 128비트 해시를 생성
- 1991년에 발표되어 사용되 왔으나, 2004년에 해시 충돌공격이 발견되며 사용을 안하는 추세
- SHA256
- 256비트 해시를 생성
- MD5보다 복잡한 알고리즘을 사용, 더 큰 해시값을 생성하여 충돌공격에 강함
- 블록체인기술에 사용하고 있음
- 아직까지 해킹을 한 사례는 없으나 블록체인기술의 발전에 따라 언제나 해킹가능성은 열어둘것
참조 : (https://losskatsu.github.io/blockchain/sha256/#)
compile(컴파일)
컴파일의 기본개념부터 알아보자

- 사람이 이해하는 언어를 컴퓨터가 이해하는 언어로 번역해 주는 과정
- 소스코드(작성한코드)를 기계어(컴퓨터가 이해하는 코드)로 바꿔주는 것을 compile(컴파일),
기계어를 실행파일로 바꿔주는 것을 Link(링크)라고 정의
- 컴파일과 링크의 기능을 하는 것을 컴파일러라 정의한다.
컴파일의 방식은 코드를 한번에 번역하여 실행파일에 저장 후 실행하는 방식이다.
동시통역처럼 바로 번역하는 방식도 있다. 바로 인터프리트 방식이다.
1. 인터프리트(interpret) 방식
- 기계어로 변환하지 않고 소스를 읽어서 실행 즉, 한마디씩 동시통역 해주는것
- 실행할 때마다 소스파일을 읽어서 실행 속도가 느린것이 단점
그렇다면 자바는 어떤방식으로 작동할까? 정답은 2가지 방법을 다 사용한다.
이것을 Hybrid방식이라고 말한다.
2. Java Hybrid Compile방식

3. 왜 자바가 Hybrid 방식으로 동작하는가?

-
자바는 어느 운영체제에 관계 없이 소스코드 한번만 작성하면 모두 동일하게 작동된다.
-
컴파일된 자바 .class 파일은 각 운영체제에 맞게 JVM에서 변환되어 각 플랫폼에 맞게 번역되는
방식이다.
-
이런이유로 자바는 하이브리드 방식으로 작동한다.
여기서 또 문제점이 있다. 바로 .class 파일은 JVM을 거쳐서나오기에 속도가 느리다는 것이다.
이것을 해결하기 위한 기술이 JIT 이다.
4. JIT (Just-In-Time)
- 중간언어에서 기계어로 컴파일 될때 자주 반복실행되는 코드를 임시저장하여 실행속도를 높이는 기술
- 자주반복되는 코드는 가상환경에서 cache 즉 임시보관장소에 저장하여 실행속도를 높이는것
- 자바, 파이썬, 자바스크립트 와 같은 인터프리터언어에 사용
- 장점
- 컴파일 시간이 짧음
- 컴파일 대상 플랫폼에 맞게 코드를 최적화 하기 쉬움
- 단점
- 실행속도가 느림
- 기계코드가 아니기에 플랫폼에 의존적

그외 기술 AOT (Ahead-of-time)
- 중간언어에서 소스코드를 실행시간 전에 기계코드로 컴파일 하는것을 말한다.
- 게임, 웹 브라우저 같은 실행속도가 중요한 애플리케이션에 사용
- 장점
- 실행 속도가 빠름
- 기계코드 이기에 플랫폼에 독립적
- 단점
- 컴파일 시간이 오래걸림
- 컴파일 대상 플랫폼에 맞게 코드를 최적하 하기 어려움