오늘은 자바에서 가장 헷갈린다는 객체(Object) 개념을 직접 예제를 만들면서 정리했다. 배열, 메소드, 매개변수, 반환값이 한 줄에 섞이니 벽처럼 느껴졌지만, 하나씩 분해해서 보니 흐름이 보이기 시작했다. 앞전에 했던건데도 어렵게 느껴진다. 반복 훈련만이 답인거 같다.
객체는 값(상태) + 기능(메소드)을 하나로 묶은 것이다. Branch 객체는 지점 하나를 의미하고, 각 지점은 자신만의 상태를 가진다.
다음 코드는 Branch 객체 3개를 관리하기 위한 배열이다.
중요한 점은 배열에는 객체만 들어가고, 실제 값들은 객체 안에 들어간다는 것이다.
사용자가 입력한 비밀번호는 main 메소드에서 입력받고, 그 값은 메소드 호출 시 매개변수로 전달된다.
main에서의 pw와 startWash 안의 pw는 이름만 같을 뿐 서로 다른 변수이며, 값만 복사되어 전달된다.
startWash 메소드는 지점에 세탁기가 남아 있는지 확인하고, 가능하면 상태를 변경한 뒤 성공 여부를 반환한다.
main에서는 내부 상태를 직접 건드리지 않고, 반환값(boolean)만 받아서 흐름을 제어한다.
객체는 이해하려고 들면 더 헷갈리고, 직접 여러 번 써보면서 익숙해지는 게 답이라는 걸 느꼈다. 벽이 느껴졌다는 건 오히려 제대로 배우고 있다는 신호라고 생각한다.
내일은 객체 단독 연습부터 다시 차근차근 뚜드려볼 예정이다.
Branch 클래스는 지점(세탁소 한 곳)을 객체로 표현한 클래스다.
각 Branch 객체는 자기 지점의 세탁기 상태를 스스로 관리한다.
이 클래스의 핵심 역할은
① 세탁기 총 개수와 사용 중 개수를 기억하고
② 세탁 시작 요청이 오면 가능 여부를 판단한 뒤
③ 성공/실패 결과를 boolean 값으로 돌려주는 것이다.
class Branch {
// 지점에 있는 전체 세탁기 수
int total = 6;
// 현재 사용 중인 세탁기 수
int used = 0;
// 최근 세탁을 시작한 사용자의 비밀번호
// 객체 생성 시에는 값이 없으므로 null 상태
String password;
// 세탁 시작 메소드
// pw : main에서 입력받아 전달된 비밀번호
boolean startWash(String pw) {
// 사용 중인 세탁기 수가 전체 수 이상이면
// 더 이상 세탁 불가능
if (used >= total) {
return false; // 세탁 시작 실패
}
// 세탁이 가능하면
// 전달받은 비밀번호를 객체 필드에 저장
password = pw;
// 사용 중인 세탁기 수 1 증가
used++;
// 세탁 시작 성공
return true;
}
// 남은 세탁기 개수를 반환하는 메소드
int getRemain() {
// 전체 세탁기 수 - 사용 중인 세탁기 수
return total - used;
}
}
CoinWashMain 클래스는 세탁소 콘솔 프로그램의 실행 메인 로직이다.
사용자 입력을 받아 지점을 선택하고, 세탁 시작 / 조회 / 종료 흐름을 제어한다.
이 클래스의 역할은 입력 처리와 흐름 제어이며,
실제 상태 변경(used 증가, 비밀번호 저장 등)은 Branch 객체가 담당한다.
import java.util.Scanner;
public class CoinWashMain {
public static void main(String[] args) {
// 사용자 입력을 받기 위한 Scanner
Scanner scan = new Scanner(System.in);
// 3개의 지점을 관리하기 위한 Branch 객체 배열 생성
Branch[] branches = new Branch[3];
// 각 배열 칸에 Branch 객체 생성 후 저장
for (int i = 0; i < branches.length; i++) {
branches[i] = new Branch();
}
// 프로그램 종료 전까지 계속 반복
while (true) {
// 메인 메뉴 출력
System.out.println("환영합니다. coinWash입니다.");
System.out.println("1. 1호점 - 금정 2. 2호점 - 동래 3. 3호점 - 서면 4. 조회 5. 종료");
System.out.print("입력: ");
// 사용자 메뉴 선택 입력
int branch = scan.nextInt();
// 종료 선택 시 프로그램 종료
if (branch == 5) {
System.out.println("이용해주셔서 감사합니다.");
break;
}
// 잘못된 메뉴 입력 처리
if (branch < 1 || branch > 4) {
System.out.println("잘못된 입력입니다.");
continue;
}
// 1 ~ 3번 지점 선택 (세탁 시작)
if (branch >= 1 && branch <= 3) {
// 메뉴 번호를 배열 인덱스로 변환
int index = branch - 1;
// 이미 세탁기가 가득 찬 경우
if (branches[index].used >= branches[index].total) {
System.out.println(branch + "호점 빈 세탁기가 없습니다.");
continue;
}
// 사용자 정보 입력
System.out.print("무게(kg): ");
String weight = scan.next();
System.out.print("연락처(마지막 4자리): ");
String phone = scan.next();
System.out.print("비밀번호(4자리): ");
String pw = scan.next();
// 세탁 시작 시도 (성공/실패 여부 반환)
boolean ok = branches[index].startWash(pw);
// startWash에서 실패한 경우
if (!ok) {
System.out.println(branch + "호점 빈 세탁기가 없습니다.");
continue;
}
// 세탁 시작 성공
System.out.println("세탁을 시작합니다.\n");
continue;
}
// 4번 조회 메뉴 선택
if (branch == 4) {
// 조회용 비밀번호 입력
System.out.print("비밀번호(4자리): ");
String inputPw = scan.next();
// 일치하는 지점을 찾기 위한 변수
int foundIndex = -1;
// 모든 지점을 순회하며 비밀번호 비교
for (int i = 0; i < branches.length; i++) {
if (branches[i].matchPassword(inputPw)) {
foundIndex = i;
break;
}
}
// 일치하는 지점이 없는 경우
if (foundIndex == -1) {
System.out.println("일치하는 정보가 없습니다.");
}
// 일치하는 지점이 있는 경우
else {
System.out.println((foundIndex + 1) + "호점 남은 세탁기: "
+ branches[foundIndex].getRemain() + "대");
}
}
}
}
}