JVM, JRE, JDK가 뭔가요?
📜 라디오 대본
얄코: 차에서 듣는 얄코 라디오!
얄코: 첫 번째 방송 시작합니다
얄코: 저는 얄팍한 유튜버 얄코
미토: 저 미친토끼 미토에요. 내 목소리 이게 아니었는데
얄코: 아, 그 '웹 공격과 방어' 영상에서는 제 목소리랑 똑같았는데
얄코: 여기서도 그러면 저랑 겹치니까 앞으로는 그 목소리로...
미토: 설정오류네요 설정오류 그리고 마지막 기억이 좀 흐릿한데
미토: 사자한테 보안가지고 막 뭐라고 하다가... 뒤졌구나 그때
미토: 지금 죽여놓고 되살려다가 부캐로 쓰겠다는거 아녜요
미토: 목소리는 헬륨 멕여가지고
얄코: 부캐...랑은 좀 다른 개념인데 여튼
얄코: 자 이 '얄코 라디오' 컨텐츠는요
얄코: 오늘 다룰 자바 관련 용어들처럼
얄코: 딱히 시각자료 없이도 설명 가능한 용어나 개념들을
얄코: 굳이 화면 들여다 볼 필요 없이
얄코: 출근길에 운전하면서 아니면 혼자 식사하시면서
얄코: 또는 그냥 소파에 눈감고 편히 앉아 쉬면서
얄코: 가볍게 귀로만 들으실 수 있도록 기획한 컨텐츠입니다
미토: 그냥 당신이 영상 만들기 편하려고 기획한 느낌인데
미토: 그래픽 작업 안 하고 싶어서 이러는거 아니에요!
얄코: 그런 면에서라기보다는요,
얄코: 사람들이 코딩 공부하면서 많이들 궁금해하지만
얄코: 막 일일이 일러스트 그리고 애니메이션 넣어가면서
얄코: 영상으로까지 힘들게 만들기엔 애매한 주제들 있잖아요
미토: 가성비 안 나오는것들요 가성비
얄코: 아니 쫌, 어쨌든 종종 그런 주제들도
얄코: 긴 강의나 영상 준비하는 중간중간에
얄코: 보다 적은 시간을 들여서 오디오 컨텐츠로 만들면
얄코: 구독자분들도 보다 많은 내용들을 접하실 수 있을거구요
미토: 그러면요 우리가요 네? 열일을 해야돼요 네?
미토: 가성비를 챙겼으니까요 좋은 컨텐츠들로 아주그냥 뽕을 뽑아야
미토: 누가 뭐라고 안하는 거인 거거든요
미토: 자, 여러분은요 막장 코딩방송 얄코라디오랑 함께하고 계시구요
미토: 오늘 주제는요 JVM이랑요 JRE랑요 JDK랑요
미토: 아 또 없나 이것들 이렇게 알아볼거에요
얄코: 이번 화는 시범운행같은거라고 생각해주시구요
얄코: 이러한 진행으로 괜찮다면 이후 본격적으로
얄코: 여러분이 궁금해하시는 내용들로 자주 찾아뵙겠습니다.
얄코: 자, JVM과 JRE 그리고 JDK
얄코: 자바 배우시는 분들은 다 접해보셨을 용어들이죠
얄코: 특이 이 JVM이란 용어는 자바 코드보다도 먼저 보셨을거에요
얄코: 자바 가상 머신이다, 한 번 작성해서 어디에서든 실행한다
얄코: 이런 말들 초반 이론 부분에서 많이들 들으셨을텐데
얄코: 이게 구체적으로 무슨 뜻이죠?
미토: 거기에 머신이란 말이 들어가서 사람 헷갈리게 만드는데
미토: 그냥 프로그램이에요 프로그램 JVM은 그냥 프로그램이다
미토: 그럼 뭐 하는 프로그램이냐
미토: 우리가 코딩할때 쓰는 자바나 C, 파이썬같은 언어들은
미토: 사실 우리같은 사람이나 토끼가 보기 편하라고 만든거란 말이에요
미토: 컴퓨터는 이거 못 읽어요. 컴퓨터는 0이랑 1만 알아듣는거
미토: 이거 다 알잖아요 제가 여러분을 존중을 하기 때문에
미토: 이거 다 안다고 가정하고 내가 얘기를 하는거거든요
미토: 그니까 이 컴퓨터란 애들은 01001001110
미토: 막 이렇게 쓰인 걸 갖다줘야 알아먹든단 얘기죠
얄코: 기계어라고 하죠. 2진수로 된, 바이너리로 작성된 언어
미토: 근데 이 기계어는 또 우리가 읽고 작성하기에는 토나오거든요
미토: 모니터에 막 1100101110010 이렇게 써있으면 어떻게 읽어요 그걸
미토: 이걸로 실무코딩을 할 수 있는 개체는 토끼중에는 없어요 제가 알기로는
얄코: 저희 인간 중에서도 의미있는 명수는 안 나올거에요
얄코: 폰 노이만이 그랬다는데 그것도 많이 단순한 옛날 프로그램이고
미토: 우리도 그 용궁 갔다온 선조분은 좀 가능하시지 않았을까 그정도죠
얄코: 여튼 우리가 읽고 작성할 수 있는 프로그래밍 언어를
얄코: 컴퓨터가 알아들을 수 있는 기계어로 바꿔주는 작업을
얄코: C나 자바같은 컴파일 언어에서는 컴파일러가 진행을 해주는거잖아요
얄코: 우리가 코딩한 결과가 미리, 기계어나 그에 가까운 언어로
얄코: 컴파일, 번역이 되는거죠. 컴파일러라는 번역가에 의해.
얄코: 파이썬같은 인터프리터 언어는 일단 논외로 할게요
얄코: 그럼 이 JVM이 있는 자바는, 같은 컴파일 언어인
얄코: C 등이랑은 어떤 점에서 다른거죠?
미토: 이 컴퓨터들이요 얘네가 또 다 같은 기계어를 쓰는게 아니에요
미토: 0이랑 1로 돼 있다고 다 같은 언어가 아닌거거든요
미토: 똑같이 C로 짜서 컴파일한 기계어인데
미토: 윈도우에서 돌게 컴파일한거는
미토: 맥이나 리눅스에서는 또 안 돈다 이 말이에요
미토: 그럼 어떻게 해야돼요. 프로그램이 돌 환경, 컴퓨터마다
미토: 거기에 맞는 기계어로 일일이 번역을 해줘야돼요
미토: 그래서 제가요 C로 프로그래밍 할 때요
미토: 기껏 컴파일해서 줬는데 아 내 컴퓨터에서는 안 돈다 그러면
미토: 이런 C프로그래밍
미토: 에이 C프로그래밍
얄코: 자, 알겠구요
얄코: 그런 문제를 해결하기 위해 만들어진 게 자바의 JVM인거죠
얄코: 쉽게 말하자면, 각 종류의 컴퓨터마다
얄코: JVM이라는 전담 통역센터가 있는거에요
얄코: 주재 대사관 같은거라고 생각하셔도 돼요
얄코: 우리가 자바로 코딩을 하고 나서 컴파일을 하면
얄코: 기계어는 아니고, 바이트코드란게 생겨요
얄코: 사람이 쓰는 자바 코드에서 컴퓨터가 읽는 기계어로의
얄코: 중간 단계에 있는 코드라고 생각하면 돼요
얄코: 우리가 자바로 Hello.java를 작성하고 나서
얄코: 파워쉘이나 터미널에 javac, 자바 컴파일러죠
얄코: javac Hello.java 이 명령을 내리면
얄코: 같은 위치에 Hello.class가 만들어지거든요
얄코: 이 .class 파일이 바이트코드인거에요
미토: 자바를 컴파일해서 점 클래스 바이트 코드
얄코: 그렇게 노래로 외우는거에요? 자바를 컴파일해서
미토: 자바를 컴파일해서 점 클래스 바이트 코드
미토: 안 잊어먹어요 이러면
얄코: 여튼 이 바이트코드를 실행할 컴퓨터에 깔린 JVM에 갖다주면
얄코: 그 컴퓨터가 이 프로그램을 실행할 때 이 JVM이
얄코: 바이트코드를 그때그때 기계어로다가 통역을 해주는거에요
얄코: 이 바이트코드를 쓴다는거에서 또 부수적으로 나오는 장점이 뭐냐면
얄코: 자바 뿐만이 아니라, Groovy나 Scala, Clojure,
얄코: 그리고 안드로이드 만들 때 접하는 Kotlin같은 언어들도
얄코: 다 JVM이 전용 바이트코드로 컴파일이 되거든요
얄코: 그 언어들로도 JVM을 돌리는 기계에서의 프로그램을 짤 수 있는거죠
미토: 아니 그럼 자바나 코틀린 말고 스칼라나 그루비 갖다가도
미토: 안드로이드 앱을 만들 수 있는거란 말이에요?
얄코: 굳이 하자면 하면 할 수 있어요. 자료나 그런게 많지 않아서 그렇지
얄코: 하나만 더 언급하자면 이 JVM처럼 주어진 코드를
얄코: 실행 시점에 그때그때 기계어로 '통번역'을 해주는 방식을
얄코: Just In Time 컴파일, 줄여서 JIT컴파일이라고 하거든요
얄코: 이 JIT컴파일러는 나중에 더 깊이 다뤄볼게요
미토: 자바를 컴파일해서 점 클래스 바이트 코드
미토: JVM에 넘겨주면 기계어로 번역이 된다네
미토: JIT 컴파일러
얄코: 뒷부분 갑자기 뭐에요
얄코: 그 노랜 좀 아닌 것 같구요
미토: 솔까 당신 목소리로 해 보기 민망한거 나한테 짬시키는거 아녜요
얄코: 여하튼 JVM은 자바로 짜서 컴파일한 소프트웨어들이
얄코: JVM이 깔린 어떤 종류의 컴퓨터에서든 돌 수 있게 해주는것
얄코: 이렇게 정리하면 되겠네요
얄코: 그래서 '한번 작성하면 모든 곳에서 실행한다'
얄코: Write Once Run Anywhere
얄코: 이 W-O-R-A가 자바의 원칙인거에요
미토: WORA면 워라네 워라
미토: 워라벨이란 말이 거기서 나온거죠. 한 번 쓰고 논다고
얄코: 아니에요
미토: 암튼 어딜 가든간에 현금 뽑으려면 ATM 찾듯이
미토: 어느 컴에서든 바이트코드 돌리려면 JVM 찾으면 되는것이다
얄코: 그건 라임 그럴듯하네요. 이젠 JRE로 넘어갈게요
얄코: JRE는 Java Runtime Environment의 약자죠
미토: 자바 런 타임. 자바가 뭐 달릴 시간이라는 거에요?
미토: 자바로 밤샘코딩 함 달려보다 죽어봐라?
미토: 그러라고 언어 이름도 커피 이름으로 지었나보네
미토: 카페인 들이붓고 겁나 달리라고
얄코: 그건 아니구요, 자 이 런타임이라는게
얄코: 컴파일 타임이랑 대조되는 말이거든요
얄코: 컴파일이란 건 아까 얘기한 그 번역 작업
얄코: 즉 코딩 다 하고 이걸 실행하거나 배포하기 전에
얄코: '미리' 해두는 번역 작업이잖아요
얄코: 그걸 하는 시점을 컴파일 타임이라고 하구요
얄코: 런타임은 반대로 이걸 run, 실행하는 시점을 말해요
얄코: 그러니까 이 JRE, 자바 런타임 환경이란 건
얄코: 자바로 짠 소프트웨어가 컴파일 및 빌드까지 다 된 다음
얄코: 이를 사용할 곳에 주어져서 실행이 될 때
얄코: 그 환경 요소들로서 필요한 것들인거죠
미토: 실행되는 시점이면은 바이트코드로 컴파일된 상태일거고
미토: 아니 그럼 그걸 JVM이 기계어로 읽어주면 되는건데
미토: 왜 또 뭐가 필요하다는거에요?
얄코: 소프트웨어라는 게, 딱 우리가 자바나 그런 언어로
얄코: 작성한 코드만으로 돌아갈 수 있는게 아니거든요
얄코: 예를 들어서 우리가 자바의 자료구조 기능들인
얄코: List나 Map, Set 같은 걸 사용할 수 있는 이유는
얄코: 우리가 그런 기능들을 일일이 다 구현했기 때문이 아니라
얄코: 그것들이 바이트코드로 컴파일된 클래스로 제공이 되기 때문이에요
미토: 내가 당신 말을 검증을 해봐야겠어. 컴퓨터에 JRE 깔린데 들어가서
미토: 어딨어 안 보이는데? 아
미토: 이 rt.jar 찾아서 압축 푸니까 진짜 다 나오네요 List.class 같은거
얄코: 이것저것 되게 많죠 .class 파일들이
미토: 이 기능들이 다 여기 들어있는 거였구만
얄코: 그래서 이처럼 널리 쓰이는, 그리고 JVM에서 도는 라이브러리들을
얄코: JVM이랑 세트로 묶어다가 다운받아 설치할 수 있도록 한게
얄코: 이 자바 런타임 환경, JRE에요.
미토: 그럼 예전에 윈도우에서 가끔 무슨 프로그램 설치할 때
미토: 자바 필요하다면서 무슨 다방커피잔 뜨고 같이 설치되는게
미토: 이 JRE인거네요?
얄코: 그쵸. 위에서 말했듯 어떤 컴퓨터든 이 JRE만 깔리면
얄코: 자바로 작성한 프로그램을 돌릴 수 있게 되는거죠.
얄코: 이 JRE가 JVM도 포함을 하고 있거든요.
미토: 어떤 컴퓨터에든 인터넷 익스플로러를 깔면
미토: 액티브X를 돌릴 수 있는것처럼요
얄코: 예시를 들어도 재수없게
미토: 근데 왜 요즘 JRE가 눈에 덜 띄는 것 같지?
미토: 여기 지금 오라클 사이트 들어가서 보니까
미토: 자바 11은 JRE는 안 보이고 JDK란 것만 보이는데
미토: 이건 왜 그런거에요?
얄코: 이참에 JDK까지 설명을 하는게 좋겠네요
얄코: JDK는 Java Development Kit
얄코: 말 그대로 자바 개발 도구의 약자인데요
얄코: JRE가 JVM을 포함하는것처럼 JDK도 JRE
얄코: 즉 자바의 런타임때 필요한 요소들도 포함을 해요.
얄코: 거기에 추가해서 JDK에는 개발에 필요한 것들
얄코: 이를테면 자바 코드를 컴파일할때 쓰는 javac
얄코: 자바를 디버깅할 때 쓰는 jdb
얄코: 서로 연관 있는 클래스들을 하나의 JAR 파일로 묶어주는 jar
얄코: 기타 등등, 위키피디아 JDK 항목 보시면 쫙 나와있어요
얄코: 이처럼 최종사용자가 아닌 프로그래머를 위한 기능들도
얄코: 같이 탑재를 하고 있는거죠
미토: 그런데 JRE를 따로 제공을 안 하면 어떡해요?
미토: 일반인들도 개발자 도구까지 다 받아야되나?
미토: 전국민의 개발자화 같은거에요?
얄코: IT환경이 계속 바뀌면서 이런것들도 변화를 해요
얄코: 예전에는 최종 사용자들이 자바 프로그램 돌리려면
얄코: 아까 그 커피 그려진 화면 나오는 JRE를 따로 설치하고 그랬는데
얄코: 사실 이것도 딱히 좋은 그림은 아니잖아요
얄코: 자바 11은 개발자가 배포하는 자바 프로그램에
얄코: JRE랑 JVM 요소들까지 끼워넣어서
얄코: 사용자는 그냥 그 프로그램만 받아서 쓰면 되도록 미는거구요
얄코: (아까 말한 WORA랑은 조금 다를 수 있지만)
얄코: 그리고 자바 돌리는 서버같은 경우 그냥 아예 JDK를 설치해서
얄코: 어차피 용량 크지 않으니까. 그렇게 사용을 하는거죠
미토: 근데 이 JDK도 종류가 되게 여러가지가 있지 않아요?
미토: 뭐 공짜로 쓸 수 있는것도 있고 돈 내야 되는것도 있고 그러던데
얄코: 네, 일단 헛갈려서는 안 되는게 자바란 언어 자체는 무료구요
얄코: 이 자바로 뭘 개발할 때 쓰는 툴인 JDK 중에
얄코: 대표적으로 오라클에서 배포하는 Oracle JDK 등이
얄코: 상업적 이용에 한해서 유료에요. 개인은 공짜로 써도 됩니다
얄코: 무료로 이용하고자 하시는 분들은 같은 오라클의 OpenJDK나
얄코: Azul에서 만든 Zulu, Amazon의 Coretto 등등
얄코: 다른 데서 만든 좋은 무료 버전들도 여럿 있구요
얄코: 최근에는 마이크로소프드도 Open JDK를 출시했죠
얄코: 선택지는 굉장히 다양합니다.
얄코: 이 JDK 배포판에 따라 그에 내장된 JVM도 다를 수 있어요
미토: 유료 버전이랑 무료 버전은 그럼 어떤 차이점이 있는거에요?
미토: 싼게 비지떡이라고 무료인걸로 하면 뭐가 막 안 되고 그러나?
얄코: 회사에서 돈을 받고 제공하는 것들은 아무래도
얄코: 성능이랑 안정성, 최신 기능 등에서 나은 면들이 있죠
얄코: 그래서 큰 업체들에서는 그런 버전들을 많이들 쓸 거구요
얄코: 하지만 Open JDK들도 이를 많이 따라잡은 상태고
얄코: 좋은 것들은 Oracle JDK에 못지 않게 쓸만하다고 해요
얄코: 어지간한 소프트웨어 개발에는 별 문제가 없기 때문에
얄코: 서비스의 규모나 특성에 따라서 적합한 걸 선택하시면 될거에요.
얄코: 자 이렇게 JVM과 JRE, JDK를 알아보는 시간을 가졌는데
얄코: 이것들의 포함 관계를 어떻게 정리를 한 번 해 볼까요?
미토: 자려고 누웠는데 어디서 막 잡음이 들려요
미토: 근데 다음날 코딩을 하려면 잠을 자야되니까
미토: 이런 잡음따위 가볍게 즈려밟고 잠들어주마 하고 자는데
미토: 이 잡음이 계속 겁나 들리니까 자다가 깨버리는거죠
미토: 그래서 JVM - 잡음을
미토: JRE - 즈려밟고
미토: JDK - 자다 깨
미토: 잡음을 즈려밟고 자다 깨
미토: 이렇게 JVM JRE JDK 순서를 외우시면 된다
얄코: 잡음을 즈려밟고 자다 깨
미토: 잡음을 즈려밟고 자다 깨
얄코: 이건 딱히 와 닿거나 웃기는것도 아니고
얄코: 굳이 이렇게까지 외워야하나 싶기도
미토: 너님이 각본 짜놓고 왜 나한테 계속 지랄이세요
얄코: 자, 얄코 라디오 첫 방송 오늘 이렇게 마무리하겠습니다
얄코: 앞으로 얄코라디오에서 다뤄주었으면 하는
얄코: 오늘처럼 가벼운 주제들 있으면 댓글로 남겨주시구요
얄코: 이상 얄코외 미토였습니다. 즐코하세요!
미토: 와, 이걸 시각자료 하나 없이 이렇게 때워버리네
미토: 이거는 뭐 날코야 날코 날로먹는 코딩사전
유튜브에서 영상 보기