[{"data":1,"prerenderedAt":517},["ShallowReactive",2],{"post-document:\u002Fjava\u002Fjvm\u002F2026\u002F08\u002F10\u002Fjava-python-compile-comparison\u002F":3},{"id":4,"title":5,"body":6,"categories":498,"date":500,"description":501,"extension":502,"image":503,"key_concepts":503,"last_modified_at":503,"legacyPath":504,"meta":505,"navigation":258,"part":507,"path":508,"published":258,"robots":503,"seo":509,"series":510,"stem":511,"strengths":503,"summary":503,"tags":512,"tradeoffs":503,"__hash__":516},"posts\u002Fposts\u002FBackend\u002FJAVA\u002Fjvm\u002F2026-08-10-java-python-compile-comparison.md","Java 실행과 JVM Part 1: Java와 Python 컴파일 비교",{"type":7,"value":8,"toc":490},"minimark",[9,13,18,29,33,37,40,47,85,88,105,111,114,117,120,132,138,141,147,152,158,165,176,179,205,208,214,217,222,225,231,237,240,244,269,272,277,286,289,292,298,301,347,350,356,360,459,462,465,478,481,486],[10,11,5],"h2",{"id":12},"java-실행과-jvm-part-1-java와-python-컴파일-비교",[14,15,17],"h3",{"id":16},"python","Python",[19,20,26],"pre",{"className":21,"code":23,"language":24,"meta":25},[22],"language-text","main.py\n    ↓\n소스코드 파싱\n    ↓\nBytecode 생성\n    ↓\nPython Virtual Machine에서 실행\n","text","",[27,28,23],"code",{"__ignoreMap":25},[30,31,32],"p",{},"컴파일과 실행이 붙어서 그렇지 Python도 내부적으로는 바이트코드로 컴파일하는 과정이 있다.",[14,34,36],{"id":35},"java","Java",[30,38,39],{},"파이썬보다는 JAVA의 컴파일 과정이 더 명확하게 분리된다.",[30,41,42,43,46],{},"예를 들어 ",[27,44,45],{},"Main.java"," 파일이 있다고 치자.",[19,48,51],{"className":49,"code":50,"language":35,"meta":25,"style":25},"language-java shiki shiki-themes github-light github-dark","public class Main {\n    public static void main(String[] args) {\n        System.out.println(\"Hello\");\n    }\n}\n",[27,52,53,61,67,73,79],{"__ignoreMap":25},[54,55,58],"span",{"class":56,"line":57},"line",1,[54,59,60],{},"public class Main {\n",[54,62,64],{"class":56,"line":63},2,[54,65,66],{},"    public static void main(String[] args) {\n",[54,68,70],{"class":56,"line":69},3,[54,71,72],{},"        System.out.println(\"Hello\");\n",[54,74,76],{"class":56,"line":75},4,[54,77,78],{},"    }\n",[54,80,82],{"class":56,"line":81},5,[54,83,84],{},"}\n",[30,86,87],{},"먼저 컴파일하면",[19,89,93],{"className":90,"code":91,"language":92,"meta":25,"style":25},"language-bash shiki shiki-themes github-light github-dark","javac Main.java\n","bash",[27,94,95],{"__ignoreMap":25},[54,96,97,101],{"class":56,"line":57},[54,98,100],{"class":99},"sScJk","javac",[54,102,104],{"class":103},"sZZnC"," Main.java\n",[19,106,109],{"className":107,"code":108,"language":24,"meta":25},[22],"Main.java\n    ↓ javac\nMain.class\n",[27,110,108],{"__ignoreMap":25},[30,112,113],{},"가 만들어진다.",[30,115,116],{},"Main.class 안에는 Java Bytecode가 들어 있다.",[30,118,119],{},"그 다음으로",[19,121,123],{"className":90,"code":122,"language":92,"meta":25,"style":25},"java Main\n",[27,124,125],{"__ignoreMap":25},[54,126,127,129],{"class":56,"line":57},[54,128,35],{"class":99},[54,130,131],{"class":103}," Main\n",[30,133,134,137],{},[27,135,136],{},"Main.class → JVM → 실행","이 된다.",[30,139,140],{},"전체적으로 다시 살펴보면",[19,142,145],{"className":143,"code":144,"language":24,"meta":25},[22],"Java Source\nMain.java\n    ↓\njavac 컴파일\n    ↓\nJava Bytecode\nMain.class\n    ↓\nJVM\n    ↓\n실행\n",[27,146,144],{"__ignoreMap":25},[148,149,151],"h4",{"id":150},"java가-디렉터리를-읽는-부분","Java가 디렉터리를 읽는 부분",[19,153,156],{"className":154,"code":155,"language":24,"meta":25},[22],"project\u002F\n├── Main.java\n├── User.java\n└── Car.java\n",[27,157,155],{"__ignoreMap":25},[30,159,160,161,164],{},"위 구조에서 ",[27,162,163],{},"javac Main.java","를 실행했다고 하자.",[30,166,167,168,171,172,175],{},"Java가 아무 이유 없이 ",[27,169,170],{},"User.java",", ",[27,173,174],{},"Car.java","를 전부 실행하는 것은 아니다.",[30,177,178],{},"Main.java가 어떤 클래스를 참조하는지 확인할 뿐이다.",[19,180,182],{"className":49,"code":181,"language":35,"meta":25,"style":25},"public class Main {\n    public static void main(String[] args) {\n        User user = new User();\n    }\n}\n",[27,183,184,188,192,197,201],{"__ignoreMap":25},[54,185,186],{"class":56,"line":57},[54,187,60],{},[54,189,190],{"class":56,"line":63},[54,191,66],{},[54,193,194],{"class":56,"line":69},[54,195,196],{},"        User user = new User();\n",[54,198,199],{"class":56,"line":75},[54,200,78],{},[54,202,203],{"class":56,"line":81},[54,204,84],{},[30,206,207],{},"그러면 컴파일러 입장에서는",[19,209,212],{"className":210,"code":211,"language":24,"meta":25},[22],"Main.java 컴파일 중\n\nUser라는 타입이 있네?\n    ↓\nUser가 어디 있지?\n    ↓\nclasspath \u002F sourcepath에서 검색\n",[27,213,211],{"__ignoreMap":25},[30,215,216],{},"그래서 어제했던 것 중에",[30,218,219],{},[27,220,221],{},"Stock cannot be resolved to a type",[30,223,224],{},"Main.java 에",[30,226,227,230],{},[27,228,229],{},"Stock stock = new Stock();","가 있는데",[19,232,235],{"className":233,"code":234,"language":24,"meta":25},[22],"Stock이 뭐지?\n    ↓\n클래스를 찾아봄\n    ↓\n못 찾음\n    ↓\nStock cannot be resolved to a type\n",[27,236,234],{"__ignoreMap":25},[30,238,239],{},"이렇게 된것 .",[148,241,243],{"id":242},"여기서-package가-등장","여기서 Package가 등장",[19,245,247],{"className":49,"code":246,"language":35,"meta":25,"style":25},"package com.example.model;\n\npublic class User {\n}\n",[27,248,249,254,260,265],{"__ignoreMap":25},[54,250,251],{"class":56,"line":57},[54,252,253],{},"package com.example.model;\n",[54,255,256],{"class":56,"line":63},[54,257,259],{"emptyLinePlaceholder":258},true,"\n",[54,261,262],{"class":56,"line":69},[54,263,264],{},"public class User {\n",[54,266,267],{"class":56,"line":75},[54,268,84],{},[30,270,271],{},"라면 이 클래스 정식이름 User가 되는 것이 아니라",[30,273,274],{},[27,275,276],{},"com.example.model.User",[19,278,280],{"className":49,"code":279,"language":35,"meta":25,"style":25},"import com.example.model.User;\n",[27,281,282],{"__ignoreMap":25},[54,283,284],{"class":56,"line":57},[54,285,279],{},[30,287,288],{},"그래서 구체적으로 명시하면\nUser라고 쓰면 com.example.model.User를 말하게 된다.",[30,290,291],{},"그래서 JAVA 프로젝트를 조금 더 정확히 보면",[19,293,296],{"className":294,"code":295,"language":24,"meta":25},[22],"src\u002F\n└── com\u002F\n    └── example\u002F\n        ├── Main.java\n        └── model\u002F\n            └── User.java\n",[27,297,295],{"__ignoreMap":25},[30,299,300],{},"Main.java:",[19,302,304],{"className":49,"code":303,"language":35,"meta":25,"style":25},"package com.example;\n\nimport com.example.model.User;\n\npublic class Main {\n    public static void main(String[] args) {\n        User user = new User();\n    }\n}\n",[27,305,306,311,315,319,323,327,332,337,342],{"__ignoreMap":25},[54,307,308],{"class":56,"line":57},[54,309,310],{},"package com.example;\n",[54,312,313],{"class":56,"line":63},[54,314,259],{"emptyLinePlaceholder":258},[54,316,317],{"class":56,"line":69},[54,318,279],{},[54,320,321],{"class":56,"line":75},[54,322,259],{"emptyLinePlaceholder":258},[54,324,325],{"class":56,"line":81},[54,326,60],{},[54,328,330],{"class":56,"line":329},6,[54,331,66],{},[54,333,335],{"class":56,"line":334},7,[54,336,196],{},[54,338,340],{"class":56,"line":339},8,[54,341,78],{},[54,343,345],{"class":56,"line":344},9,[54,346,84],{},[30,348,349],{},"컴파일러는 대략 이런 관계를 확인하다.",[19,351,354],{"className":352,"code":353,"language":24,"meta":25},[22],"Main.java \n\nimport \n\nUser.java \n\n그리고 필요한 클래스들을 컴파일\n\nMain.class\nUser.class\n",[27,355,353],{"__ignoreMap":25},[14,357,359],{"id":358},"python과-java-비교","Python과 Java 비교",[361,362,363,376],"table",{},[364,365,366],"thead",{},[367,368,369,372,374],"tr",{},[370,371],"th",{},[370,373,17],{},[370,375,36],{},[377,378,379,395,408,419,430,448],"tbody",{},[367,380,381,385,390],{},[382,383,384],"td",{},"소스",[382,386,387],{},[27,388,389],{},".py",[382,391,392],{},[27,393,394],{},".java",[367,396,397,400,403],{},[382,398,399],{},"컴파일",[382,401,402],{},"내부적으로 Bytecode 생성",[382,404,405,407],{},[27,406,100],{},"로 명시적 컴파일",[367,409,410,413,416],{},[382,411,412],{},"Bytecode",[382,414,415],{},"Python Bytecode",[382,417,418],{},"Java Bytecode",[367,420,421,424,427],{},[382,422,423],{},"실행",[382,425,426],{},"Python VM",[382,428,429],{},"JVM",[367,431,432,435,440],{},[382,433,434],{},"일반적인 명령",[382,436,437],{},[27,438,439],{},"python main.py",[382,441,442,444,445],{},[27,443,163],{}," → ",[27,446,447],{},"java Main",[367,449,450,453,456],{},[382,451,452],{},"타입 검사",[382,454,455],{},"주로 실행 중",[382,457,458],{},"주로 컴파일 시",[14,460,461],{"id":461},"요약",[30,463,464],{},"JAVA 실행 구조를 한 문장으로 말하면...",[466,467,468],"blockquote",{},[30,469,470,471,473,474,477],{},"Java는 ",[27,472,394],{}," 소스 코드를 컴파일러가 검사하여 JVM이 실행할 수 있는 ",[27,475,476],{},".class"," 바이트코드로 변환하고, JVM이 실행한다.",[30,479,480],{},"Python의 경우에는",[466,482,483],{},[30,484,485],{},"Python은 소스 코드를 실행할 때 내부적으로 바이트코드로 변환하고, Python 가상 머신이 이를 실행한다. 다만 컴파일 과정이 겉으로 드러나지는 않는다.",[487,488,489],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":25,"searchDepth":63,"depth":63,"links":491},[492],{"id":12,"depth":63,"text":5,"children":493},[494,495,496,497],{"id":16,"depth":69,"text":17},{"id":35,"depth":69,"text":36},{"id":358,"depth":69,"text":359},{"id":461,"depth":69,"text":461},[35,499],"jvm","2026-08-10 09:50:00 +0900","Python과 Java의 바이트코드 실행 과정을 비교하고 javac, JVM, classpath, package의 역할을 정리한다.","md",null,"\u002Fjava\u002Fjvm\u002F2026\u002F08\u002F10\u002Fjava-python-compile-comparison\u002F",{"layout":506},"post","1","\u002Fposts\u002Fbackend\u002Fjava\u002Fjvm\u002F2026-08-10-java-python-compile-comparison",{"title":5,"description":501},"Java 실행과 JVM","posts\u002FBackend\u002FJAVA\u002Fjvm\u002F2026-08-10-java-python-compile-comparison",[36,17,513,412,429,514,515],"Compiler","Classpath","Package","Aal81F8NjRGRpPjO6SdC6Rq1N0MobSvgUkRefQd4Gts",1788744784796]