## ☕ 자바, 질문하며 배우기

학생이 LLM에게 먼저 묻고 → 코드로 확인하고 → 선생님이 정리합니다.
중·고등 · 구글 미트 · 파이썬보다 문법은 엄격, OOP에 더 충실한 언어

## 이 수업은 이렇게 진행돼요

🤖

### STEP 1. 질문

교안 질문을 챗봇에 복사해 물어봅니다.

💻

### STEP 2. 실행

이클립스·인텔리제이 또는 OnlineGDB에서 실행합니다.

👩‍🏫

### STEP 3. 리뷰

화상 수업에서 핵심·오개념을 함께 정리합니다.

학습 설계
· 앞: 문법·제어·배열 (기초)
· 중간: 클래스·상속 (OOP 핵심)
· 뒤: 예외·컬렉션·스레드·람다·JVM (고급 리마인드)
⚠️ AI는 틀린 코드를 자신 있게 줄 수 있습니다. 반드시 컴파일·실행으로 확인하세요. 자바는 타입·세미콜론 오류가 흔합니다.

## 전체 커리큘럼

장 | 주제 | 비고
--- | --- | ---
1 | 자바 소개 · 문법 · 제어 · 배열 | 기초
2 | 클래스 기초 (인스턴스·생성자·static) | OOP 입문
3 | 상속 · 접근제어 · 추상·인터페이스 | OOP 심화
4 | 예외 · 컬렉션 · 스레드 · 람다 · JVM | 고급
5 | 자기주도 프로젝트 | 종합

## 1장. 자바 소개

파이썬보다 문법이 엄격합니다. public class · main · 세미콜론을 몸에 익히세요.

### 1-1. 자바?

🤖 AI에게 물어보자

    자바가 어떤 언어인지, 파이썬·C와 비교해 특징을 설명해줘. Write Once Run Anywhere와 JVM이 무엇인지 초보자용으로 알려줘.

#### 특징

- 객체지향
- 플랫폼 독립 (JVM)
- 강한 타입 · 보안·성능

#### 만들 수 있는 것

- 백엔드 · 안드로이드
- GUI · 기업 시스템

👩‍🏫 선생님 리뷰

1. 소스(.java) → javac → 바이트코드(.class) → JVM이 실행
2. 파이썬과 달리 타입을 명시하고, 문장 끝에 ; 가 필요합니다

### 1-2. 개발환경

🤖 AI에게 물어보자

    JDK와 JRE 차이, 이클립스 또는 인텔리제이에서 Java 프로젝트 만들고 main 메서드 실행하는 방법을 단계별로 알려줘.

학습 권장: JDK 11 또는 17 LTS. 온라인만 쓰려면 OnlineGDB / OneCompiler Java 모드를 사용하세요.

### 1-3. 입력과 출력

🤖 AI에게 물어보자

    자바에서 System.out.println 사용법과 Scanner로 콘솔 입력 받는 예제(이름·나이)를 보여줘. next()와 nextLine() 차이도 설명해줘.

#### 출력 · main

    public class Hello {
        public static void main(String[] args) {
            System.out.println("Hello, Java");
        }
    }

#### Scanner 입력

    import java.util.Scanner;

    public class InputEx {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            System.out.print("이름: ");
            String name = sc.nextLine();
            System.out.print("나이: ");
            int age = sc.nextInt();
            System.out.println(name + " / " + age);
            sc.close();
        }
    }

👩‍🏫 선생님 리뷰

1. 실행 진입점은 반드시 `public static void main(String[] args)`
2. next()는 토큰(어절), nextLine()은 한 줄 전체
3. Scanner 사용 후 close() 습관

### 1-4. 문자열 · 이스케이프 · printf

🤖 AI에게 물어보자

    자바 이스케이프 문자(\n \t \\)와 String.format / System.out.printf 의 %s %d %f 사용 예제를 보여줘.

    System.out.println("줄\n바꿈\t탭");
    System.out.printf("나는 %d시 %s에 간다.%n", 9, "학교");
    String s = String.format("원주율 ≈ %.2f", 3.141592);
    System.out.println(s);

기초 지금은 printf/% 포맷. 문자열 연결은 + , 나중에는 StringBuilder도 등장합니다.

### 1-5. 주석 · 변수 · 상수

    // 한 줄 주석
    /* 여러 줄 주석 */
    int score = 100;          // 변수
    final int MAX = 100;      // 상수 (재할당 불가)
    // MAX = 200; // 컴파일 오류

