java --version
javac --version
자바 깔았는데 왜 2개나 확인하래?? 그냥 하나만 확인하면 되는 거 아님?
java javac가 뭐가 다른 거임? 하면서 찾아보는 글
gcc처럼 c가 컴파일러라는 뜻은 알았습니다.
하지만 JVM은 복잡한 컴파일러니까, 이 참에 공부하자.
JRE: Java Runtime Environment
JDK: Java Developmnet Kit
JVM: Java Virtual Machine
Javac: Java Compiler
Java: 프로그래밍 언어
백엔드 개발자가 보면 좋은 한 줄 😮
JRE: JVM 실행만 가능한 환경(읽기 전용), 컴파일러(javac)는 없음
JVM: 바이트코드를 OS/CPU에서 돌아가는 기계어 수준으로 변환(JIT 포함)
*JIT (글 맨 아래 상세) : https://codewizard.tistory.com/78
[EP.02] 백엔드 개발자를 위한 React Native를 빠르게 익히는 자바스크립트 기초 지식(Lexical, TDZ, ES6, V8
(C, Java, Python) 언어에 익숙한 백엔드 개발자가 React Native를 2주 내로 제작하기 위해, 다른 언어 지식을 기반으로 JS언어만의 특징과 동작 방식을 집중적으로 파악하여 정리한 글. 참고 RN 생태계: ht
codewizard.tistory.com
java
java 런타임 버전 == (JRE) 버전
javac
JDK 버전
Q: 머야?? 그럼 둘 다 확인하는거네, 굳이에요
A: 틀렸습니다. 정확한 이유를 모르기 때문입니다.
JDK 11 이후는 JDK = JRE + 개발도구(javac 등)가 별도 배포가 없습니다.
JDK 설치하면 java 와 javac 가 같은 버전으로 제공됩니다.
따라서, java --version과 java --version이 같은 버전으로 나옵니다.
따라서 정답은
Java 11이후에는 java, javac가 동일 버전이어야 정상이므로 이를 확인하는 과정입니다.
이 전 PATH에 남은 찌꺼기를 확인 및 꼬인 상태 체크에도 도움 됩니다.
JDK(Java Development Kit)
자바 개발키트로 개발자들이 자바로 개발하는 데 사용되는 SDK 키트입니다.
*SDK(Software Development Kit)란?
하드웨어 플랫폼, 운영체제 또는 프래그래밍 언어 제작사가 제공하는 툴
SDK 예시) 안드로이드 스튜티오

