문서 읽는 데 29분 · day01

day01

전체 21강 중 1강 · 자바 기초
난이도 · 입문

안녕하세요! 여러분의 Java 가이드, 홍순구 튜터입니다.

드디어 Day 1입니다! 오늘부터 여러분은 프로그래머의 길을 걷기 시작합니다. "나는 문과인데요", "코딩이라니 무섭습니다" — 걱정 마세요. 오늘이 끝나면 여러분의 컴퓨터가 여러분이 시킨 대로 움직이는 걸 직접 눈으로 확인하게 됩니다.

오늘의 주제는 "개발 환경과 Java 소개" 입니다.

🎯 학습 목표

  • JDK 25를 설치하고 IntelliJ IDEA에서 프로젝트를 만들 수 있다
  • void main()으로 첫 Java 프로그램을 실행할 수 있다
  • 소스 코드가 컴파일을 거쳐 실행되는 흐름을 설명할 수 있다
  • JVM이 어떤 역할을 하는지 한 문장으로 설명할 수 있다

Step 1: "컴퓨터에게 말을 건다는 것"

여러분, 카페에서 커피를 주문해 본 적 있으시죠? "아이스 아메리카노 한 잔 주세요" 라고 말하면, 바리스타가 순서대로 얼음을 넣고, 에스프레소를 내리고, 물을 붓습니다.

프로그래밍도 이것과 같습니다. 컴퓨터라는 "바리스타"에게, 우리가 원하는 동작을 순서대로 알려주는 거예요. 다만 사람은 말귀를 알아듣지만, 컴퓨터는 아주 정확한 문법으로 써줘야 합니다.

그 "정확한 문법"을 제공하는 게 바로 프로그래밍 언어(Programming Language) 입니다. 세상에는 수백 가지 프로그래밍 언어가 있는데요, 오늘 우리가 배울 언어는 Java 입니다.

Java는 어떤 언어인가요?

Java는 1995년에 태어났고, 30년이 넘는 세월 동안 세계에서 가장 많이 쓰이는 언어 중 하나입니다.

  • 안드로이드 앱: 여러분의 스마트폰 앱 상당수가 Java로 만들어졌어요
  • 은행·카드사 서버: 돈이 오가는 중요한 시스템에서 Java를 씁니다
  • 넷플릭스·쿠팡 같은 대형 서비스: 수천만 명이 동시에 접속하는 서버를 Java가 버팁니다

왜 이렇게 오래, 많이 쓰일까요? 그 비밀은 오늘 Step 6에서 배울 JVM이라는 녀석 덕분입니다. 지금은 "Java는 믿을 수 있는 언어구나" 정도만 기억해 주세요.


Step 2: "JDK 설치 — 개발 도구 상자 준비하기"

프로그래밍을 하려면 도구가 필요합니다. 목수에게 망치와 톱이 있듯이, Java 개발자에게는 JDK가 있습니다.

JDK가 뭔가요?

JDKJava Development Kit의 줄임말입니다. 한국어로 하면 "자바 개발 도구 상자" 예요.

이 도구 상자 안에는 세 가지 핵심 도구가 들어 있습니다.

도구 이름 하는 일
번역기 javac (자바 컴파일러) 우리가 쓴 코드를 컴퓨터가 읽을 수 있는 형태로 변환
실행기 java (자바 실행기) 변환된 코드를 실제로 실행
부품 창고 표준 라이브러리 자주 쓰는 기능을 미리 만들어둔 코드 모음

우리는 JDK 25 버전을 사용합니다. 숫자가 클수록 최신 버전이에요.

JDK 25 설치하기

  1. 웹 브라우저에서 Adoptium (adoptium.net)에 접속합니다
  2. "JDK 25" 버전을 선택하고 자신의 운영체제(Windows/macOS)에 맞는 설치 파일을 다운로드합니다
  3. 설치 파일을 실행하고 "다음"을 계속 눌러 설치를 완료합니다

설치가 잘 됐는지 확인하기

설치가 끝나면 터미널(Mac) 또는 명령 프롬프트(Windows)를 열어서 아래 명령어를 입력해 봅니다.

java --version

이런 식으로 버전 정보가 나오면 성공입니다.

