6.1 클래스와 객체

파일 규칙

패키지 네이밍 컨벤션

Java에서는 패키지 이름을 도메인 역순으로 짓는 것이 컨벤션이다.

예: naver.com의 패키지라면 → com.naver

클래스 정의와 사용 예제

파일 구조:

src
 └─ com
     ├─ Dog.java
     └─ DogExample.java

Dog.java

package com;

public class Dog {
    String name;
    int age;
    String breed;

    public void bark() {
        System.out.println(name + "가 멍멍 짖습니다.");
    }

    public void eat(String food) {
        System.out.println(name + "가 " + food + "를 먹습니다.");
    }
}

DogExample.java

package com;

public class DogExample {
    public static void main(String[] args) {
        Dog myDog = new Dog();

        myDog.name = "보리";
        myDog.age = 3;
        myDog.breed = "똥개";

        myDog.bark();
        myDog.eat("고구마");
    }
}

package 문에 대한 이해

폴더는 경로, 클래스는 파일!


6.3 변수의 종류

Java에는 세 종류의 변수가 있다:

변수 종류 설명
클래스 변수 (static) 모든 인스턴스가 공유
인스턴스 변수 각 인스턴스마다 별도로 존재
지역 변수 메서드 내에서만 유효
package com.vari;

public class VariableExamples {
    public static void main(String[] args) {
        System.out.println(VariableTypes.classCount);

        VariableTypes v1 = new VariableTypes();
        v1.instanceName = "첫번째 인스턴스";
        VariableTypes.classCount++;

        v1.method();

        VariableTypes v2 = new VariableTypes();
        v2.instanceName = "두번째 인스턴스";
        VariableTypes.classCount++;

        System.out.println(VariableTypes.classCount);
    }
}

변수별 특징

for문 안에서 선언된 변수를 밖에서 사용할 수 없는 것은 for문이 메서드라서가 아니라, 해당 블록 스코프 내에서만 유효하기 때문이다.


6.3 메서드

메서드는 반환값 유무에 따라 구분된다:

package com.method;

public class Calculator {
    void printMessage(String msg) {
        System.out.println(msg);
    }

    int add(int a, int b) {
        return a + b;
    }

    double divide(int a, int b) {
        if (b == 0) {
            System.out.println("0으로 나눌 수 없습니다.");
            return 0;
        }
        return a / b;
    }
}
package com.method;

public class MethodExample {
    public static void main(String[] args) {
        Calculator calc = new Calculator();

        calc.printMessage("계산 시작");
        calc.add(1, 2);  // 반환값 무시 가능
        int result = calc.add(1, 2);

        System.out.println(result);
    }
}

반환값 처리 규칙


6.4 오버로딩 (Overloading)

같은 이름의 메서드를 매개변수만 다르게 여러 개 정의하는 것.

오버라이딩(Overriding)과 혼동 주의!


6.5 this 키워드와 생성자

생성자 오버로딩 예제:

package com.thisthat;

public class Person {
    String name;
    int age;

    Person() {
        name = "";
        age = 0;
        System.out.println("기본 생성자 호출");
    }

    Person(String name) {
        this.name = name;
        this.age = 0;
        System.out.println("이름 생성자 호출");
    }

    Person(int age) {
        this.name = "";
        this.age = age;
        System.out.println("나이 생성자 호출");
    }

    Person(int age, String name) {
        this.name = name;
        this.age = age;
        System.out.println("이름, 나이 생성자 호출");
    }
}
package com.thisthat;

public class ConstructorExample {
    public static void main(String[] args) {
        Person p1 = new Person();
        Person p2 = new Person("seowoo");
        Person p3 = new Person(31);
        Person p4 = new Person(5, "duri");
    }
}

Java는 매개변수의 순서가 중요하다. 타입 힌팅을 해도 순서가 맞지 않으면 에러가 발생한다.


6.5 실습: 도서 관리 시스템

요구사항:

Book.java

package com.books;

public class Book {
    String title;
    String author;
    int price;
    int quantity;

    Book(String title, String author, int price, int quantity) {
        this.title = title;
        this.author = author;
        this.price = price;
        this.quantity = quantity;
    }

    void sale() {
        this.price *= 0.9;
        System.out.println(this.title + "의 가격이 " + this.price + "로 할인되었습니다.");
    }
}

BookstoreExample.java

package com.books;

public class BookstoreExample {
    public static void main(String[] args) {
        Book[] books = new Book[3];

        books[0] = new Book("폭풍의 언덕", "에밀리 브론테", 10000, 10);
        books[1] = new Book("1984", "조지 오웰", 12000, 5);
        books[2] = new Book("데미안", "헤르만 헤세", 9000, 8);

        // 목록 조회
        for (int i = 0; i < books.length; i++) {
            System.out.println(books[i].title + " - " + books[i].author);
        }

        books[0].sale();
        System.out.print(books[0].price);
    }
}

객체로 구성된 배열(Book[] books)을 만들면 객체들을 리스트처럼 관리할 수 있다.