[{"data":1,"prerenderedAt":2421},["ShallowReactive",2],{"post-document:\u002Fjava\u002Fbasics\u002F2026\u002F08\u002F10\u002Fjava-basics\u002F":3},{"id":4,"title":5,"body":6,"categories":2403,"date":2405,"description":2406,"extension":2407,"image":2408,"key_concepts":2408,"last_modified_at":2408,"legacyPath":2409,"meta":2410,"navigation":1295,"part":2412,"path":2413,"published":1295,"robots":2408,"seo":2414,"series":2415,"stem":2416,"strengths":2408,"summary":2408,"tags":2417,"tradeoffs":2408,"__hash__":2420},"posts\u002Fposts\u002FBackend\u002FJAVA\u002Fbasics\u002F2026-08-10-java-basics.md","Java 기초 Part 1: 백엔드 배경과 Java 실행 구조",{"type":7,"value":8,"toc":2380},"minimark",[9,14,27,82,87,98,102,164,211,215,296,299,303,331,335,372,376,380,440,484,506,510,577,581,587,594,598,633,637,680,797,801,846,933,937,1020,1025,1070,1074,1135,1138,1142,1146,1162,1166,1169,1221,1309,1337,1341,1433,1437,1443,1479,1519,1574,1578,1684,1724,1728,1769,1773,1809,1813,1841,1914,1918,1928,1931,1979,1983,2069,2072,2148,2157,2210,2214,2245,2270,2289,2293,2301,2307,2311,2347,2376],[10,11,13],"h3",{"id":12},"ip와-port","IP와 Port",[15,16,17,18,21,22,26],"p",{},"통신을 하려면 IP와 포트 정보가 모두 필요합니다.",[19,20],"br",{},"\n네트워크에서 프로세스 통신을 식별하는 기본 식별자는 ",[23,24,25],"code",{},"IP + PORT","입니다.",[28,29,30,43],"table",{},[31,32,33],"thead",{},[34,35,36,40],"tr",{},[37,38,39],"th",{},"항목",[37,41,42],{},"설명",[44,45,46,55,63],"tbody",{},[34,47,48,52],{},[49,50,51],"td",{},"IP 주소",[49,53,54],{},"인터넷에서 특정 호스트를 식별하는 논리적 주소",[34,56,57,60],{},[49,58,59],{},"Port",[49,61,62],{},"해당 Host에서 실행 중인 서비스 또는 프로세스를 구분하는 번호",[34,64,65,68],{},[49,66,67],{},"예시",[49,69,70,73,74,77,78,81],{},[23,71,72],{},"http:\u002F\u002F168.126.63.42:8080"," (",[23,75,76],{},"168.126.63.42"," = IP, ",[23,79,80],{},"8080"," = Port)",[83,84,86],"h4",{"id":85},"localhost-vs-127001","Localhost vs 127.0.0.1",[15,88,89,90,93,94,97],{},"동일 호스트 내에서 프로세스 간 통신할 때 사용하는 이름:\n",[23,91,92],{},"localhost"," (도메인 이름), ",[23,95,96],{},"127.0.0.1"," (IP 주소)",[83,99,101],{"id":100},"process와-port","Process와 Port",[28,103,104,114],{},[31,105,106],{},[34,107,108,111],{},[37,109,110],{},"구분",[37,112,113],{},"값",[44,115,116,124,141,151],{},[34,117,118,121],{},[49,119,120],{},"현재 메모리에 로드되어 CPU를 할당받고 실행 중인 예시",[49,122,123],{},"예시 실행",[34,125,126,129],{},[49,127,128],{},"내부 실행 명령",[49,130,131,134,135,134,138],{},[23,132,133],{},"python webserver.py",", ",[23,136,137],{},"npm run dev",[23,139,140],{},"java -jar .\u002Ftarget\u002Fideoperators-0.0.1-SNAPSHOT.jar",[34,142,143,146],{},[49,144,145],{},"외부 프로세스 간 통신",[49,147,148],{},[23,149,150],{},"172.8.32.9:8080",[34,152,153,156],{},[49,154,155],{},"내부 프로세스 간 통신",[49,157,158,134,161],{},[23,159,160],{},"127.0.0.1:8080",[23,162,163],{},"localhost:8080",[165,166,171],"pre",{"className":167,"code":168,"language":169,"meta":170,"style":170},"language-bash shiki shiki-themes github-light github-dark","python webserver.py\nnpm run dev\njava -jar .\u002Ftarget\u002Fideoperators-0.0.1-SNAPSHOT.jar\n","bash","",[23,172,173,186,198],{"__ignoreMap":170},[174,175,178,182],"span",{"class":176,"line":177},"line",1,[174,179,181],{"class":180},"sScJk","python",[174,183,185],{"class":184},"sZZnC"," webserver.py\n",[174,187,189,192,195],{"class":176,"line":188},2,[174,190,191],{"class":180},"npm",[174,193,194],{"class":184}," run",[174,196,197],{"class":184}," dev\n",[174,199,201,204,208],{"class":176,"line":200},3,[174,202,203],{"class":180},"java",[174,205,207],{"class":206},"sj4cs"," -jar",[174,209,210],{"class":184}," .\u002Ftarget\u002Fideoperators-0.0.1-SNAPSHOT.jar\n",[10,212,214],{"id":213},"process-vs-thread","Process vs Thread",[28,216,217,229],{},[31,218,219],{},[34,220,221,223,226],{},[37,222,39],{},[37,224,225],{},"프로세스 (Process)",[37,227,228],{},"스레드 (Thread)",[44,230,231,242,253,264,275,286],{},[34,232,233,236,239],{},[49,234,235],{},"정의",[49,237,238],{},"실행 중인 프로그램의 인스턴스",[49,240,241],{},"프로세스 내에서 실행되는 작업 단위",[34,243,244,247,250],{},[49,245,246],{},"메모리",[49,248,249],{},"공간 독립적인 메모리 사용",[49,251,252],{},"프로세스의 메모리 공간 공유",[34,254,255,258,261],{},[49,256,257],{},"생성 비용",[49,259,260],{},"상대적으로 크고 무겁다",[49,262,263],{},"낮고 가볍다",[34,265,266,269,272],{},[49,267,268],{},"통신 방법",[49,270,271],{},"IPC(파이프, 소켓 등) 필요",[49,273,274],{},"공유 메모리로 비교적 쉽게 통신",[34,276,277,280,283],{},[49,278,279],{},"충돌 영향",[49,281,282],{},"다른 프로세스에 영향이 적음",[49,284,285],{},"다른 스레드에 영향 가능",[34,287,288,290,293],{},[49,289,67],{},[49,291,292],{},"브라우저, 게임, IDE 등 독립 실행 환경",[49,294,295],{},"웹 페이지 렌더링, 백그라운드 다운로드",[15,297,298],{},"한 프로세스 내부에서 여러 스레드를 실행할 수 있습니다.",[10,300,302],{"id":301},"public-ip와-private-ip","Public IP와 Private IP",[28,304,305,313],{},[31,306,307],{},[34,308,309,311],{},[37,310,110],{},[37,312,42],{},[44,314,315,323],{},[34,316,317,320],{},[49,318,319],{},"Public IP",[49,321,322],{},"인터넷 전역에서 접근 가능한 IP 주소",[34,324,325,328],{},[49,326,327],{},"Private IP",[49,329,330],{},"특정 private network 내부에서만 유일하게 사용되는 IP (보통 내부용)",[10,332,334],{"id":333},"gateway-router-load-balancer","Gateway, Router, Load Balancer",[28,336,337,346],{},[31,338,339],{},[34,340,341,343],{},[37,342,110],{},[37,344,345],{},"역할",[44,347,348,356,364],{},[34,349,350,353],{},[49,351,352],{},"Router",[49,354,355],{},"네트워크를 연결·확장하여 경로를 만드는 장비. 인터넷은 라우터들의 집합",[34,357,358,361],{},[49,359,360],{},"Gateway",[49,362,363],{},"서비스\u002F애플리케이션 진입점 역할, 외부 IP를 내부 IP로 연결\u002F변환, 프로토콜 변환, 인증\u002F필터\u002F헤더 처리 등 계층 처리",[34,365,366,369],{},[49,367,368],{},"Load Balancer",[49,370,371],{},"트래픽을 여러 노드에 분산\u002F배분. 대표적으로 L4, L7 라우팅 역할",[10,373,375],{"id":374},"frontend-backend","Frontend \u002F Backend",[83,377,379],{"id":378},"frontend","Frontend",[28,381,382,391],{},[31,383,384],{},[34,385,386,388],{},[37,387,110],{},[37,389,390],{},"내용",[44,392,393,400,408,416,424,432],{},[34,394,395,397],{},[49,396,345],{},[49,398,399],{},"사용자가 직접 보고 조작하는 UI\u002FUX 영역을 설계·구현",[34,401,402,405],{},[49,403,404],{},"구조 작성",[49,406,407],{},"HTML을 통해 페이지 뼈대 구성(제목, 단락, 버튼, 이미지 배치)",[34,409,410,413],{},[49,411,412],{},"디자인",[49,414,415],{},"CSS로 색상, 글꼴, 여백, 애니메이션 처리",[34,417,418,421],{},[49,419,420],{},"동작 처리",[49,422,423],{},"JavaScript로 클릭\u002F입력\u002F드래그 등 사용자 반응 처리",[34,425,426,429],{},[49,427,428],{},"데이터 처리",[49,430,431],{},"API 연동 후 백엔드 응답을 화면에 노출",[34,433,434,437],{},[49,435,436],{},"UX 개선",[49,438,439],{},"빠른 조작 경험을 위한 화면 흐름 최적화",[28,441,442,450],{},[31,443,444],{},[34,445,446,448],{},[37,447,110],{},[37,449,67],{},[44,451,452,460,468,476],{},[34,453,454,457],{},[49,455,456],{},"기본 언어",[49,458,459],{},"HTML, CSS, JavaScript",[34,461,462,465],{},[49,463,464],{},"프레임워크\u002F라이브러리",[49,466,467],{},"React, Vue.js",[34,469,470,473],{},[49,471,472],{},"패키지 관리자",[49,474,475],{},"npm, yarn",[34,477,478,481],{},[49,479,480],{},"빌드 도구",[49,482,483],{},"Webpack, Vite",[28,485,486,496],{},[31,487,488],{},[34,489,490,493],{},[37,491,492],{},"용어",[37,494,495],{},"의미",[44,497,498],{},[34,499,500,503],{},[49,501,502],{},"Endpoint",[49,504,505],{},"서비스의 종단점, 경계 지점",[83,507,509],{"id":508},"back-end","Back end",[28,511,512,520],{},[31,513,514],{},[34,515,516,518],{},[37,517,110],{},[37,519,390],{},[44,521,522,529,537,545,553,561,569],{},[34,523,524,526],{},[49,525,345],{},[49,527,528],{},"프론트엔드 요청 처리, 비즈니스 로직 수행, 응답 반환",[34,530,531,534],{},[49,532,533],{},"핵심 기능",[49,535,536],{},"서버 운영, DB 연동, API 제공, 보안\u002F권한 관리, 성능 최적화 및 로깅",[34,538,539,542],{},[49,540,541],{},"프로그래밍 언어",[49,543,544],{},"Java, Python, Node.js, Go, Kotlin",[34,546,547,550],{},[49,548,549],{},"프레임워크",[49,551,552],{},"Spring Boot, Django, Express, FastAPI",[34,554,555,558],{},[49,556,557],{},"데이터베이스",[49,559,560],{},"MySQL, PostgreSQL, MongoDB, Redis",[34,562,563,566],{},[49,564,565],{},"API 형식",[49,567,568],{},"REST API, GraphQL",[34,570,571,574],{},[49,572,573],{},"배포 환경",[49,575,576],{},"AWS, Docker, Nginx, GitHub Actions",[10,578,580],{"id":579},"현대적-frontendbackend-구조","현대적 Frontend\u002FBackend 구조",[15,582,583,584,586],{},"최초 1회 HTML을 로드한 뒤에는 페이지 전체 새로고침 없이 JavaScript가 동적으로 화면을 바꿉니다(SPA 구조).",[19,585],{},"\nClient side에서 상태와 변수 데이터를 생성·처리하여 화면을 갱신합니다.",[15,588,589],{},[590,591],"img",{"alt":592,"src":593},"alt text","\u002Fassets\u002Fbase_image\u002Fimage.png",[10,595,597],{"id":596},"json-format","JSON Format",[28,599,600,608],{},[31,601,602],{},[34,603,604,606],{},[37,605,39],{},[37,607,42],{},[44,609,610,617,625],{},[34,611,612,614],{},[49,613,235],{},[49,615,616],{},"키-값 쌍을 사용하는 경량 데이터 교환 형식",[34,618,619,622],{},[49,620,621],{},"특징",[49,623,624],{},"언어에 구애받지 않음, 읽기\u002F파싱이 쉬움",[34,626,627,630],{},[49,628,629],{},"주요 사용",[49,631,632],{},"API 응답, 데이터 저장 및 전송",[83,634,636],{"id":635},"json-javascript-object-notation","JSON (JavaScript Object Notation)",[28,638,639,648],{},[31,640,641],{},[34,642,643,646],{},[37,644,645],{},"요소",[37,647,42],{},[44,649,650,661,672],{},[34,651,652,655],{},[49,653,654],{},"객체(Object)",[49,656,657,660],{},[23,658,659],{},"{}","로 묶인 키-값 쌍",[34,662,663,666],{},[49,664,665],{},"배열(Array)",[49,667,668,671],{},[23,669,670],{},"[]","로 묶인 값 목록",[34,673,674,677],{},[49,675,676],{},"값(Value)",[49,678,679],{},"문자열, 숫자, 객체, 배열, true, false, null",[165,681,685],{"className":682,"code":683,"language":684,"meta":170,"style":170},"language-json shiki shiki-themes github-light github-dark","{\n  \"name\": \"John Doe\",\n  \"age\": 30,\n  \"isMarried\": false,\n  \"children\": [\"Anna\", \"Ben\"],\n  \"address\": {\n    \"city\": \"Seoul\",\n    \"zipCode\": \"12345\"\n  }\n}\n","json",[23,686,687,693,707,719,732,752,761,774,785,791],{"__ignoreMap":170},[174,688,689],{"class":176,"line":177},[174,690,692],{"class":691},"sVt8B","{\n",[174,694,695,698,701,704],{"class":176,"line":188},[174,696,697],{"class":206},"  \"name\"",[174,699,700],{"class":691},": ",[174,702,703],{"class":184},"\"John Doe\"",[174,705,706],{"class":691},",\n",[174,708,709,712,714,717],{"class":176,"line":200},[174,710,711],{"class":206},"  \"age\"",[174,713,700],{"class":691},[174,715,716],{"class":206},"30",[174,718,706],{"class":691},[174,720,722,725,727,730],{"class":176,"line":721},4,[174,723,724],{"class":206},"  \"isMarried\"",[174,726,700],{"class":691},[174,728,729],{"class":206},"false",[174,731,706],{"class":691},[174,733,735,738,741,744,746,749],{"class":176,"line":734},5,[174,736,737],{"class":206},"  \"children\"",[174,739,740],{"class":691},": [",[174,742,743],{"class":184},"\"Anna\"",[174,745,134],{"class":691},[174,747,748],{"class":184},"\"Ben\"",[174,750,751],{"class":691},"],\n",[174,753,755,758],{"class":176,"line":754},6,[174,756,757],{"class":206},"  \"address\"",[174,759,760],{"class":691},": {\n",[174,762,764,767,769,772],{"class":176,"line":763},7,[174,765,766],{"class":206},"    \"city\"",[174,768,700],{"class":691},[174,770,771],{"class":184},"\"Seoul\"",[174,773,706],{"class":691},[174,775,777,780,782],{"class":176,"line":776},8,[174,778,779],{"class":206},"    \"zipCode\"",[174,781,700],{"class":691},[174,783,784],{"class":184},"\"12345\"\n",[174,786,788],{"class":176,"line":787},9,[174,789,790],{"class":691},"  }\n",[174,792,794],{"class":176,"line":793},10,[174,795,796],{"class":691},"}\n",[83,798,800],{"id":799},"yaml-format","YAML Format",[28,802,803,811],{},[31,804,805],{},[34,806,807,809],{},[37,808,39],{},[37,810,42],{},[44,812,813,820,828,835],{},[34,814,815,817],{},[49,816,235],{},[49,818,819],{},"YAML은 \"YAML Ain't Markup Language\"의 약자로, 사람이 읽기 쉽게 설계된 직렬화 형식",[34,821,822,825],{},[49,823,824],{},"표현 방식",[49,826,827],{},"들여쓰기를 통해 계층 구조 표현",[34,829,830,832],{},[49,831,621],{},[49,833,834],{},"JSON보다 간결하고 가독성이 높은 편",[34,836,837,840],{},[49,838,839],{},"주석",[49,841,842,845],{},[23,843,844],{},"#","으로 작성 가능",[165,847,851],{"className":848,"code":849,"language":850,"meta":170,"style":170},"language-yaml shiki shiki-themes github-light github-dark","name: John Doe\nage: 30\nisMarried: false\nchildren:\n  - Anna\n  - Ben\naddress:\n  city: Seoul\n  zipCode: \"12345\"\n","yaml",[23,852,853,864,874,884,892,900,907,914,924],{"__ignoreMap":170},[174,854,855,859,861],{"class":176,"line":177},[174,856,858],{"class":857},"s9eBZ","name",[174,860,700],{"class":691},[174,862,863],{"class":184},"John Doe\n",[174,865,866,869,871],{"class":176,"line":188},[174,867,868],{"class":857},"age",[174,870,700],{"class":691},[174,872,873],{"class":206},"30\n",[174,875,876,879,881],{"class":176,"line":200},[174,877,878],{"class":857},"isMarried",[174,880,700],{"class":691},[174,882,883],{"class":206},"false\n",[174,885,886,889],{"class":176,"line":721},[174,887,888],{"class":857},"children",[174,890,891],{"class":691},":\n",[174,893,894,897],{"class":176,"line":734},[174,895,896],{"class":691},"  - ",[174,898,899],{"class":184},"Anna\n",[174,901,902,904],{"class":176,"line":754},[174,903,896],{"class":691},[174,905,906],{"class":184},"Ben\n",[174,908,909,912],{"class":176,"line":763},[174,910,911],{"class":857},"address",[174,913,891],{"class":691},[174,915,916,919,921],{"class":176,"line":776},[174,917,918],{"class":857},"  city",[174,920,700],{"class":691},[174,922,923],{"class":184},"Seoul\n",[174,925,926,929,931],{"class":176,"line":787},[174,927,928],{"class":857},"  zipCode",[174,930,700],{"class":691},[174,932,784],{"class":184},[83,934,936],{"id":935},"json-vs-yaml","JSON vs YAML",[28,938,939,951],{},[31,940,941],{},[34,942,943,945,948],{},[37,944,621],{},[37,946,947],{},"JSON",[37,949,950],{},"YAML",[44,952,953,963,974,987,998,1009],{},[34,954,955,957,960],{},[49,956,824],{},[49,958,959],{},"중괄호 기반의 구조화",[49,961,962],{},"들여쓰기 기반의 구조화",[34,964,965,968,971],{},[49,966,967],{},"가독성",[49,969,970],{},"딱딱한 편",[49,972,973],{},"사람이 읽기 매우 쉬움",[34,975,976,979,982],{},[49,977,978],{},"주석 지원",[49,980,981],{},"지원 안 함",[49,983,984,986],{},[23,985,844],{}," 주석 지원",[34,988,989,992,995],{},[49,990,991],{},"사용 사례",[49,993,994],{},"API 응답, 데이터 교환",[49,996,997],{},"구성\u002F설정 파일",[34,999,1000,1003,1006],{},[49,1001,1002],{},"파싱 속도",[49,1004,1005],{},"보통 빠름",[49,1007,1008],{},"상대적으로 느릴 수 있음",[34,1010,1011,1014,1017],{},[49,1012,1013],{},"유연성",[49,1015,1016],{},"형식이 엄격함",[49,1018,1019],{},"덜 엄격하고 유연함",[1021,1022,1024],"h2",{"id":1023},"좋은-소프트웨어란","좋은 소프트웨어란?",[28,1026,1027,1036],{},[31,1028,1029],{},[34,1030,1031,1034],{},[37,1032,1033],{},"개념",[37,1035,42],{},[44,1037,1038,1046,1054,1062],{},[34,1039,1040,1043],{},[49,1041,1042],{},"응집도 (Cohesion)",[49,1044,1045],{},"모듈\u002F서비스가 하나의 책임에 집중하는 정도가 높을수록 변경·이해·재사용이 쉬움",[34,1047,1048,1051],{},[49,1049,1050],{},"복잡도 (Complexity)",[49,1052,1053],{},"로직과 아키텍처의 복잡도를 의미, 낮을수록 유지보수와 확장이 용이",[34,1055,1056,1059],{},[49,1057,1058],{},"단독 실행 (Standalone Execution)",[49,1060,1061],{},"시스템의 일부를 독립 실행\u002F테스트할 수 있는 능력. 분산 개발·배포·복구에 유리",[34,1063,1064,1067],{},[49,1065,1066],{},"결합도 (Coupling)",[49,1068,1069],{},"요소 간 의존성. 낮을수록 개별 변경의 영향이 작고 확장 용이",[10,1071,1073],{"id":1072},"소프트웨어-아키텍처-비교","소프트웨어 아키텍처 비교",[28,1075,1076,1089],{},[31,1077,1078],{},[34,1079,1080,1083,1086],{},[37,1081,1082],{},"기준",[37,1084,1085],{},"Monolith",[37,1087,1088],{},"MSA \u002F Microservice Architecture",[44,1090,1091,1102,1113,1124],{},[34,1092,1093,1096,1099],{},[49,1094,1095],{},"응집도",[49,1097,1098],{},"역할과 책임이 혼재하기 쉬움",[49,1100,1101],{},"기능별 책임 분리가 쉬워 응집도 개선",[34,1103,1104,1107,1110],{},[49,1105,1106],{},"복잡도",[49,1108,1109],{},"로직\u002F아키텍처 복잡도가 높고 통합 부담 큼",[49,1111,1112],{},"서비스 단위 분리로 관리 범위가 명확해짐",[34,1114,1115,1118,1121],{},[49,1116,1117],{},"단독 실행",[49,1119,1120],{},"전체 실행 의존도가 커 테스트가 어려울 수 있음",[49,1122,1123],{},"개별 서비스 단위로 실행\u002F테스트가 상대적으로 용이",[34,1125,1126,1129,1132],{},[49,1127,1128],{},"결합도",[49,1130,1131],{},"변경 시 전체 영향이 큼 (Tightly Coupled)",[49,1133,1134],{},"독립 배포·확장 가능, 변경 영향 범위 제한 (Loosely Coupled)",[15,1136,1137],{},"---- 여기부터 다듬어야 한다.",[1021,1139,1141],{"id":1140},"java의-역사","Java의 역사",[10,1143,1145],{"id":1144},"java-등장-이전의-주요-어려움-1990년대-초반","Java 등장 이전의 주요 어려움 (1990년대 초반)",[1147,1148,1149,1153,1156,1159],"ul",{},[1150,1151,1152],"li",{},"플랫폼 종속성 묹제 (OS 하드웨어 의존)",[1150,1154,1155],{},"메모리 관리의 어려움",[1150,1157,1158],{},"메모리 직접 접근 및 OS 권한을 가지는 프로그램으로 인한 보안 취약",[1150,1160,1161],{},"네트워크 \u002F 분산 프로그램 개발의 어려움",[10,1163,1165],{"id":1164},"java의-등장","Java의 등장",[15,1167,1168],{},"하드웨어와 OS 중심 개발에서 \"플랫폼 독립적, 네트워크 중심, 엔터프라이즈 중심 개발\"로 패러다임 전환을 위해 등장",[28,1170,1171,1179],{},[31,1172,1173],{},[34,1174,1175,1177],{},[37,1176,110],{},[37,1178,390],{},[44,1180,1181,1189,1197,1205,1213],{},[34,1182,1183,1186],{},[49,1184,1185],{},"1. 플랫폼 독립성 해결",[49,1187,1188],{},"write once, run anywhere, 소스코드 -> 바이트코드, JVM, 윈도우, Linux, Unix",[34,1190,1191,1194],{},[49,1192,1193],{},"2. 메모리 관리 자동화",[49,1195,1196],{},"Garbage Collection 도입, 개발자가 메모리 해제 신경 쓸 필요 없음, 메모리 누수 감소, 서버 장기 실행에 안정적",[34,1198,1199,1202],{},[49,1200,1201],{},"3. 강력한 보안 모델",[49,1203,1204],{},"포인트 없음, 샌드 박스 실행 모델, 클래스 로딩 시 검증",[34,1206,1207,1210],{},[49,1208,1209],{},"4. 네트워크를 기본 전제로 설계",[49,1211,1212],{},"java.net 패키지 제공, socket, http, URL 추상화, 예외 기반 오류 처리, 웹서버, WAS, 분산 시스템으로 확장",[34,1214,1215,1218],{},[49,1216,1217],{},"5. 대규모 엔터프라이즈 개발에 적합",[49,1219,1220],{},"강제적 OOP, 명확한 타입 시스템, 패키지 구조, 멀티스레딩 표준화, 비동기 처리 기반의 대용량 처리 지원",[165,1222,1226],{"className":1223,"code":1224,"language":1225,"meta":170,"style":170},"language-mermaid shiki shiki-themes github-light github-dark","flowchart LR\n  S0[\"Java 등장 이전 (1990년대 초반)\"]\n  S1[\"플랫폼 종속성 묹제\"]\n  S2[\"메모리 관리의 어려움\"]\n  S3[\"보안 취약성 (직접 메모리 접근\u002FOS 권한)\"]\n  S4[\"네트워크\u002F분산 개발의 어려움\"]\n  S5[\"Java의 등장\"]\n  S6[\"write once, run anywhere\"]\n  S7[\"Garbage Collection\"]\n  S8[\"샌드박스 + 클래스 로딩 검증\"]\n  S9[\"네트워크 중심 설계 (java.net, socket\u002Fhttp\u002FURL)\"]\n  S10[\"대규모 엔터프라이즈에 적합\"]\n\n  S0 --> S1 --> S2 --> S3 --> S4 --> S5\n  S5 --> S6 --> S7 --> S8 --> S9 --> S10\n","mermaid",[23,1227,1228,1233,1238,1243,1248,1253,1258,1263,1268,1273,1278,1284,1290,1297,1303],{"__ignoreMap":170},[174,1229,1230],{"class":176,"line":177},[174,1231,1232],{},"flowchart LR\n",[174,1234,1235],{"class":176,"line":188},[174,1236,1237],{},"  S0[\"Java 등장 이전 (1990년대 초반)\"]\n",[174,1239,1240],{"class":176,"line":200},[174,1241,1242],{},"  S1[\"플랫폼 종속성 묹제\"]\n",[174,1244,1245],{"class":176,"line":721},[174,1246,1247],{},"  S2[\"메모리 관리의 어려움\"]\n",[174,1249,1250],{"class":176,"line":734},[174,1251,1252],{},"  S3[\"보안 취약성 (직접 메모리 접근\u002FOS 권한)\"]\n",[174,1254,1255],{"class":176,"line":754},[174,1256,1257],{},"  S4[\"네트워크\u002F분산 개발의 어려움\"]\n",[174,1259,1260],{"class":176,"line":763},[174,1261,1262],{},"  S5[\"Java의 등장\"]\n",[174,1264,1265],{"class":176,"line":776},[174,1266,1267],{},"  S6[\"write once, run anywhere\"]\n",[174,1269,1270],{"class":176,"line":787},[174,1271,1272],{},"  S7[\"Garbage Collection\"]\n",[174,1274,1275],{"class":176,"line":793},[174,1276,1277],{},"  S8[\"샌드박스 + 클래스 로딩 검증\"]\n",[174,1279,1281],{"class":176,"line":1280},11,[174,1282,1283],{},"  S9[\"네트워크 중심 설계 (java.net, socket\u002Fhttp\u002FURL)\"]\n",[174,1285,1287],{"class":176,"line":1286},12,[174,1288,1289],{},"  S10[\"대규모 엔터프라이즈에 적합\"]\n",[174,1291,1293],{"class":176,"line":1292},13,[174,1294,1296],{"emptyLinePlaceholder":1295},true,"\n",[174,1298,1300],{"class":176,"line":1299},14,[174,1301,1302],{},"  S0 --> S1 --> S2 --> S3 --> S4 --> S5\n",[174,1304,1306],{"class":176,"line":1305},15,[174,1307,1308],{},"  S5 --> S6 --> S7 --> S8 --> S9 --> S10\n",[28,1310,1311,1319],{},[31,1312,1313],{},[34,1314,1315,1317],{},[37,1316,110],{},[37,1318,390],{},[44,1320,1321,1329],{},[34,1322,1323,1326],{},[49,1324,1325],{},"이력",[49,1327,1328],{},"Sun Microsystems의 제임스 고슬링James Gosling과 팀이 가전 제품용 언어 개발 시작",[34,1330,1331,1334],{},[49,1332,1333],{},"인수",[49,1335,1336],{},"2010년 Oracle이 SUN 인수하여, Java의 상품권, 저작권, 브랜드가 Oracle로 이전",[83,1338,1340],{"id":1339},"java-버전시스템-정리","Java 버전\u002F시스템 정리",[28,1342,1343,1351],{},[31,1344,1345],{},[34,1346,1347,1349],{},[37,1348,39],{},[37,1350,390],{},[44,1352,1353,1361,1369,1377,1385,1393,1401,1409,1417,1425],{},[34,1354,1355,1358],{},[49,1356,1357],{},"1995",[49,1359,1360],{},"Java 1.0 공개 , Write Once, Run Anywhere",[34,1362,1363,1366],{},[49,1364,1365],{},"1998",[49,1367,1368],{},"Java 2 J2SE 1.2 Swing UI 도입, JVM 안정성 강화",[34,1370,1371,1374],{},[49,1372,1373],{},"2018",[49,1375,1376],{},"Java 11 Oracle이 LTS Long Term Support 정책 발표: 6개월마다 새 버전, 3년마다 LTS",[34,1378,1379,1382],{},[49,1380,1381],{},"2025 기준 최신 버전",[49,1383,1384],{},"GA: Java SE 25",[34,1386,1387,1390],{},[49,1388,1389],{},"2025 기준 LTS",[49,1391,1392],{},"Java SE 21",[34,1394,1395,1398],{},[49,1396,1397],{},"SE",[49,1399,1400],{},"standard Edition : 자바 언어의 기준이 되는 표준 플랫폼",[34,1402,1403,1406],{},[49,1404,1405],{},"EE",[49,1407,1408],{},"Enterprise Edition: WAS 같은 기업용 서버의 표준 사양 Jakarta EE로 이전",[34,1410,1411,1414],{},[49,1412,1413],{},"GA",[49,1415,1416],{},"General Availability: 정식 릴리즈. 검증된 안정 버전으로 새로운 기능이나 변경 사항을 포함. 최신 기술을 빠르게 경험하고 싶은 개발자용",[34,1418,1419,1422],{},[49,1420,1421],{},"기타",[49,1423,1424],{},"일반적으로 다음버전까지 6개월 단기 지원 신규 기능이라도 deprecated 될 수 있음",[34,1426,1427,1430],{},[49,1428,1429],{},"LTS",[49,1431,1432],{},"Long Term Support: 장기지원 버전. 몇년간 안정적이고 지속적인 보안\u002F버그 패치, 호환성 검증된 버전이며, 기업, 프로덕션 환경용",[10,1434,1436],{"id":1435},"interpreter-와-compiler","Interpreter 와 Compiler",[15,1438,1439,1440,1442],{},"소스 코드를 기계가 이해할 수 있는 기계어로 변환 파일을 여기 저기서 바로 실행",[19,1441],{},"\n소스 코드를 한 줄(또는 일정 단위)씩 읽어서 해석(interpret) -> 기계어 실행 -> 실행",[28,1444,1445,1453],{},[31,1446,1447],{},[34,1448,1449,1451],{},[37,1450,110],{},[37,1452,621],{},[44,1454,1455,1463,1471],{},[34,1456,1457,1460],{},[49,1458,1459],{},"Compiler",[49,1461,1462],{},"프로그램 전체를 먼저 변환 실행하면서 조금씩 변환",[34,1464,1465,1468],{},[49,1466,1467],{},"Interpreter",[49,1469,1470],{},"실행 전에 완료 실행 중 계속 수행",[34,1472,1473,1476],{},[49,1474,1475],{},"공통점",[49,1477,1478],{},"한 번만 컴파일 실행할 때마다 해석 및 변환",[28,1480,1481,1489],{},[31,1482,1483],{},[34,1484,1485,1487],{},[37,1486,39],{},[37,1488,390],{},[44,1490,1491,1504,1512],{},[34,1492,1493,1496],{},[49,1494,1495],{},"ByteCode",[49,1497,1498,134,1501],{},[23,1499,1500],{},".pyc",[23,1502,1503],{},".class",[34,1505,1506,1509],{},[49,1507,1508],{},"JIT",[49,1510,1511],{},"Just In Time",[34,1513,1514,1516],{},[49,1515,495],{},[49,1517,1518],{},"Compiler의 기기 의존 관계 à 컨테이너로 해결",[165,1520,1522],{"className":1223,"code":1521,"language":1225,"meta":170,"style":170},"flowchart TB\n  P[\"소스 코드\"] --> A1[\"한 줄\u002F구간 해석 (Interpreter)\"]\n  P --> B1[\"전체 변환 (Compiler)\"]\n  A1 --> A2[\"기계어 실행\"]\n  B1 --> C1[\"바이트코드 생성\u002F변환\"]\n  C1 --> C2[\"실행 중 계속 해석\u002F변환\"]\n  B1 --> C3[\"실행 전 변환 완료\"]\n  A2 --> D[\"실행 결과\"]\n  C2 --> D\n  C3 --> D\n",[23,1523,1524,1529,1534,1539,1544,1549,1554,1559,1564,1569],{"__ignoreMap":170},[174,1525,1526],{"class":176,"line":177},[174,1527,1528],{},"flowchart TB\n",[174,1530,1531],{"class":176,"line":188},[174,1532,1533],{},"  P[\"소스 코드\"] --> A1[\"한 줄\u002F구간 해석 (Interpreter)\"]\n",[174,1535,1536],{"class":176,"line":200},[174,1537,1538],{},"  P --> B1[\"전체 변환 (Compiler)\"]\n",[174,1540,1541],{"class":176,"line":721},[174,1542,1543],{},"  A1 --> A2[\"기계어 실행\"]\n",[174,1545,1546],{"class":176,"line":734},[174,1547,1548],{},"  B1 --> C1[\"바이트코드 생성\u002F변환\"]\n",[174,1550,1551],{"class":176,"line":754},[174,1552,1553],{},"  C1 --> C2[\"실행 중 계속 해석\u002F변환\"]\n",[174,1555,1556],{"class":176,"line":763},[174,1557,1558],{},"  B1 --> C3[\"실행 전 변환 완료\"]\n",[174,1560,1561],{"class":176,"line":776},[174,1562,1563],{},"  A2 --> D[\"실행 결과\"]\n",[174,1565,1566],{"class":176,"line":787},[174,1567,1568],{},"  C2 --> D\n",[174,1570,1571],{"class":176,"line":793},[174,1572,1573],{},"  C3 --> D\n",[83,1575,1577],{"id":1576},"언어-방식실행-방식-정리","언어 방식\u002F실행 방식 정리",[28,1579,1580,1596],{},[31,1581,1582],{},[34,1583,1584,1587,1590,1593],{},[37,1585,1586],{},"언어",[37,1588,1589],{},"바이트코드?",[37,1591,1592],{},"JIT?",[37,1594,1595],{},"실행 방식",[44,1597,1598,1612,1623,1634,1647,1658,1672],{},[34,1599,1600,1603,1606,1609],{},[49,1601,1602],{},"C",[49,1604,1605],{},"컴파일",[49,1607,1608],{},"X",[49,1610,1611],{},"X Native 실행",[34,1613,1614,1617,1619,1621],{},[49,1615,1616],{},"Rust",[49,1618,1605],{},[49,1620,1608],{},[49,1622,1611],{},[34,1624,1625,1628,1630,1632],{},[49,1626,1627],{},"Go",[49,1629,1605],{},[49,1631,1608],{},[49,1633,1611],{},[34,1635,1636,1639,1641,1644],{},[49,1637,1638],{},"Java",[49,1640,1503],{},[49,1642,1643],{},"O",[49,1645,1646],{},"O Bytecode JIT Native",[34,1648,1649,1652,1654,1656],{},[49,1650,1651],{},"Python",[49,1653,1500],{},[49,1655,1643],{},[49,1657,1608],{},[34,1659,1660,1663,1666,1669],{},[49,1661,1662],{},"외부 C\u002FC Lib",[49,1664,1665],{},"호출",[49,1667,1668],{},"Bytecode",[49,1670,1671],{},"Python VM",[34,1673,1674,1677,1680,1682],{},[49,1675,1676],{},"JavaScript",[49,1678,1679],{},"혼합",[49,1681,1643],{},[49,1683,1646],{},[165,1685,1687],{"className":1223,"code":1686,"language":1225,"meta":170,"style":170},"flowchart TD\n  L[\"언어별 방식 정리\"]\n  L1[\"C \u002F Rust \u002F Go: 컴파일 -> Native 실행\"]\n  L2[\"Java: .class 바이트코드 + JIT -> Native\"]\n  L3[\"Python: .pyc 바이트코드, VM 기반 실행\"]\n  L4[\"JavaScript: 실행 시 바이트코드 + JIT\"]\n  L --> L1 --> L2 --> L3 --> L4\n",[23,1688,1689,1694,1699,1704,1709,1714,1719],{"__ignoreMap":170},[174,1690,1691],{"class":176,"line":177},[174,1692,1693],{},"flowchart TD\n",[174,1695,1696],{"class":176,"line":188},[174,1697,1698],{},"  L[\"언어별 방식 정리\"]\n",[174,1700,1701],{"class":176,"line":200},[174,1702,1703],{},"  L1[\"C \u002F Rust \u002F Go: 컴파일 -> Native 실행\"]\n",[174,1705,1706],{"class":176,"line":721},[174,1707,1708],{},"  L2[\"Java: .class 바이트코드 + JIT -> Native\"]\n",[174,1710,1711],{"class":176,"line":734},[174,1712,1713],{},"  L3[\"Python: .pyc 바이트코드, VM 기반 실행\"]\n",[174,1715,1716],{"class":176,"line":754},[174,1717,1718],{},"  L4[\"JavaScript: 실행 시 바이트코드 + JIT\"]\n",[174,1720,1721],{"class":176,"line":763},[174,1722,1723],{},"  L --> L1 --> L2 --> L3 --> L4\n",[10,1725,1727],{"id":1726},"언어별-position","언어별 Position",[28,1729,1730,1738],{},[31,1731,1732],{},[34,1733,1734,1736],{},[37,1735,345],{},[37,1737,1586],{},[44,1739,1740,1748,1755,1762],{},[34,1741,1742,1745],{},[49,1743,1744],{},"엔터프라이즈 비즈니스 로직",[49,1746,1747],{},"Java, kotlin",[34,1749,1750,1753],{},[49,1751,1752],{},"클라우드 인프라 \u002F 플랫폼",[49,1754,1627],{},[34,1756,1757,1760],{},[49,1758,1759],{},"시스템 핵심 \u002F 고성능",[49,1761,1616],{},[34,1763,1764,1767],{},[49,1765,1766],{},"AI \u002F 데이터",[49,1768,1651],{},[10,1770,1772],{"id":1771},"언어별-position-중복-정리","언어별 Position (중복 정리)",[28,1774,1775,1783],{},[31,1776,1777],{},[34,1778,1779,1781],{},[37,1780,345],{},[37,1782,1586],{},[44,1784,1785,1791,1797,1803],{},[34,1786,1787,1789],{},[49,1788,1744],{},[49,1790,1747],{},[34,1792,1793,1795],{},[49,1794,1752],{},[49,1796,1627],{},[34,1798,1799,1801],{},[49,1800,1759],{},[49,1802,1616],{},[34,1804,1805,1807],{},[49,1806,1766],{},[49,1808,1651],{},[10,1810,1812],{"id":1811},"java-프로그램의-구조-자바-둘러보기","Java 프로그램의 구조 자바 둘러보기",[28,1814,1815,1823],{},[31,1816,1817],{},[34,1818,1819,1821],{},[37,1820,39],{},[37,1822,390],{},[44,1824,1825,1833],{},[34,1826,1827,1830],{},[49,1828,1829],{},"클래스 구성",[49,1831,1832],{},"Class를 기본 단위로 구성",[34,1834,1835,1838],{},[49,1836,1837],{},"최소 단위",[49,1839,1840],{},"가장 간단한 자바 프로그램도 최소 하나 이상의 클래스를 포함",[165,1842,1845],{"className":1843,"code":1844,"language":203,"meta":170,"style":170},"language-java shiki shiki-themes github-light github-dark","\u002F\u002F 패키지 선언 (선택 사항)\npackage edu.skala;\n\u002F\u002F 클래스 선언\npublic class HelloSkala {\n\u002F\u002F main 메서드 (프로그램의 시작점)\npublic static void main(String[] args) {\n\u002F\u002F 실행할 코드 작성\nSystem.out.println(\"Hello, Skala!\");\n\u002F\u002F 다른 메서드들 (선택 사항)\npublic void anotherMethod() {\n\u002F\u002F ...\n}\n}\n}\n",[23,1846,1847,1852,1857,1862,1867,1872,1877,1882,1887,1892,1897,1902,1906,1910],{"__ignoreMap":170},[174,1848,1849],{"class":176,"line":177},[174,1850,1851],{},"\u002F\u002F 패키지 선언 (선택 사항)\n",[174,1853,1854],{"class":176,"line":188},[174,1855,1856],{},"package edu.skala;\n",[174,1858,1859],{"class":176,"line":200},[174,1860,1861],{},"\u002F\u002F 클래스 선언\n",[174,1863,1864],{"class":176,"line":721},[174,1865,1866],{},"public class HelloSkala {\n",[174,1868,1869],{"class":176,"line":734},[174,1870,1871],{},"\u002F\u002F main 메서드 (프로그램의 시작점)\n",[174,1873,1874],{"class":176,"line":754},[174,1875,1876],{},"public static void main(String[] args) {\n",[174,1878,1879],{"class":176,"line":763},[174,1880,1881],{},"\u002F\u002F 실행할 코드 작성\n",[174,1883,1884],{"class":176,"line":776},[174,1885,1886],{},"System.out.println(\"Hello, Skala!\");\n",[174,1888,1889],{"class":176,"line":787},[174,1890,1891],{},"\u002F\u002F 다른 메서드들 (선택 사항)\n",[174,1893,1894],{"class":176,"line":793},[174,1895,1896],{},"public void anotherMethod() {\n",[174,1898,1899],{"class":176,"line":1280},[174,1900,1901],{},"\u002F\u002F ...\n",[174,1903,1904],{"class":176,"line":1286},[174,1905,796],{},[174,1907,1908],{"class":176,"line":1292},[174,1909,796],{},[174,1911,1912],{"class":176,"line":1299},[174,1913,796],{},[10,1915,1917],{"id":1916},"java-메모리-구조","Java 메모리 구조",[15,1919,1920,1921,1924,1925,26],{},"Java 프로그램이 실행될 때 메모리는 여러 영역으로 나뉘어 사용됩니다. 그중 초보자가 가장 먼저 이해할 영역은 ",[23,1922,1923],{},"Stack","과 ",[23,1926,1927],{},"Heap",[15,1929,1930],{},"쉽게 비유하면 다음과 같습니다.",[28,1932,1933,1948],{},[31,1934,1935],{},[34,1936,1937,1940,1943,1946],{},[37,1938,1939],{},"영역",[37,1941,1942],{},"쉬운 비유",[37,1944,1945],{},"주로 저장되는 것",[37,1947,621],{},[44,1949,1950,1963],{},[34,1951,1952,1954,1957,1960],{},[49,1953,1923],{},[49,1955,1956],{},"현재 작업 중인 사람의 책상",[49,1958,1959],{},"메서드의 호출 정보, 지역 변수, 기본형 값, 객체를 가리키는 참조값",[49,1961,1962],{},"메서드가 끝나면 해당 메서드의 공간이 자동으로 정리됨. 스레드마다 별도의 Stack을 가짐",[34,1964,1965,1967,1970,1976],{},[49,1966,1927],{},[49,1968,1969],{},"여러 사람이 함께 사용하는 창고",[49,1971,1972,1975],{},[23,1973,1974],{},"new","로 만든 객체와 배열",[49,1977,1978],{},"여러 스레드가 공유함. 더 이상 사용하지 않는 객체는 Garbage Collector가 정리함",[83,1980,1982],{"id":1981},"아주-간단한-예시","아주 간단한 예시",[165,1984,1986],{"className":1843,"code":1985,"language":203,"meta":170,"style":170},"class Person {\n    String name;\n}\n\npublic class MemoryExample {\n    public static void main(String[] args) {\n        int age = 20;\n        Person person = new Person();\n        person.name = \"민형\";\n\n        printPerson(person);\n    }\n\n    static void printPerson(Person target) {\n        System.out.println(target.name);\n    }\n}\n",[23,1987,1988,1993,1998,2002,2006,2011,2016,2021,2026,2031,2035,2040,2045,2049,2054,2059,2064],{"__ignoreMap":170},[174,1989,1990],{"class":176,"line":177},[174,1991,1992],{},"class Person {\n",[174,1994,1995],{"class":176,"line":188},[174,1996,1997],{},"    String name;\n",[174,1999,2000],{"class":176,"line":200},[174,2001,796],{},[174,2003,2004],{"class":176,"line":721},[174,2005,1296],{"emptyLinePlaceholder":1295},[174,2007,2008],{"class":176,"line":734},[174,2009,2010],{},"public class MemoryExample {\n",[174,2012,2013],{"class":176,"line":754},[174,2014,2015],{},"    public static void main(String[] args) {\n",[174,2017,2018],{"class":176,"line":763},[174,2019,2020],{},"        int age = 20;\n",[174,2022,2023],{"class":176,"line":776},[174,2024,2025],{},"        Person person = new Person();\n",[174,2027,2028],{"class":176,"line":787},[174,2029,2030],{},"        person.name = \"민형\";\n",[174,2032,2033],{"class":176,"line":793},[174,2034,1296],{"emptyLinePlaceholder":1295},[174,2036,2037],{"class":176,"line":1280},[174,2038,2039],{},"        printPerson(person);\n",[174,2041,2042],{"class":176,"line":1286},[174,2043,2044],{},"    }\n",[174,2046,2047],{"class":176,"line":1292},[174,2048,1296],{"emptyLinePlaceholder":1295},[174,2050,2051],{"class":176,"line":1299},[174,2052,2053],{},"    static void printPerson(Person target) {\n",[174,2055,2056],{"class":176,"line":1305},[174,2057,2058],{},"        System.out.println(target.name);\n",[174,2060,2062],{"class":176,"line":2061},16,[174,2063,2044],{},[174,2065,2067],{"class":176,"line":2066},17,[174,2068,796],{},[15,2070,2071],{},"위 코드가 실행되는 과정을 순서대로 보면 다음과 같습니다.",[2073,2074,2075,2085,2101,2111,2117,2131,2140],"ol",{},[1150,2076,2077,2080,2081,2084],{},[23,2078,2079],{},"main()","이 시작되면 ",[23,2082,2083],{},"main","용 Stack 프레임이 만들어집니다.",[1150,2086,2087,2090,2091,2093,2094,2097,2098,2100],{},[23,2088,2089],{},"int age = 20","에서 ",[23,2092,868],{},"와 숫자 ",[23,2095,2096],{},"20","은 ",[23,2099,2083],{}," 프레임 안에 저장됩니다.",[1150,2102,2103,2106,2107,2110],{},[23,2104,2105],{},"new Person()","은 Heap에 실제 ",[23,2108,2109],{},"Person"," 객체를 만듭니다.",[1150,2112,2113,2116],{},[23,2114,2115],{},"person"," 변수에는 객체 자체가 아니라 Heap에 있는 객체를 찾아가기 위한 참조값이 저장됩니다.",[1150,2118,2119,2122,2123,2126,2127,2130],{},[23,2120,2121],{},"printPerson(person)","을 호출하면 새로운 ",[23,2124,2125],{},"printPerson","용 Stack 프레임이 쌓입니다. 매개변수 ",[23,2128,2129],{},"target","도 이 프레임에 저장됩니다.",[1150,2132,2133,2136,2137,2139],{},[23,2134,2135],{},"printPerson()","이 끝나면 ",[23,2138,2129],{},"이 들어 있던 프레임은 제거됩니다.",[1150,2141,2142,2144,2145,2147],{},[23,2143,2079],{},"까지 끝나고 더 이상 ",[23,2146,2109],{}," 객체를 가리키는 변수가 없으면, 해당 객체는 나중에 Garbage Collector의 정리 대상이 됩니다.",[15,2149,2150,2151,2153,2154,2156],{},"즉, ",[23,2152,2115],{},"은 Stack에 있는 “창고 위치 메모”이고, ",[23,2155,2105],{},"으로 만들어진 실제 객체는 Heap에 있습니다.",[165,2158,2160],{"className":1223,"code":2159,"language":1225,"meta":170,"style":170},"flowchart TB\n  Main[\"main Stack 프레임\u003Cbr\u002F>age = 20\u003Cbr\u002F>person = 참조값\"]\n  Print[\"printPerson Stack 프레임\u003Cbr\u002F>target = 참조값\"]\n  Person[\"Heap\u003Cbr\u002F>Person 객체\u003Cbr\u002F>name = 민형\"]\n  GC[\"Garbage Collector\"]\n\n  Main -->|person이 가리킴| Person\n  Print -->|target이 가리킴| Person\n  Main -. 메서드 호출 .-> Print\n  Person -. 더 이상 참조되지 않으면 .-> GC\n",[23,2161,2162,2166,2171,2176,2181,2186,2190,2195,2200,2205],{"__ignoreMap":170},[174,2163,2164],{"class":176,"line":177},[174,2165,1528],{},[174,2167,2168],{"class":176,"line":188},[174,2169,2170],{},"  Main[\"main Stack 프레임\u003Cbr\u002F>age = 20\u003Cbr\u002F>person = 참조값\"]\n",[174,2172,2173],{"class":176,"line":200},[174,2174,2175],{},"  Print[\"printPerson Stack 프레임\u003Cbr\u002F>target = 참조값\"]\n",[174,2177,2178],{"class":176,"line":721},[174,2179,2180],{},"  Person[\"Heap\u003Cbr\u002F>Person 객체\u003Cbr\u002F>name = 민형\"]\n",[174,2182,2183],{"class":176,"line":734},[174,2184,2185],{},"  GC[\"Garbage Collector\"]\n",[174,2187,2188],{"class":176,"line":754},[174,2189,1296],{"emptyLinePlaceholder":1295},[174,2191,2192],{"class":176,"line":763},[174,2193,2194],{},"  Main -->|person이 가리킴| Person\n",[174,2196,2197],{"class":176,"line":776},[174,2198,2199],{},"  Print -->|target이 가리킴| Person\n",[174,2201,2202],{"class":176,"line":787},[174,2203,2204],{},"  Main -. 메서드 호출 .-> Print\n",[174,2206,2207],{"class":176,"line":793},[174,2208,2209],{},"  Person -. 더 이상 참조되지 않으면 .-> GC\n",[83,2211,2213],{"id":2212},"stack과-heap의-차이-기억하기","Stack과 Heap의 차이 기억하기",[1147,2215,2216,2219,2231,2239,2242],{},[1150,2217,2218],{},"메서드가 호출되면 Stack에 작업 공간이 생기고, 메서드가 끝나면 사라집니다.",[1150,2220,2221,134,2224,134,2227,2230],{},[23,2222,2223],{},"int",[23,2225,2226],{},"double",[23,2228,2229],{},"boolean"," 같은 기본형 지역 변수는 보통 Stack 프레임에서 바로 관리됩니다.",[1150,2232,2233,134,2235,2238],{},[23,2234,2105],{},[23,2236,2237],{},"new int[3]","처럼 만든 객체와 배열은 Heap에 생성됩니다.",[1150,2240,2241],{},"객체 변수는 객체 그 자체가 아니라 Heap의 객체를 가리키는 참조값을 담습니다.",[1150,2243,2244],{},"Heap의 객체를 더 이상 아무도 사용하지 않으면 Garbage Collector가 정리합니다.",[165,2246,2248],{"className":1843,"code":2247,"language":203,"meta":170,"style":170},"static void example() {\n    int number = 10;          \u002F\u002F Stack 프레임에 값 저장\n    Person p = new Person();  \u002F\u002F p는 Stack, 실제 Person 객체는 Heap\n} \u002F\u002F example()의 Stack 프레임은 제거됨\n",[23,2249,2250,2255,2260,2265],{"__ignoreMap":170},[174,2251,2252],{"class":176,"line":177},[174,2253,2254],{},"static void example() {\n",[174,2256,2257],{"class":176,"line":188},[174,2258,2259],{},"    int number = 10;          \u002F\u002F Stack 프레임에 값 저장\n",[174,2261,2262],{"class":176,"line":200},[174,2263,2264],{},"    Person p = new Person();  \u002F\u002F p는 Stack, 실제 Person 객체는 Heap\n",[174,2266,2267],{"class":176,"line":721},[174,2268,2269],{},"} \u002F\u002F example()의 Stack 프레임은 제거됨\n",[15,2271,2272,2273,2136,2276,2279,2280,2282,2283,2285,2286,2288],{},"여기서 ",[23,2274,2275],{},"example()",[23,2277,2278],{},"number","와 ",[23,2281,15],{},"는 사라집니다. ",[23,2284,15],{},"가 가리키던 ",[23,2287,2109],{}," 객체도 다른 곳에서 사용하지 않는다면 Garbage Collector가 나중에 Heap에서 정리할 수 있습니다.",[10,2290,2292],{"id":2291},"자바와-jvm","자바와 JVM",[165,2294,2299],{"className":2295,"code":2297,"language":2298,"meta":170},[2296],"language-text","JVM Java Virtual Machine 자바를 실행하기 위한 가상 머신\nJava 어플리케이션은 JVM 위에서 동작하기 때문에 OS에 종속적이지 않음\n","text",[23,2300,2297],{"__ignoreMap":170},[165,2302,2305],{"className":2303,"code":2304,"language":2298,"meta":170},[2296],"Java 어플리케이션\n   ↓\nJVM\n   ↓\nOS Windows, MacOS\n   ↓\n컴퓨터\n",[23,2306,2304],{"__ignoreMap":170},[10,2308,2310],{"id":2309},"java-파일과-컴파일","Java 파일과 컴파일",[28,2312,2313,2321],{},[31,2314,2315],{},[34,2316,2317,2319],{},[37,2318,110],{},[37,2320,42],{},[44,2322,2323,2331,2339],{},[34,2324,2325,2328],{},[49,2326,2327],{},".java 파일",[49,2329,2330],{},"소스 코드 파일 개발자가 작성하는 텍스트 기반의 Java 프로그램 소스 코드",[34,2332,2333,2336],{},[49,2334,2335],{},".class 파일",[49,2337,2338],{},"바이트코드 파일 컴파일 결과물 JVM이 읽고 실행할 수 있는 중간 언어로 변환 플랫폼 독립적",[34,2340,2341,2344],{},[49,2342,2343],{},"JVM",[49,2345,2346],{},"Java Virtual Machine: 실행 엔진 바이트코드class 파일 을 실행하는 가상 머신",[165,2348,2350],{"className":1223,"code":2349,"language":1225,"meta":170,"style":170},"flowchart LR\n  JavaFile[\".java 파일\"] --> Compile[\"컴파일\"]\n  Compile --> Bytecode[\".class (바이트코드)\"]\n  Bytecode --> JVM[\"JVM 실행 엔진\"]\n  JVM --> OS[\"OS 독립 실행\"]\n",[23,2351,2352,2356,2361,2366,2371],{"__ignoreMap":170},[174,2353,2354],{"class":176,"line":177},[174,2355,1232],{},[174,2357,2358],{"class":176,"line":188},[174,2359,2360],{},"  JavaFile[\".java 파일\"] --> Compile[\"컴파일\"]\n",[174,2362,2363],{"class":176,"line":200},[174,2364,2365],{},"  Compile --> Bytecode[\".class (바이트코드)\"]\n",[174,2367,2368],{"class":176,"line":721},[174,2369,2370],{},"  Bytecode --> JVM[\"JVM 실행 엔진\"]\n",[174,2372,2373],{"class":176,"line":734},[174,2374,2375],{},"  JVM --> OS[\"OS 독립 실행\"]\n",[2377,2378,2379],"style",{},"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}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":170,"searchDepth":188,"depth":188,"links":2381},[2382,2383,2384,2385,2386,2387,2388,2389,2392],{"id":12,"depth":200,"text":13},{"id":213,"depth":200,"text":214},{"id":301,"depth":200,"text":302},{"id":333,"depth":200,"text":334},{"id":374,"depth":200,"text":375},{"id":579,"depth":200,"text":580},{"id":596,"depth":200,"text":597},{"id":1023,"depth":188,"text":1024,"children":2390},[2391],{"id":1072,"depth":200,"text":1073},{"id":1140,"depth":188,"text":1141,"children":2393},[2394,2395,2396,2397,2398,2399,2400,2401,2402],{"id":1144,"depth":200,"text":1145},{"id":1164,"depth":200,"text":1165},{"id":1435,"depth":200,"text":1436},{"id":1726,"depth":200,"text":1727},{"id":1771,"depth":200,"text":1772},{"id":1811,"depth":200,"text":1812},{"id":1916,"depth":200,"text":1917},{"id":2291,"depth":200,"text":2292},{"id":2309,"depth":200,"text":2310},[203,2404],"basics","2026-08-10 09:00:00 +0900","네트워크와 데이터 형식부터 Java의 등장 배경, 컴파일 방식, 프로그램 구조까지 기초 흐름을 정리한다.","md",null,"\u002Fjava\u002Fbasics\u002F2026\u002F08\u002F10\u002Fjava-basics\u002F",{"layout":2411},"post","1","\u002Fposts\u002Fbackend\u002Fjava\u002Fbasics\u002F2026-08-10-java-basics",{"title":5,"description":2406},"Java 기초","posts\u002FBackend\u002FJAVA\u002Fbasics\u002F2026-08-10-java-basics",[1638,2418,2419,947,950,1459,2343],"Backend","Network","x6QabmWJpJktSC3u2ArdO3Sc8reSCz5vwdPMl4T_oqM",1788744784470]