openjdk 25 2025-09-16
OpenJDK Runtime Environment (build 25+36)
OpenJDK 64-Bit Server VM (build 25+36, mixed mode, sharing)

💡 버전 숫자가 25로 시작하면 됩니다. 뒷부분의 세부 숫자는 달라도 괜찮아요.

🙋 학생 질문 — "터미널이 뭔가요? 처음 보는 화면인데요."

터미널은 컴퓨터에게 글자로 명령을 내리는 창입니다. 마우스 대신 키보드로 "이것 해줘"라고 타이핑하는 방식이에요.

  • Mac: Spotlight(Cmd + Space)에서 "터미널"을 검색하면 나옵니다
  • Windows: 시작 메뉴에서 "명령 프롬프트" 또는 "cmd"를 검색하면 나옵니다

지금은 JDK 설치 확인 용도로만 쓰고, 앞으로는 IntelliJ IDEA가 대신해 줄 거예요. 겁먹지 않아도 됩니다!


Step 3: "IntelliJ IDEA — 코드를 쓰는 똑똑한 편집기"

JDK를 설치했으니, 이제 코드를 쓸 "편집기"가 필요합니다.

메모장에서 코드를 쓸 수도 있지만, 그러면 오타를 잡아주는 사람이 아무도 없어요. 마치 맞춤법 검사 없이 보고서를 쓰는 것과 같습니다.

그래서 우리는 IDE를 씁니다. IDEIntegrated Development Environment의 줄임말이고, 한국어로 "통합 개발 환경" 이에요. 코드를 쓰면서 동시에 오타를 잡아주고, 자동완성도 해주고, 버튼 하나로 실행까지 해주는 똑똑한 편집기입니다.

우리가 사용할 IDE는 IntelliJ IDEA Community Edition 입니다. 무료이고, 전 세계 Java 개발자가 가장 많이 쓰는 도구예요.

IntelliJ IDEA 설치하기

  1. jetbrains.com/idea 에 접속합니다
  2. Community Edition (무료)을 다운로드합니다
  3. 설치 파일을 실행하고 안내에 따라 설치합니다

⚠️ "Ultimate Edition"이 아닌 "Community Edition" 을 선택하세요. 우리 수업에는 무료 버전으로 충분합니다.

새 프로젝트 만들기

IntelliJ를 처음 실행하면 환영 화면이 나타납니다.

  1. New Project 클릭
  2. Name: java-basic-practice (원하는 이름으로)
  3. Language: Java
  4. JDK: 25 (방금 설치한 JDK가 자동으로 잡힙니다)
  5. Create 클릭

프로젝트가 생성되면 왼쪽에 폴더 구조가, 오른쪽에 코드 편집 영역이 보입니다. 아직은 텅 비어 있지만, 다음 Step에서 여기에 첫 코드를 쓸 거예요!


Step 4: "Hello, World! — 첫 프로그램 실행하기"

드디어 코드를 쓸 시간입니다!

전 세계 모든 프로그래머가 새 언어를 배울 때 가장 먼저 만드는 프로그램이 있습니다. 바로 화면에 "Hello, World!" 를 출력하는 프로그램이에요. 1978년부터 이어져 온 전통이니, 우리도 따라가 봅시다.

파일 만들기

  1. 왼쪽 프로젝트 탐색기에서 src 폴더를 오른쪽 클릭합니다
  2. New → Java Class 를 선택합니다
  3. 이름에 HelloWorld 를 입력하고 Enter

코드 작성하기

파일이 열리면, 안에 있는 내용을 모두 지우고 아래 코드를 정확히 따라 쳐 보세요.

void main() {
    System.out.println("Hello, World!");
}

단 세 줄입니다. 복사·붙여넣기 하지 말고, 한 글자씩 직접 타이핑해 보세요. 손가락이 코드를 기억하기 시작하는 게 중요합니다.

실행하기

코드를 다 쳤으면, main 글자 왼쪽에 초록색 ▶ 버튼이 보일 거예요. 그 버튼을 클릭하고 Run 'HelloWorld.main()' 을 선택합니다.

화면 아래에 실행 결과 창이 열리면서 이렇게 나타납니다.

Hello, World!

축하합니다! 🎯 여러분은 방금 인생 첫 프로그램을 만들고 실행했습니다.

