Java 객체지향 프로그래밍 기초
6.1 클래스와 객체
파일 규칙
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 문에 대한 이해
package문은 “나는 이 폴더에 있다”는 선언- 같은 패키지에 있으면
import없이 사용 가능 package를 선언하지 않으면 default package로 취급됨package com.Dog;처럼 쓰면 에러 → 패키지는 폴더 경로이지 클래스 이름이 아님!
폴더는 경로, 클래스는 파일!
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 메서드
메서드는 반환값 유무에 따라 구분된다:
- 반환값 없는 메서드:
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);
}
}
반환값 처리 규칙
- 반환값이 있건 없건, 반환값을 변수에 담지 않는 것은 문제없음
- 에러 케이스:
- 반환값이 없는데 변수에 담으려는 경우
- 반환 타입과 다른 타입의 변수에 담으려는 경우
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)을 만들면 객체들을 리스트처럼 관리할 수 있다.