### 1-6. 자료형

🤖 AI에게 물어보자

    자바 기본 타입(byte short int long float double char boolean)과 참조 타입 차이를 표로 정리해줘. int와 Integer 차이도 알려줘.

👩‍🏫 선생님 리뷰

1. 기본 타입은 스택에 값, 참조 타입은 힙의 객체를 가리킵니다
2. 컬렉션에는 기본 타입 대신 Integer 등 래퍼 사용

### 1-7. 연산자

    int a = 10, b = 3;
    System.out.println(a / b);   // 3 (정수 나눗셈)
    System.out.println(a % b);   // 1
    System.out.println(a == b);  // false
    System.out.println(a > 5 && b < 5);

### 1-8. 반복과 조건

🤖 AI에게 물어보자

    자바 if-else, switch, for, while, break/continue 예제를 각각 짧게 보여줘.

    int score = 85;
    if (score >= 90) {
        System.out.println("A");
    } else if (score >= 80) {
        System.out.println("B");
    } else {
        System.out.println("C");
    }

    for (int i = 0; i < 5; i++) {
        if (i == 2) continue;
        System.out.print(i + " ");
    }

### 1-9. 실습 — 구구단

🤖 AI에게 물어보자

    자바로 2~9단 구구단을 이중 for문으로 출력하는 코드를 짜줘. 단마다 줄바꿈해줘.

미션: AI 코드를 본 뒤, 5단만 출력하도록 직접 수정해 보세요.

### 1-10. 메서드와 변수 스코프

🤖 AI에게 물어보자

    자바에서 메서드 정의·호출, 매개변수·반환타입, 지역변수 스코프를 예제로 설명해줘.

    public class MethodEx {
        static int add(int x, int y) {
            return x + y;
        }
        public static void main(String[] args) {
            System.out.println(add(3, 5));
        }
    }

### 1-11. 재귀함수 조금 어려움

🤖 AI에게 물어보자

    자바 재귀로 팩토리얼과 피보나치를 구현해줘. 재귀의 종료 조건이 왜 필요한지 설명해줘.

### 1-12. 배열

    int[] arr = {10, 20, 30};
    System.out.println(arr[0]);
    System.out.println(arr.length);
    for (int n : arr) {
        System.out.println(n);
    }

👩‍🏫 선생님 리뷰

1. 배열 길이는 고정. 가변 길이는 나중에 ArrayList (4장)
2. 인덱스 범위 밖이면 ArrayIndexOutOfBoundsException

### 1-13. 실습 — 최대·최소

🤖 AI에게 물어보자

    int 배열에서 최댓값과 최솟값을 찾아 출력하는 자바 코드를 짜줘. for문만 사용하고 정렬 메서드는 쓰지 마.

## 2장. 클래스 기초

클래스 = 설계도, 인스턴스 = 객체. OOP의 출발점입니다.

### 2-1. 클래스와 인스턴스

🤖 AI에게 물어보자

    자바 클래스와 인스턴스 차이를 비유로 설명해줘. name, age 필드와 introduce 메서드를 가진 Person 클래스 예제를 보여줘.

    public class Person {
        String name;
        int age;
        void introduce() {
            System.out.println("나는 " + name + ", " + age + "살");
        }
        public static void main(String[] args) {
            Person p1 = new Person();
            p1.name = "철수";
            p1.age = 17;
            p1.introduce();
        }
    }

### 2-2. 패키지와 classpath

🤖 AI에게 물어보자

    자바 package와 import가 무엇인지, 왜 패키지를 쓰는지 초보자용으로 설명해줘.

### 2-3. 생성자

    public class Person {
        String name;
        int age;
        Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    }

👩‍🏫 선생님 리뷰

1. 생성자 이름은 클래스와 동일, 반환 타입 없음
2. this는 이 객체 자신

### 2-4. static

🤖 AI에게 물어보자

    자바 static 변수·메서드가 무엇인지, 인스턴스 멤버와 차이를 예제로 설명해줘. main이 static인 이유도 알려줘.

### 2-5. 자주 쓰는 기본 클래스

String, Math, Arrays 등. AI에게 “자바 String 주요 메서드 10개 예시”를 물어보세요.

    String s = "Hello";
    System.out.println(s.length());
    System.out.println(s.toUpperCase());
    System.out.println(Math.max(3, 7));