코드 한 줄씩 뜯어보기

void main() {
    System.out.println("Hello, World!");
}
코드 의미
void main() "여기가 프로그램의 시작점이에요" — 프로그램은 항상 이 문 안으로 들어옵니다
{} 시작과 끝을 감싸는 중괄호 — "이 안의 명령을 실행해"
System.out.println(...) 괄호 안의 내용을 화면에 출력하고 줄을 바꿔라
"Hello, World!" 출력할 글자 — 큰따옴표로 감싸야 합니다
; 문장의 끝 표시 — 한국어의 마침표(.)와 같습니다

💡 voidmain의 정확한 뜻은 아직 몰라도 됩니다. 지금은 "이 틀 안에 명령을 쓰면 컴퓨터가 실행한다" 는 것만 기억하세요. 뒤에서 하나씩 자세히 배울 거예요.

🙋 학생 질문 — "void main()이 뭔가요? void는 무슨 뜻이에요?"

아주 좋은 질문이에요! void는 영어로 "빈 공간"이라는 뜻입니다. "이 메서드(기능)는 실행만 하고, 결과값을 돌려주지 않는다"는 의미예요.

그리고 main은 "주된, 메인"이라는 뜻이고, Java가 프로그램을 시작할 때 가장 먼저 찾는 이름입니다. 마치 건물의 "정문"과 같아요. 뒷문이나 옆문이 아니라, 항상 정문으로 들어옵니다.

Day 6에서 메서드를 본격적으로 배울 때 void의 정확한 의미를 다시 살펴볼 거예요. 지금은 "프로그램의 시작점" 정도로만 이해하면 충분합니다.


Step 5: "코드가 결과로 바뀌는 과정 — 컴파일과 실행"

방금 여러분은 코드를 쓰고 실행 버튼을 눌렀더니 "Hello, World!"가 화면에 떴습니다. 그런데 이 사이에 무슨 일이 벌어진 걸까요?

소스 코드와 바이트코드

우리가 방금 쓴 HelloWorld.java 파일을 소스 코드(Source Code) 라고 부릅니다. 사람이 읽고 쓸 수 있는 코드예요.

그런데 컴퓨터는 이 코드를 바로 이해하지 못합니다. 컴퓨터가 이해하는 건 0과 1뿐이거든요. 그래서 중간에 번역 과정이 필요합니다.

비유하자면 이렇습니다.

한국어 소설(소스 코드)을 → 번역가(컴파일러)가 → 영어 소설(바이트코드)로 번역 → 독자(JVM)가 읽는다

컴파일이란?

이 번역 과정을 컴파일(Compile) 이라고 합니다. JDK 안에 들어있는 javac라는 도구가 이 일을 해요.

HelloWorld.java  →  javac (컴파일러)  →  HelloWorld.class
 (소스 코드)                              (바이트코드)

.class 파일 안에 들어있는 것을 바이트코드(Bytecode) 라고 부릅니다. 사람이 읽기는 어렵지만, JVM이 읽기에는 딱 좋은 중간 형태예요.

실행이란?

바이트코드가 만들어지면, java라는 실행기가 이걸 읽어서 실제로 동작시킵니다. 화면에 "Hello, World!"가 찍히는 건 바로 이 실행 단계에서 일어나는 일이에요.

HelloWorld.class  →  java (JVM)  →  "Hello, World!" 출력
 (바이트코드)                         (실행 결과)

전체 흐름 정리

[1] 코드 작성     →  HelloWorld.java (사람이 읽을 수 있는 소스 코드)
[2] 컴파일        →  HelloWorld.class (JVM이 읽을 수 있는 바이트코드)
[3] 실행          →  "Hello, World!" (화면에 결과 출력)

💡 IntelliJ에서 Run 버튼을 누르면 [2]와 [3]이 자동으로 한 번에 처리됩니다. 여러분이 의식하지 못했을 뿐, 방금 이 세 단계가 모두 일어났어요.

🙋 학생 질문 — "그러면 왜 굳이 컴파일이라는 과정을 거치나요? 바로 실행하면 안 되나요?"

좋은 질문입니다! 컴파일 없이 바로 실행하는 언어도 있어요. Python이 대표적입니다. 이런 방식을 인터프리터(Interpreter) 방식이라고 합니다.

