public 클래스는 파일당 1개만 가능하며, 파일명과 동일해야 함private 클래스는 같은 파일에 여러 개 존재할 수 있음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 문은 “나는 이 폴더에 있다”는 선언import 없이 사용 가능package를 선언하지 않으면 default package로 취급됨package com.Dog;처럼 쓰면 에러 → 패키지는 폴더 경로이지 클래스 이름이 아님!폴더는 경로, 클래스는 파일!
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문이 메서드라서가 아니라, 해당 블록 스코프 내에서만 유효하기 때문이다.
메서드는 반환값 유무에 따라 구분된다:
void 사용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);
}
}
같은 이름의 메서드를 매개변수만 다르게 여러 개 정의하는 것.
오버라이딩(Overriding)과 혼동 주의!
생성자 오버로딩 예제:
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는 매개변수의 순서가 중요하다. 타입 힌팅을 해도 순서가 맞지 않으면 에러가 발생한다.
요구사항:
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)을 만들면 객체들을 리스트처럼 관리할 수 있다.