JDK에는 글에서 다루는
JRE: JVM 실행을 위한 용도
JVM: 자바 소스코드로 만들어지는 2진파일(.class)을 실행가능
Java Development Tools: javac, 디버거 등 개발자 툴 포함
전부 내장되어 있다.
JDK의 종류
*LTS(Long Term Support): 장기 지원을 받을 수 있는 버전
자바도 리눅스처럼(Ubuntu, CentOS, RedHat)처럼 여러 JDK로 나뉜다.
근데, Oracle 설치버전은 회사에서는 유료로 사용해야 한다.
이유: 라이센스 때문이다.
*필자는 회사에서 모르고 설치했다가 보안팀에서 삐용삐용 경험 있어요. ( ´・・)ノ(._.`)

Oracle JDK, Open JDK, Azul Zulu 등등이 있음.
Q: 아니 근데 비싼 돈 내고 Oracle JDK 자바 써야 함?? 그냥 공짜 오픈소스 Open JDK 쓰고 돈 아껴서 돈까스 사 먹으면 되잖아요.
A: 보안 패치와 장기 안정성 때문입니다.
기업 서버는 한 번 구축하면 수년 동안 같은 환경으로 안정적으로 돌려야 하는 경우기 많기에, 종종 JDK 버전을 유지합니다.
OpenJDK는 최신 버전을 6~12개월 정도만 패치해 주고, 그 이후에는 보안 취약점이 생겨도 직접 업그레이드해야 합니다.
*새로운 보안 위협은 시간이 지남에 따라 계속 나오기 때문입니다.
반면 Oracle JDK는 LTS 서비스를 제공하여 보안 패치와 안정성 업데이트를 꾸준히 지속합니다.
패치 후 문제 발생 시, 공식 기술 지원도 받을 수 있습니다.
즉, 버전 업데이트 비용을 줄이고 보안 리스크 최소화를 위해 유로 전환을 하더라도 Oracle JDK로 안전한 선택지가 될 수 있는 것이죠
JRE(Java Runtime Environment)
JRE = JVM + class Libraries(Java package class(util, math, lang 등)
이외에도 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스(jar) 파일을 가지고 있다.
JVM(Java Virtual machine)
자바를 돌리는 프로그램입니다.
자바 실행을 위해서는 반드시 JVM(자바 가상 머신)이 설치되어 있어야 합니다.
자바의 핵심 인기 이유는 OS에 종속되지 않기 때문이다.(JVM 때문이다!!)
*WORA(Write Once Run Anywhere)
한 번만 작성하고, 어떤 OS에서든 사용 가능하다.
백엔드 개발자로 비유하자면 OS ORM의 역할이야.
스프링에서 JPA를 사용하면, MaraDB나 MySQL이나 데이터베이스 방언을 JPA가 위임하여 처리한다.
다른 플랫폼을 하나의 공통 인터페이스로 감싸주는 역할인거지
*우리는 이 부분을 아예 생각하지 않잖아? Java를 쓰면 똑같이 기계어 번역에서 OS 종속성을 생각하지 않아도 돼!
Q: 이게 무슨 말이람?? 그럼 c언어나 Python, JavaScript는 어떻게 되는 거예요? 나는 프로젝트할 때 그냥 돌아가던데??
A: 질문이 완전히 잘못됐어, OS 개념과 실행파일부터 전반적인 프로세스를 헷갈리는 것 같네.
알맞은 질문으로 바꿔보자
Q1: 프로젝트가 잘 돌아가던데요?
A1: 런타임/도구가 잘 가려준 덕입니다. 종속성이 없는 게 아닙니다.
Q2: Java의 배포 산출물이 무엇인가요?
A2: 동일. jar(대개 공용)입니다.
Q3: Python은 어떻게 실행되나요? 배포할 때 OS를 신경 써야 할까요?
A3: 인터프리터 방식이어서. py에서 실행되고 CPython 컴파일러가 바이트코드로 변환 후 실행.
순수 파이썬은 OS 의존성이 거의 없음.
하지만 C 확장 모듈(numpy, opencv 등) 사용하면 whell(. whl) 배포를 해야 합니다.
Wheel(*. whl) 파일
파이썬 패키지 배포 = 컴파일된 바이너리 형식 재공 = OS 종속성 해결
Q4: JavaScript는 브라우저나 Node.js에서 돌 때 OS와 어떤 관계인가요?
A4: 런타임(V8)이 OS API를 감싸줍니다.
JS는 거의 OS 비종속적입니다.
*네이티브 애드온은 OS 차이를 가질 수 있습니다.
Q4-1: OS API로 감싼다가 무슨 말이에요?
A4-1:
| Windows | CreateFileW, ReadFile | fs.readFile(path, cb) |
| Linux | open, read | fs.readFile(path, cb) |
| macOS | open, read | fs.readFile(path, cb) |
운영체제의 저수준 시스템 콜 호출을 공통 함수 추상화로 브라우저/V8이 대신 감싸서 제공합니다.
*브라우저는 운영환경에서 의미합니다.
*로컬환경에서는 Node.js가 Node API를 호출해서 시스템 콜을 감싸줍니다.
C언어로 설명하는 JVM의 OS 종속성 (feat. C언어 이식성 좋다며!!)
컴파일된 코드를 2진 코드(Binary code, 기계어)라고 부른다.
그런데 이 기계어는 OS 환경에 맞춰진 독자적인 컴파일러라서 다른 OS에서는 이해하지 못한다.

그래서 C언어는 OS 종속된 언어입니다.
윈도우 OS 컴파일된 코드는 리눅스 OS에서 읽을 수 없습니다.
1) 윈도우용 C
2) 리눅스용 C
따로 제작해야 합니다.
Q: C언어는 이식성이 좋다고 배웠는데요..??
결론: 이식성과 종속성은 추구하는 방향이 다릅니다.
c언어의 이식성은 다양한 하드웨어와 컴파일러에서 작동가능 하여, 하드웨어의 특징을 고려하여 코드를 다채롭게 짤 수 있다는 뜻이다.
= 개발자에게 표현의 자유를 주는 것이고, 의존을 넘겨 책임이 올라간다.
그래서 C언어의 정신을 따른다. C99 Rationale 참고
프로그래머를 믿어라. (Trust the programmer)
프로그래머가 작업을 못하게 방해하지 마라. (Don't prevent the programmer from doing what needs to be done)
반면, 최근에 만들어진 언어 중 Java는 속도가 느려지더라도 다른 운영체제에서 JVM 하나로 동작함을 추구했다.
이러한 장점 때문에 Java 외 다른 언어(그루비, 코틀린 등)에서도 이 JVM 사용하고 있다.
*그루비: nGrinder 스크립트 용어
'Programming > Java' 카테고리의 다른 글
| [java] 자바 문법 기초 (2) | 2023.09.02 |
|---|