Java가 컴파일을 거치는 이유는 크게 두 가지예요.

첫째, 실행하기 전에 오류를 잡아줍니다. 세미콜론을 빠뜨리거나 오타를 냈을 때, 컴파일 단계에서 "여기 틀렸어요!"라고 알려줍니다. 실행하기 전에 미리 걸러주니 안전하죠.

둘째, 한 번 컴파일한 결과물은 어디서든 실행됩니다. 이건 바로 다음 Step에서 자세히 배울 JVM의 핵심 장점이에요.


Step 6: "JVM — 어디서든 실행되는 비밀"

Step 5에서 우리는 .java 파일이 .class 파일로 변환되는 과정을 봤습니다. 그런데 이 .class 파일을 실제로 읽고 실행하는 녀석이 누굴까요?

바로 JVM 입니다.

JVM이 뭔가요?

JVMJava Virtual Machine의 줄임말입니다. 한국어로는 "자바 가상 머신" 이에요.

"가상 머신"이라는 이름이 어렵게 느껴질 수 있는데, 쉽게 말하면 "Java 프로그램을 실행해주는 통역사" 입니다.

만국 공통 통역사

여러분이 영어로 발표 원고를 썼다고 상상해 보세요. 이 원고를 프랑스에 가져가면 프랑스어 통역사가 프랑스 사람들에게 전달하고, 일본에 가져가면 일본어 통역사가 일본 사람들에게 전달합니다.

원고는 하나인데, 통역사만 바꾸면 어디서든 통한다 — 이게 바로 JVM의 원리입니다.

운영체제 JVM 결과
Windows Windows용 JVM이 번역 "Hello, World!" 출력
macOS Mac용 JVM이 번역 "Hello, World!" 출력
Linux Linux용 JVM이 번역 "Hello, World!" 출력

코드는 한 번만 쓰면 됩니다. JVM만 설치되어 있으면 어디서든 실행됩니다. 이걸 Java의 유명한 슬로건으로 표현하면 이렇습니다.

"Write Once, Run Anywhere" — 한 번 작성하면, 어디서든 실행된다.

💡 Java가 30년 넘게 기업 시스템에서 사랑받는 가장 큰 이유 중 하나가 바로 이 플랫폼 독립성 입니다. 서버가 Windows든 Linux든 같은 코드가 돌아가니, 기업 입장에서는 매우 편리하죠.

🙋 학생 질문 — "Python도 Windows, Mac에서 다 돌아가지 않나요? Java만의 특별한 점이 뭔가요?"

맞아요, Python도 여러 운영체제에서 돌아갑니다. 하지만 방식이 조금 달라요.

Python은 코드를 한 줄씩 읽으면서 바로 실행합니다 (인터프리터 방식). Java는 코드를 미리 바이트코드로 변환해두고, JVM이 그걸 실행합니다 (컴파일 + JVM 방식).

미리 변환해두는 Java의 방식은 실행 속도가 더 빠르고, 오류를 미리 잡아주는 장점이 있어요. "어디서든 돌아간다"는 결과는 비슷해도, 그 과정과 장단점이 다릅니다.

이 차이를 지금 다 이해할 필요는 없어요. "Java에는 JVM이라는 통역사가 있고, 덕분에 빠르고 안전하게 어디서든 돌아간다" — 이 정도면 충분합니다.


Step 7: "코드를 바꿔보자 — 에러는 선생님이에요"

Step 4에서 "Hello, World!" 한 줄을 출력하는 데 성공했죠? 이제 코드를 마음대로 바꿔보면서 "이렇게 하면 어떻게 되지?"를 실험해 봅시다.

실험 1: 여러 줄 출력하기

HelloWorld.java 파일을 열고, 코드를 아래처럼 바꿔보세요.

void main() {
    System.out.println("Hello, World!");
    System.out.println("Java is fun!");
    System.out.println("1 + 2 = " + (1 + 2));
}

실행하면 이렇게 나옵니다.

Hello, World!
Java is fun!
1 + 2 = 3

System.out.println()을 여러 번 쓰면, 한 줄씩 차례로 출력됩니다. 그리고 세 번째 줄을 보세요 — Java가 1 + 2직접 계산해서 3을 출력했어요!

