딱지 떼기 준비운동
딱지 지도 — 지금 여기
- 컴퓨터 안에서 누가 일하고, 어디에 재료를 펼치는지 말해 봐요.
- Java 코드는 컴파일(번역) → 바이트코드 → JVM 실행 순서로 돌아간다는 것을 말해 봐요.
- 온라인 실행기에서 코드 쓰기 → Run → 결과 확인을 한 바퀴 돌고, 컴파일 오류가 나면 줄 번호를 찾아 고쳐요.
안녕하세요가 나타나요.프로그래밍을 처음 배우는 날에는 잘하는 것보다 한 번 끝까지 해 보는 것이 중요해요. 오늘은 Java로 쓴 짧은 글을 컴퓨터에게 건네고, 화면에 글자가 나타나는 것을 내 눈으로 보는 날이에요.
Java 글은 바로 실행되지 않아요. 중간에 번역을 한 번 거치고, 번역된 결과를 JVM이라는 실행 도우미가 읽어 줘요. 오늘은 이 두 단계를 그림으로 보고, 번역이 성공하는 것도 실패하는 것도 한 번씩 겪어 봐요.
오늘 뗄 딱지는 세 장이에요.
- 컴퓨터 안에서 누가 일하고, 어디에 재료를 펼치는지 말해 봐요.
- Java 코드는 컴파일(번역) → 바이트코드 → JVM 실행 순서로 돌아간다는 것을 말해 봐요.
- 온라인 실행기에서 코드 쓰기 → Run → 결과 확인을 한 바퀴 돌고, 컴파일 오류가 나면 줄 번호를 찾아 고쳐요.
오늘의 도착점: 화면에 안녕하세요가 나타나요. 그리고 일부러 낸 오류를 내 손으로 고쳐서 다시 안녕하세요를 봐요. 코드 다섯 줄의 뜻은 1강에서 한 줄씩 풀어요.
날짜: 내 이름:
Main.java처럼 .java로 끝나요javac(자바씨)예요Main.class 파일에 담겨요오늘 손으로 할 일은 Run 한 번이에요. 나머지는 Run 버튼이 차례대로 해 줘요.
카드를 가리고 말해 보세요.
- 사람이 Java로 적은 글은 예요.
- 그 글을 검사하고 번역하는 일은 이고, 번역 결과는 예요.
- 번역 결과를 읽어 실행시키는 도우미는 예요.
정답은 소스 코드, 컴파일, 바이트코드, JVM이에요. 오늘은 번역하는 단계와 실행하는 단계가 따로 있다는 것만 또렷하면 돼요.
왕두목 샘하고 달걀 요리를 한다고 생각해 볼까요? 보관장에서 달걀을 꺼내 조리대에 놓아요. 요리사는 레시피를 보고 요리해요. 다 된 음식은 식탁으로 나와요.
| 부엌에서 | 컴퓨터에서 | 하는 일 |
|---|---|---|
| 요리사 | CPU(씨피유) | 명령에 따라 계산하고 일을 처리해요 |
| 조리대 | 메모리(RAM, 램) | 지금 쓰는 명령과 데이터를 잠시 펼쳐 두어요 |
| 재료 보관장 | 저장장치(SSD 등) | 파일과 프로그램을 오래 보관해요 |
| 레시피 | 프로그램 | 할 일을 정해진 순서와 규칙으로 적어 놓아요 |
| 식탁 | 결과 화면 | 처리한 결과를 사람이 확인해요 |
CPU는 일하는 담당, 메모리는 지금 작업하는 자리, 저장장치는 나중에도 꺼내 쓸 것을 두는 자리예요.
그런데 이 부엌의 요리사는 우리가 쓴 Java 레시피를 그대로 읽지 못해요. 그래서 Java에는 도우미가 둘 있어요.
| 부엌에서 | Java에서 | 하는 일 |
|---|---|---|
| 우리가 쓴 레시피 | 소스 코드(Main.java) | 할 일을 Java의 규칙대로 적어요 |
| 꼼꼼한 번역가 | 컴파일러(javac) | 레시피 전체를 검사하고 공통 레시피 카드로 옮겨 적어요 |
| 공통 레시피 카드 | 바이트코드(Main.class) | 어느 부엌에서나 같은 카드를 써요 |
| 부엌마다 있는 조리 도우미 | JVM | 카드를 한 줄씩 읽어 그 부엌의 요리사에게 시켜요 |
왜 이렇게 두 번에 나눌까요? 부엌마다 요리사가 알아듣는 말이 달라요. 윈도우 컴퓨터의 요리사와 맥 컴퓨터의 요리사는 다른 말을 써요. 그래서 Java는 먼저 어느 부엌에서나 통하는 공통 카드로 번역해 두고, 부엌마다 있는 조리 도우미(JVM)가 그 카드를 자기 부엌 요리사의 말로 전해 줘요. 레시피를 한 번만 번역해도 여러 부엌에서 쓸 수 있는 거예요.
번역가에게는 고집이 하나 있어요. 레시피에 규칙이 틀린 문장이 하나라도 있으면 카드를 만들지 않아요. 대신 ‘3번째 줄 끝에 마침표가 없어요’ 같은 메모를 돌려줘요. 그 메모가 컴파일 오류 메시지예요.
비유에는 한계가 있어요. 실제 컴퓨터 안에 번역가나 도우미가 사람처럼 있지는 않아요. 그리고 컴파일러는 뜻을 짐작해서 고쳐 주지 않아요. 규칙에 맞지 않으면 멈출 뿐이에요.
한번 짚어 볼까요? 레시피 셋째 줄에 마침표가 빠졌어요. 조리 도우미는 첫째 줄 요리라도 시작할까요? 아니에요. 이번 레시피의 카드가 만들어지지 않았으니, 이번 요리는 시작하지 못해요.
그림을 손가락으로 따라가 보세요. 우리가 쓴 Main.java는 처음에 저장장치에 파일로 있어요. 컴파일러 javac가 그 파일을 처음부터 끝까지 검사하고 바이트코드로 번역해서 Main.class를 만들어요. 실행할 때가 되면 JVM이 메모리에 올라와 Main.class를 읽고, CPU에게 일을 시켜요. 그 결과로 글자가 화면에 나타나요.
번역 단계에서 오류가 나면 옆 상자로 빠져요. Main.class가 새로 만들어지지 않으니, JVM은 이번 코드를 실행할 수 없어요.
보통 메모리에 펼쳐 둔 것은 전원이 꺼지면 사라지고, 저장장치에 저장한 파일은 전원을 껐다 켜도 남아요. 오늘 쓸 온라인 실행기에서는 이 모든 일이 내 컴퓨터가 아니라 사이트의 컴퓨터에서 일어나요. 우리는 브라우저로 코드를 보내고 결과만 받아 봐요. 그래서 설치할 것이 없어요.
브라우저(크롬이나 엣지 같은 인터넷 보는 프로그램)를 열고, 맨 위 주소 칸에 Java 온라인 실행기 OnlineGDB의 주소 www.onlinegdb.com/online_java_compiler 를 적어요. 검색창이 아니라 주소를 적는 긴 칸이에요.

