[Java기초]1-2강, JavaVRMachine?
Thread main = new Thread(this, "mainThread"); //숙련자를 위한 파트 - JVM의 이해
이제 저희는 마치 기초과학처럼, 굉장히 심오하고 기반적인 면을 다뤄보려합니다.
여러분, 만약 여러분이 이태원 거리를 감성해 취해 (마스크를 쓰고)걷고있을때, 옆에서 외계어를 선보이는스페인 사람이 말을 걸면 어떻게 하시나요? 보통 idk Eng 를 시전하며 런각을 보시는분이 많은데요. 만약 대화할 의향이있다면 저희는 구글 번역기 혹은 파파고를 사용합니다. 이렇듯 프로그래밍 언어 또한, 0과 1로 이루어진 기계어로 바꿔줄 번역기가 필요한데요. 그것이 바로 인터프리터 입니다. 하지만, 스페인어 번역기는 스페인어를 한국어로 번역해줄 수는 있지만 다른 나라의 언어 혹은 사투리는 번역을 잘 못하죠? 그래서 자바에서 고안한것이, 통합적인 하나의 언어로 만든 뒤 다시 기계어로 변환하는 기계, 자바 가상머신과 자바 바이트 코드입니다.
//Description //빌드업과 회수를 동시에!
여러분, 여러분이 계산기 프로그램을 만드려고 합니다. 계산기는 콘솔 창으로 되어있으며, 공학용 연산 또한 수행할 수 있어야합니다.
이를 저급 언어 에서 구현하려면 어떻게 해야할까요?
일단 콘솔창을 불러와야할겁니다. Os에 따라 이름, 확장자 등이 다른데다가 어느정도의 사용법도 다르니 각기 다르게 짜야겠죠. 그 뒤엔 어떻게 해야할까요?
연산을 하기위해 저희는 컴퓨터가 이 프로그램에 어느정도의 자원을 투자할지 "일일히" 계산합니다. 마치 우리가 수필로 가계부를 적듯이 컴퓨터에서 무엇을 먼저 실행시키며 어느정도의 메모리 (RAM = 컴퓨터의 기억을 맡는 부분이라 생각하시면 됩니다.)를 사용할 것 인지 등을 일일히 정해주어야겠죠. 만약 프로그램이 설정한 메모리보다 1바이트 만큼이라도 메모리가 부족하다면 프로그램은 정상적으로 작동되지 못할 것 입니다.
이러한 방법의 단점은 무엇일까요?
"불편함" 입니다. 물론 메모리를 일일히 지정한다면 (만약 천재라면) 그만큼 메모리를 상황에 맞게 효율적으로 분배하는것이 가능하겠지만, 오류가 날 확률도 확연히 높습니다. 그래서 여러분의 카드내역을 자동으로 추적해주는 "디지털 가계부" 가 나왔습니다.
바로 자바 가상머신 JVM(JavaVirtualMachine) 입니다!
자바 가상머신은 여러분이 미처 생각하지 못한 메모리관리를 보편적인 방법으로 대신해줍니다! 또한, 그 어떠한 운영체제(OS) 에서라도 차이가 없이 작동되게 해줍니다!
(여담으로 자바의 철학은 한번의 빌드로 어디서든 쓸수있게! 입니다. JVM이 좋은 예시인듯 하네요)
하지만 여러분, 메모리관리를 대신해주는것은 알겠지만, 운영체제나 환경에 따른 차이가 없이 작동하게 해준다는건 무언가 수상하지 않나요? 결국 0과 1의세계로 가면, 운영체제가 다르면 코드 또한 확연히 다른데 과연 어떻게 차이가 없게 작동되게 할까요?
이에 머기업 자바는 자신들만의 기계어, 자바 바이트코드를 개발하였습니다 .
자바 바이트코드는 자바에서 개발한, 로우레벨의 언어로 JVM으로 불러진뒤(로딩) 특수한 엔진을 통해 해석되어 수행됩니다. 즉,"로우레벨에서의 자바" 정도로 생각하시면 될것같습니다.
읽고 쓰기, 논리연산, 형변환, 객체생성 / 조작, 스택관리, 제어, 함수 호출 및 반환
의 기능에따라 256가지나 되는 명령어가 존재합니다!
q=May+I+need+to+learn+JavaByteCode&oq=May+I+need+to+learn+JBC //자바 바이트코드를 꼭 배워야 하는가
chrome 의 검색인자 쿼리데이터 URL 표기식
결론부터 말하자면 "없습니다"
자바 바이트 코드는 어셈블리 언어와 유사하며, 그렇기에 기계어에 "굉장히" 가깝습니다. 기능은 심지어 이진수와 1대 1로 매칭이 될 정도이죠. 즉, 배울 경우 좀더 자바에 대한 깊은 이해와, 잘 사용하기만 한다면 훨씬 낫은 성능(최적화)를 지닌 프로그램을 만들 수 있습니다. 하지만 여러분, 저희가 계산기를 만들때 이진수로 코딩하나요? 서버 관리용 프로그램을 짤때 어셈블리어를 씁니까?
단연코 "아닙니다"
그렇기에 자바 바이트 코드또한, 알고있다면 좋지만 "굳이 깊이 알 필요는 없는" 것 이라고 보시면 될 것 같습니다
break; //마무으리
이번 강의의 숙련자 파트는 분량이 너무 길어, 2개의 강좌로 자르게 되었습니다! 다음시간부터는 드디어 코딩을 할 것 입니다.(다음시간이라 해도 어짜피 바로 올라갈거같네요 ^^) 그럼 모두 !녕~~
! 는 Java에서 부정문으로 쓰입니다
PatrickKR
2020.06.07자바로 공부(뻘짓) 하다보면 BCI 하라면서 ASM출 던져 주는데, 바이트코드 모르면 어떻게 해야하죠.. ㅠㅠ (그런 의미에서 바이트코드 강좌 OR ASM강좌 한번 해주실수 있나요? ㅎㅎ)