실험 2: 일부러 에러 내보기

이번에는 일부러 코드를 "틀리게" 써 봅시다. 무서워하지 마세요. 에러가 나도 컴퓨터가 고장 나는 일은 절대 없습니다.

실험 A — 세미콜론(;) 빼보기

void main() {
    System.out.println("Hello, World!")
}

끝에 세미콜론을 빼면, IntelliJ가 빨간 줄을 그으면서 뭔가 잘못됐다고 알려줍니다. 실행하면 이런 에러 메시지가 나와요.

error: ';' expected
    System.out.println("Hello, World!")
                                       ^

에러 메시지를 읽어볼까요? ';' expected — "세미콜론이 필요한데 없습니다" 라는 뜻이에요. 그리고 ^ 표시가 어디가 문제인지 정확히 가리키고 있습니다.

실험 B — 대소문자 틀리기

void main() {
    system.out.println("Hello, World!");
}

Systemsystem으로 바꿨을 뿐인데, 에러가 납니다. Java는 대문자와 소문자를 구분합니다. Systemsystem은 Java에게 완전히 다른 단어예요.

실험 C — 큰따옴표 빼보기

void main() {
    System.out.println(Hello, World!);
}

큰따옴표를 빼면 Java는 Hello를 글자가 아니라 명령어 이름으로 이해하려고 합니다. 당연히 Hello라는 명령어는 없으니 에러가 나죠.

에러와 친해지기

에러 메시지는 여러분의 적이 아니라 선생님입니다. "여기가 틀렸어요, 이렇게 고쳐보세요"라고 알려주는 친절한 안내문이에요.

앞으로 코딩을 하면서 에러를 수백 번, 수천 번 보게 될 겁니다. 프로 개발자도 마찬가지예요. 에러 없이 코딩하는 사람은 없습니다.

💡 에러가 나면 당황하지 말고, 이 세 단계를 따라해 보세요.

  1. 에러 메시지를 읽는다 — 영어라도 겁먹지 말고, 키워드를 찾아보세요
  2. ^ 표시가 가리키는 위치를 확인한다 — 문제가 생긴 곳이에요
  3. 코드를 원래대로 되돌리고 다시 실행한다 — 고친 게 맞는지 바로 확인

마무리

오늘 우리가 한 일을 돌아봅시다.

  1. Java가 뭔지 알게 됐어요 — 30년간 사랑받는 프로그래밍 언어
  2. JDK를 설치했어요 — 개발 도구 상자를 열었습니다
  3. IntelliJ IDEA를 설정했어요 — 코드를 쓸 똑똑한 편집기를 장착했습니다
  4. 첫 프로그램을 실행했어요 — "Hello, World!"를 화면에 띄웠습니다
  5. 컴파일 과정을 이해했어요 — .java → .class → 실행
  6. JVM의 역할을 알게 됐어요 — "한 번 쓰고, 어디서든 실행"
  7. 에러와 친해졌어요 — 에러 메시지는 선생님이다

"Hello, World!" 한 줄 출력한 것뿐이라고 느낄 수 있지만, 그 뒤에는 소스 코드 작성 → 컴파일 → JVM 실행이라는 과정이 숨어 있었습니다. 여러분은 오늘 그 전체 흐름을 경험한 거예요.

다음 시간에는 "변수와 자료형" 을 배웁니다. 오늘 우리는 화면에 글자만 출력했는데, 프로그램이 정보를 기억하고 보관하려면 어떻게 해야 할까요? 데이터를 담는 그릇, 변수를 만나러 가봅시다!


과제

[실습] 자기소개 프로그램 만들기

System.out.println()을 사용해서 자기소개를 출력하는 프로그램을 만들어 보세요.

요구사항:

  • 이름, 올해 목표, 좋아하는 것 세 가지를 각각 한 줄씩 출력합니다
  • System.out.println()을 최소 3번 사용합니다

출력 예시:

안녕하세요, 저는 홍길동입니다.
올해 목표는 Java를 마스터하는 것입니다!
저는 커피와 고양이와 코딩을 좋아합니다.

[탐구] 에러 메시지 탐험가 되기