사이트의 배치나 안내 문구는 바뀔 수 있어요. 버튼 위치를 외우지 말고 언어 선택 칸·편집 영역·Run·결과 영역·Stop이라는 역할을 찾아 주세요. 이 사이트는 로그인하지 않아도 코드 쓰기·Run·결과 보기가 돼요. 왼쪽의 Sign Up·Login 단추나 광고는 누르지 않아도 돼요.
1. 언어가 Java인지 확인해요
언어 선택 칸에 Java가 보이면 그대로 둬요. 다른 언어가 보이면 그 칸을 눌러 목록에서 Java를 골라요. JavaScript는 이름이 비슷하지만 다른 언어예요. 꾸밈말 없이 딱 Java를 골라요.

2. 편집 영역을 비우고 코드를 넣어요
처음에는 사이트가 넣어 둔 예제 코드가 들어 있어요. 편집 영역 안을 한 번 클릭하고, Windows는 Ctrl+A, Mac은 Command(⌘)+A로 전체 선택해요. 코드 부분만 파랗게 선택됐는지 확인한 뒤 Delete 키로 지워요. 그리고 아래 다섯 줄을 넣어요. 오늘은 뜻을 몰라도 괜찮아요. 똑같이 따라 쓰는 것이 오늘 할 일이에요.
public class Main { public static void main(String[] args) { System.out.println("안녕하세요"); }}
안녕하세요
복사해서 넣어도 괜찮아요. 직접 칠 때는 이 네 가지만 챙겨요.
- 대문자와 소문자를 구별해요.
public,class,static,void,main은 소문자예요.Main,String,System은 첫 글자만 대문자예요. Java는System과system을 전혀 다른 이름으로 봐요. - 따옴표는 키보드의 반듯한 큰따옴표
"를 써요. 워드나 메신저에서 복사한 둥근 따옴표“ ”는 오류가 나요. - 셋째 줄 끝의
;(세미콜론)을 빠뜨리지 않아요. - 여는 중괄호
{가 두 개, 닫는 중괄호}도 두 개예요. 짝이 맞아야 해요.
한글 입력 상태로 영어를 치면 엉뚱한 글자가 나와요. 영어를 칠 때는 한/영 키로 영어 상태를 확인해요. 편집 영역은 여는 괄호나 따옴표를 치면 닫는 짝을 저절로 하나 더 넣어 주기도 해요. 다 친 뒤에 책의 코드와 짝을 하나씩 대조해요.