## 3장. 클래스 응용

### 3-1. 상속

🤖 AI에게 물어보자

    자바 extends 상속 예제(Animal, Dog)와 super() 사용법을 보여줘.

    class Animal {
        void speak() { System.out.println("..."); }
    }
    class Dog extends Animal {
        @Override
        void speak() { System.out.println("멍멍"); }
    }

### 3-2. 접근 제어자

public · protected · (default) · private — AI에게 표로 정리해 달라고 하세요.

### 3-3. 오버로딩 · 오버라이딩

🤖 AI에게 물어보자

    자바 메서드 오버로딩과 오버라이딩 차이를 예제 코드로 비교해줘.

### 3-4. 추상 클래스 · 인터페이스 고급

🤖 AI에게 물어보자

    자바 abstract class와 interface 차이, 언제 무엇을 쓰는지 초보자용으로 설명해줘. 짧은 예제도 보여줘.

### 3-5. Call by Value

자바는 기본 타입이든 참조든 ‘값 복사’로 전달합니다. 참조 타입은 주소 값이 복사되어 객체 내용 변경은 공유될 수 있습니다. AI에게 그림으로 설명해 달라고 하세요.

## 4장. 고급 표현

앞 장 문법 위에 실무에서 자주 쓰는 도구들입니다.

### 4-1. 예외 처리

    try {
        int n = Integer.parseInt("abc");
    } catch (NumberFormatException e) {
        System.out.println("숫자 형식 오류");
    } finally {
        System.out.println("항상 실행");
    }

### 4-2. 제네릭 · 열거형 고급

🤖 AI에게 물어보자

    자바 ArrayList<String> 처럼 제네릭을 쓰는 이유와 enum 간단한 예제를 알려줘.

### 4-3. 컬렉션 (List, Set, Map) 고급

    import java.util.*;

    List<String> list = new ArrayList<>();
    list.add("A");
    Set<Integer> set = new HashSet<>();
    set.add(1);
    Map<String, Integer> map = new HashMap<>();
    map.put("age", 17);

배열(1장) → 가변 리스트·맵(여기서). “같은 기능, 더 실무적인 표현”입니다.

### 4-4. 파일 입출력

🤖 AI에게 물어보자

    자바에서 텍스트 파일을 읽고 쓰는 예제(Files 또는 FileWriter/BufferedReader)를 try-with-resources로 보여줘.

### 4-5. 스레드 고급

🤖 AI에게 물어보자

    자바 Thread 상속과 Runnable 구현으로 스레드 만드는 예제를 보여줘. 왜 동시성에서 동기화가 필요한지 한 문단으로 설명해줘.

### 4-6. 람다 · 스트림 고급

for문(1장)으로 하던 필터·변환을 짧게 쓰는 방법입니다.

    import java.util.*;
    import java.util.stream.*;

    List<String> names = Arrays.asList("yuki", "raison", "koya", "cat");
    long c = names.stream().filter(x -> x.contains("a")).count();
    System.out.println(c);

### 4-7. 어노테이션

@Override, @Deprecated 등. 프레임워크(Spring)에서 매우 많이 씁니다. AI에게 자주 쓰는 어노테이션 5개를 물어보세요.

### 4-8. JVM 개념 고급

🤖 AI에게 물어보자

    JVM이 무엇인지, .java가 실행되기까지의 과정(컴파일·클래스 로더·실행 엔진·힙/스택)을 초보자가 이해할 수 있게 단계로 설명해줘.

👩‍🏫 선생님 리뷰

1. javac로 바이트코드 → JVM이 OS 위에서 실행
2. Heap에 객체, Stack에 메서드 호출·지역변수
3. GC가 쓰지 않는 객체를 회수

## 5장. 자기주도 프로젝트

1

### 질문 설계

목표·입출력·예외를 구체적으로

2

### 실행 검증

컴파일 오류를 직접 읽고 고치기

3

### 설명

선생님에게 내 말로 구조 설명

#### 주제 예시

- 캐릭터·몬스터 텍스트 게임 (클래스 + 파일에서 능력치 로드)
- 간단한 회원 관리 (List/Map)
- 구구단·성적 통계 콘솔 프로그램

마무리: AI가 틀린 부분 1가지를 골라 왜 틀렸는지 설명해 보세요.