일부러 에러를 3가지 만들어 보고, 각각의 에러 메시지를 메모장이나 노트에 기록해 보세요.

시도해볼 에러:

  1. 세미콜론(;) 빼기
  2. Systemsystem으로 바꾸기 (대소문자)
  3. 여는 중괄호 { 또는 닫는 중괄호 } 빼기

각 에러마다 아래 형식으로 기록합니다.

[에러 1]
- 뭘 바꿨나: 세미콜론을 뺐다
- 에러 메시지: ';' expected
- 의미: 세미콜론이 필요하다는 뜻
- 내 느낌: 에러 메시지가 생각보다 친절하다!

생각해볼 주제

1. "프로그래밍 언어가 왜 이렇게 많을까?"

Java, Python, JavaScript, C, C++, Go, Rust, Kotlin, Swift... 세상에는 수백 가지 프로그래밍 언어가 있습니다. 왜 하나로 통일하지 않는 걸까요? 자연어에 영어, 한국어, 일본어가 있는 것과 비슷한 이유일까요, 아니면 다른 이유가 있을까요?

2. "컴파일러가 잡아주는 에러와 못 잡는 에러"

오늘 실험에서 세미콜론을 빼면 컴파일러가 바로 알려줬습니다. 그런데 만약 System.out.println("1 + 1 = 3"); 이라고 쓰면 어떨까요? 이 코드는 에러 없이 정상 실행됩니다. 하지만 결과는 틀렸죠. 컴파일러가 잡아주는 에러의 범위는 어디까지일까요? 그 너머의 에러는 누가 책임져야 할까요?

3. "'어디서든 실행된다'는 약속, 정말 100% 지켜질까?"

Java의 유명한 슬로건 "Write Once, Run Anywhere"를 배웠습니다. 하지만 현실에서는 Windows에서 잘 돌던 프로그램이 Linux에서 문제를 일으키는 경우가 있다고 합니다. JVM이 "어디서든 실행"을 보장해준다면, 왜 이런 일이 생길 수 있을까요?

✅ 예시 답안정답 보기

과제 1: 자기소개 프로그램 만들기

채점 포인트

항목 배점 기준
System.out.println() 3회 이상 사용 40% 이름, 목표, 좋아하는 것 각각 출력
세미콜론·중괄호 등 문법 오류 없음 30% 컴파일·실행이 정상적으로 되는가
void main() 구조 안에 작성 20% 프로그램 시작점 구조를 따르는가
출력 내용이 자기소개와 관련 있음 10% 아무 문장이 아닌 실제 자기소개

예시 코드

void main() {
    System.out.println("안녕하세요, 저는 김자바입니다.");
    System.out.println("올해 목표는 Java 기초를 완전히 정복하는 것입니다!");
    System.out.println("저는 커피와 고양이와 코딩을 좋아합니다.");
}

실행 결과:

안녕하세요, 저는 김자바입니다.
올해 목표는 Java 기초를 완전히 정복하는 것입니다!
저는 커피와 고양이와 코딩을 좋아합니다.

💡 System.out.println()의 괄호 안에 원하는 문장을 큰따옴표로 감싸서 넣으면 됩니다. 줄마다 하나씩 println을 쓰면 출력도 한 줄씩 나옵니다. 여기에 정답은 없어요 — 여러분만의 이야기를 담으면 그게 정답입니다.

자주 하는 실수

실수 에러 메시지 해결법
세미콜론 빠뜨림 ';' expected println() 끝에 ; 확인
큰따옴표 안 닫음 unclosed string literal " 가 짝을 이루는지 확인
println 오타 cannot find symbol 철자 확인 (println, L이 아닌 소문자 l)

과제 2: 에러 메시지 탐험가 되기

채점 포인트

항목 배점 기준
3가지 에러를 실제로 만들어봄 40% 직접 코드를 수정하고 실행한 흔적
에러 메시지를 기록함 30% 메시지 원문(영어)을 적었는가
에러 메시지의 의미를 추측함 20% 나름대로 해석을 시도했는가
느낀 점을 적음 10% 에러에 대한 태도 변화가 보이는가

예시 답안

에러 1: 세미콜론 빠뜨리기