3. Run을 한 번 눌러요
Run은 ‘컴파일하고 실행해 줘’라는 부탁이에요. 한 번 누르고 잠깐 기다려요. 느리다고 여러 번 연달아 누르지 않아요.
4. 결과 영역을 봐요

결과 영역에 안녕하세요가 보이면 컴파일도, 실행도 성공한 거예요. 실행기에 따라 그 아래에 ‘프로그램이 끝났어요’ 같은 영어 안내가 붙기도 해요. 그 안내는 사이트가 덧붙인 말이고, 내 코드가 출력한 글은 안녕하세요 한 줄뿐이에요. 둘을 나누어 보세요.
다섯 줄 중에서 화면에 나온 글은 셋째 줄의 큰따옴표 안쪽이에요. 오늘은 이것만 짚고 가요.
System.out.println은 글을 화면에 한 줄 내보내는 일을 맡은 도구예요. 길어 보이지만 오늘은 한 덩어리 이름으로 봐요.- 이름 바로 뒤의 소괄호
( )안은 그 도구에 건넬 내용을 적는 자리예요. - 큰따옴표
" "는 ‘여기부터 여기까지가 글자 내용’이라는 표시예요. 그래서 따옴표는 화면에 나오지 않고, 그 안의안녕하세요만 나와요.
나머지 네 줄이 하는 일과 ;의 뜻은 1강에서 조각조각 나눠 읽어요.
한 줄 정리: Run을 누르면 Java 코드는 번역(컴파일)되고, 번역이 성공해야 JVM이 실행해서 결과를 보여 줘요.
예제 2 · 일부러 한 번 틀려 봐요
이번에는 오류를 일부러 만들어요. 셋째 줄 끝의 ;만 지우고 Run을 눌러요. 나머지는 그대로예요.
public class Main { public static void main(String[] args) { System.out.println("안녕하세요") }}
Main.java:3: error: ';' expected
System.out.println("안녕하세요")
^
1 error
영어가 나와서 놀라셨지요? 전부 읽지 않아도 돼요. error라는 말이 들어 있는 첫 줄만 봐요.
| 조각 | 읽는 법 |
|---|---|
Main.java | 문제가 있는 파일 이름 |
3 | 3번째 줄 |
error | 번역을 멈춘 문제 |
';' expected | ‘;가 있어야 하는데 없어요’ |
1 error | 오류가 모두 1개 |
그 아래 두 줄은 문제의 줄을 그대로 보여 주고, ^로 위치를 가리켜요. 한글은 화면에서 두 칸 폭으로 보여서 ^가 조금 왼쪽에 있는 것처럼 보일 수 있어요. 위치는 줄 번호로 찾는 것이 가장 확실해요.
실행기마다 메시지 문구가 조금씩 다를 수 있어요. 그래도 파일 이름, 줄 번호, error라는 세 조각은 거의 늘 들어 있어요.
이제 ;를 다시 넣고 Run을 눌러요. 결과 영역에 다시 안녕하세요가 나오면 오늘의 도착점에 닿은 거예요.
예제 3 · 대문자 하나가 소문자로 바뀌면
System의 첫 글자 S를 소문자 s로 바꿔 볼게요. 글자 하나 차이예요.
public class Main { public static void main(String[] args) { system.out.println("안녕하세요"); }}
Main.java:3: error: package system does not exist
system.out.println("안녕하세요");
^
1 error이번에도 3번째 줄이에요. package system does not exist는 ‘system이라는 것을 찾을 수 없어요’라는 뜻이에요. Java는 대문자와 소문자를 다른 글자로 봐요. 그래서 system은 Java가 아는 System이 아니에요. S를 대문자로 고치고 다시 Run하면 돼요.
추적표는 어려운 검사표가 아니에요. 내가 한 일과 그다음 달라진 것을 차례로 적는 표예요. Java에서는 컴파일이 성공했는지를 꼭 한 줄 적어요.
| 차례 | 내가 한 일 | 확인할 곳 | 확인한 내용 |
|---|---|---|---|
| 1 | 다섯 줄을 넣었어요 | 편집 영역 | 셋째 줄 System.out.println("안녕하세요"); |
| 2 | Run을 한 번 눌렀어요 | 결과 영역 | 컴파일을 요청했어요 |
| 3 | 컴파일 결과를 봤어요 | 결과 영역 | error 없음 → 성공 |
| 4 | 실행 결과를 읽었어요 | 결과 영역 | 안녕하세요 |
이번에는 예제 2를 내 화면을 보고 적어요.
| 내가 확인할 것 | 내 기록 |
|---|---|
| 지운 기호와 줄 | |
| 첫 error 줄의 줄 번호 | |
| 실행까지 갔나요? | 갔어요 컴파일에서 멈췄어요 |
| 고친 뒤 다시 Run한 결과 |
대조 답: 셋째 줄 끝의 ;를 지웠어요. 첫 error 줄은 3번째 줄을 가리켜요. 컴파일에서 멈췄기 때문에 실행은 되지 않았어요. 고친 뒤에는 안녕하세요가 나와요.
막혔을 때는 이것부터 봐요
| 지금 보이는 상황 | 먼저 할 일 |
|---|---|
| 아무 결과도 안 보여요 | Run을 눌렀는지, 결과 영역을 보고 있는지 확인해요 |
| 실행이 끝나지 않고 글이 계속 나와요 | Stop을 눌러요. 끝나지 않는 반복은 5강에서 다시 만나요 |
| error라는 말이 보여요 | 첫 error 줄의 줄 번호와 그 앞 줄을 책과 기호까지 대조해요 |
| 언어가 다른 것으로 되어 있어요 | 언어 선택 칸을 Java로 바꾸고 다시 Run해요 |
| 사이트 자체가 안 열려요 | 인터넷 연결과 주소를 확인해요. 코드 오류와는 다른 문제예요 |