void main() {
    System.out.println("Hello, World!")
}
[에러 1]
- 뭘 바꿨나: 첫 번째 줄 끝의 세미콜론(;)을 지웠다
- 에러 메시지: error: ';' expected
- 의미: "세미콜론이 여기 있어야 하는데 없습니다"
- 내 느낌: 에러 메시지가 뭐가 빠졌는지 정확히 알려줘서 놀랐다

에러 2: 대소문자 틀리기

void main() {
    system.out.println("Hello, World!");
}
[에러 2]
- 뭘 바꿨나: System을 system으로 바꿨다 (S를 소문자 s로)
- 에러 메시지: error: cannot find symbol
- 의미: "system이라는 이름을 찾을 수 없습니다"
- 내 느낌: 대문자 하나 차이로 완전히 다른 단어가 된다니 신기하다

에러 3: 닫는 중괄호 빠뜨리기

void main() {
    System.out.println("Hello, World!");

[에러 3]
- 뭘 바꿨나: 마지막 닫는 중괄호 }를 지웠다
- 에러 메시지: error: reached end of file while parsing
- 의미: "파일이 끝났는데 아직 닫히지 않은 블록이 있습니다"
- 내 느낌: 중괄호도 짝이 맞아야 한다는 걸 알게 됐다

💡 에러를 만들어보고 메시지를 읽는 연습을 한 것만으로도 충분합니다. 앞으로 코딩하면서 에러를 만날 때마다 "아, 이건 예전에 봤던 그 에러네!" 하는 순간이 올 거예요. 에러는 무서운 게 아니라, 코드를 고치는 힌트입니다.


생각해볼 주제 답안


주제 1: "프로그래밍 언어가 왜 이렇게 많을까?"

[문제 상황 요약]

Java, Python, JavaScript, C++, Go, Rust, Kotlin, Swift... 세상에는 수백 가지 프로그래밍 언어가 존재합니다. 하나의 완벽한 언어를 만들면 될 것 같은데, 왜 새 언어가 계속 생기는 걸까요?

[튜터의 가이드 및 해설]

프로그래밍 언어가 많은 이유는 "만능 도구는 없다" 는 원리와 같습니다.

망치는 못을 치는 데 최고지만, 나사를 돌리려면 드라이버가 필요하죠. 프로그래밍 언어도 마찬가지입니다. 각 언어는 특정 분야에서 강점을 갖도록 설계되었습니다.

언어 잘하는 분야 특징
Java 기업 서버, 안드로이드 앱 안정적이고 어디서든 돌아감 (JVM)
Python 데이터 분석, AI, 자동화 문법이 쉽고 빠르게 결과를 볼 수 있음
JavaScript 웹 브라우저, 웹 서버 브라우저에서 바로 실행됨
C 운영체제, 임베디드 하드웨어를 직접 제어할 수 있음
Swift iPhone 앱 Apple 생태계에 최적화

그렇다면 자연어(영어, 한국어)와 비슷한 걸까요?

비슷한 면이 있지만 결정적인 차이가 있습니다. 자연어는 역사·문화·지리적 이유로 자연스럽게 생겼지만, 프로그래밍 언어는 특정 문제를 더 잘 풀기 위해 의도적으로 설계됩니다. "이 분야에서는 기존 언어가 불편하니 새로 만들자!"라는 동기에서 탄생하는 거예요.

🎯 면접관을 홀리는 핵심 멘트

"프로그래밍 언어마다 설계 철학과 강점이 다르기 때문에, '어떤 언어가 최고인가'보다 '이 문제에 어떤 언어가 적합한가'를 판단하는 것이 개발자의 역량이라고 생각합니다. Java를 배우는 이유도 서버 개발 분야에서 Java가 보여주는 안정성과 생태계가 그 문제에 가장 적합하기 때문입니다."


주제 2: "컴파일러가 잡아주는 에러와 못 잡는 에러"

[문제 상황 요약]

세미콜론을 빼면 컴파일러가 즉시 ';' expected 라고 알려줍니다. 그런데 System.out.println("1 + 1 = 3");은 에러 없이 정상 실행됩니다. 결과는 분명 틀렸는데 말이죠. 컴파일러의 검사 범위는 어디까지일까요?

[튜터의 가이드 및 해설]

프로그래밍에서 에러는 크게 두 종류로 나뉩니다.

1. 컴파일 에러 (Compile Error) — 문법이 틀린 에러

세미콜론 빠뜨림, 대소문자 오타, 중괄호 짝 안 맞음 등. 이런 에러는 프로그램이 실행되기 전에 컴파일러가 잡아줍니다. 마치 맞춤법 검사기가 "이 단어 철자가 틀렸어요"라고 알려주는 것과 같아요.

2. 논리 에러 (Logic Error) — 문법은 맞지만 의도가 틀린 에러

"1 + 1 = 3"은 문법적으로 완벽한 문장입니다. 컴파일러는 "큰따옴표 안에 글자가 있고, 세미콜론도 있고, 문제 없다"고 판단합니다. 하지만 사람이 의도한 결과와 다르다는 건 컴파일러가 알 수 없어요.

이건 맞춤법 검사기가 "나는 내년에 과거로 간다"라는 문장에서 맞춤법 오류는 못 찾는 것과 같습니다. 문법은 맞지만 의미가 틀린 거죠.

그래서 테스트가 필요합니다. 컴파일러가 못 잡는 논리 에러를 잡기 위해, 개발자가 직접 "이 입력을 넣으면 이 결과가 나와야 한다"는 테스트 코드를 작성합니다. 이 부분은 훨씬 나중에 배우게 되니, 지금은 "컴파일러에도 한계가 있구나" 정도만 기억해 두세요.

🎯 면접관을 홀리는 핵심 멘트

"컴파일러는 문법(syntax) 오류만 검출하고, 의미(semantic) 오류는 검출하지 못합니다. 그래서 프로그래밍에서는 컴파일 성공이 곧 정확한 동작을 보장하지 않습니다. 이 간극을 메우는 것이 단위 테스트와 코드 리뷰이고, 이것이 소프트웨어 품질을 지키는 핵심 활동이라고 생각합니다."


주제 3: "'어디서든 실행된다'는 약속, 정말 100% 지켜질까?"

[문제 상황 요약]

Java의 슬로건 "Write Once, Run Anywhere"는 JVM 덕분에 같은 코드가 Windows, Mac, Linux에서 모두 돌아간다는 뜻입니다. 하지만 현실에서는 운영체제에 따라 문제가 생기는 경우가 있다고 합니다. 왜 그럴까요?

[튜터의 가이드 및 해설]

WORA는 대부분의 경우 잘 지켜지지만, 100%는 아닙니다. 그 이유를 살펴보면 Java와 JVM의 역할 범위를 더 정확히 이해할 수 있습니다.

1. 파일 경로 차이

Windows는 C:\Users\kim\data.txt처럼 역슬래시(\)를 쓰고, Mac/Linux는 /home/kim/data.txt처럼 슬래시(/)를 씁니다. Java 코드에 경로를 직접 쓰면 운영체제마다 달라질 수 있어요.

2. 줄바꿈 문자 차이

Windows는 줄바꿈에 \r\n 두 글자를 쓰고, Mac/Linux는 \n 한 글자를 씁니다. 파일을 읽고 쓸 때 이 차이가 문제를 일으킬 수 있습니다.

3. 운영체제 고유 기능 사용

Java 코드에서 운영체제의 고유 기능(예: Windows 레지스트리)을 직접 호출하면, 당연히 다른 운영체제에서는 동작하지 않습니다.

핵심은 이것입니다. JVM이 보장하는 건 "Java 언어와 표준 라이브러리의 동작" 입니다. 운영체제 고유의 차이(파일 경로, 줄바꿈 등)까지 100% 숨겨주지는 못합니다. 그래서 실무에서는 File.separator, System.lineSeparator() 같은 운영체제 독립적인 API를 사용해서 이런 차이를 피합니다.

🎯 면접관을 홀리는 핵심 멘트

"WORA는 JVM 위에서 돌아가는 Java 바이트코드의 이식성을 보장하는 것이지, 운영체제 고유 자원(파일 경로, 줄바꿈, 네이티브 라이브러리 등)까지 추상화하는 것은 아닙니다. 실무에서는 java.nio.file.PathSystem.lineSeparator() 같은 플랫폼 독립 API를 사용해서 WORA의 약속을 현실에서 지킬 수 있도록 코드를 작성합니다."