먼저 앞쪽을 가려요. 바로 떠오르지 않아도 한 번 생각해 보는 것이 연습이에요.
연습 1. 순서를 써요.
소스 코드 쓰기 → → 바이트코드 → 가 실행 → 결과 확인
연습 2. 역할을 이어요.
- CPU → (일을 처리해요 / 파일을 오래 보관해요)
- 메모리 → (지금 작업하는 자리예요 / 종이에 결과를 인쇄해요)
- javac → (소스 코드를 검사하고 번역해요 / 오류를 짐작해서 고쳐 줘요)
- JVM → (바이트코드를 읽어 실행시켜요 / 사람이 처음 적은 글이에요)
연습 3. 오류 메시지에서 줄 번호를 찾아요.
Main.java:4: error: ';' expected
몇 번째 줄을 먼저 봐야 할까요? 번째 줄 빠진 기호는?
연습 4. 빈칸을 채워요.
종이에 쓰는 연습 틀이에요. 대괄호와 번호는 실행기에 넣지 않아요.
①.out.println("안녕하세요");
①에 쓸 말:
연습 5. 다섯 줄을 보고 따라 써요.
오늘은 외우지 않아도 돼요. 첫 실행 코드를 보면서 종이에 한 번 따라 쓰고, 그다음 실행기에 직접 쳐서 Run해 보세요.
스스로 대조하는 답
연습 1은 ‘컴파일(javac)’, ‘JVM’이에요. 연습 2는 ‘일을 처리해요 / 지금 작업하는 자리예요 / 소스 코드를 검사하고 번역해요 / 바이트코드를 읽어 실행시켜요’예요. 연습 3은 4번째 줄, 빠진 기호는 ;예요. 연습 4는 대문자로 시작하는 System이에요.
내가 빠뜨렸던 것 한 가지:
학습용 창작 문항이에요.
문제. Java 프로그램이 실행되는 과정에 대한 설명으로 가장 알맞은 것은 무엇인가요?
내가 고른 답: 이유:
정답먼저 풀고 눌러서 펼쳐 보세요
해설: 번역가(컴파일러)가 공통 레시피 카드(바이트코드)를 만들고, 조리 도우미(JVM)가 그것을 실행해요. ①은 컴파일과 실행을 섞었어요. 컴파일이 실패하면 이번 코드는 한 줄도 실행되지 않아요. ③은 틀렸어요. System과 system은 다른 이름이라 예제 3처럼 오류가 나요. ④는 순서가 거꾸로예요. 첫 error 줄부터 고쳐요.
딱지 떼기
도장
- CPU·메모리·저장장치를 요리사·조리대·보관장으로 나누어 말할 수 있어요.
- 소스 코드 → 컴파일 → 바이트코드 → JVM 실행 순서를 말할 수 있어요.
- Run 한 번에 컴파일과 실행이 이어서 일어난다는 것을 알아요.
- 실행기에서 언어 선택 칸·편집 영역·Run·결과 영역·Stop을 찾았어요.
- 다섯 줄을 실행하고
안녕하세요를 내 눈으로 확인했어요. - 일부러 낸 오류에서 첫 error 줄의 줄 번호를 읽고, 고친 뒤 다시 Run했어요.
아직 실행하지 못했다면 해당 칸은 비워 두세요. 나중에 실행하고 체크하면 돼요.
오늘 내가 뗀 딱지: 다시 볼 곳: