객체(OOP) 예제로 이해하기

최병현·2025년 12월 17일

java

목록 보기
9/38
post-thumbnail

오늘은 자바에서 가장 헷갈린다는 객체(Object) 개념을 직접 예제를 만들면서 정리했다. 배열, 메소드, 매개변수, 반환값이 한 줄에 섞이니 벽처럼 느껴졌지만, 하나씩 분해해서 보니 흐름이 보이기 시작했다. 앞전에 했던건데도 어렵게 느껴진다. 반복 훈련만이 답인거 같다.


1. 객체란 무엇인가

객체는 값(상태) + 기능(메소드)을 하나로 묶은 것이다. Branch 객체는 지점 하나를 의미하고, 각 지점은 자신만의 상태를 가진다.

  • total : 전체 세탁기 수
  • used : 현재 사용 중인 세탁기 수
  • password : 사용자가 입력한 비밀번호

2. 객체 배열의 의미

다음 코드는 Branch 객체 3개를 관리하기 위한 배열이다.

중요한 점은 배열에는 객체만 들어가고, 실제 값들은 객체 안에 들어간다는 것이다.


3. 메소드 호출과 매개변수 전달

사용자가 입력한 비밀번호는 main 메소드에서 입력받고, 그 값은 메소드 호출 시 매개변수로 전달된다.

main에서의 pw와 startWash 안의 pw는 이름만 같을 뿐 서로 다른 변수이며, 값만 복사되어 전달된다.


4. startWash 메소드의 역할

startWash 메소드는 지점에 세탁기가 남아 있는지 확인하고, 가능하면 상태를 변경한 뒤 성공 여부를 반환한다.

  • 세탁기 있으면 → 비밀번호 저장 + used 증가 → true 반환
  • 세탁기 없으면 → 아무 것도 안 함 → false 반환

main에서는 내부 상태를 직접 건드리지 않고, 반환값(boolean)만 받아서 흐름을 제어한다.


5. 오늘 느낀 점

객체는 이해하려고 들면 더 헷갈리고, 직접 여러 번 써보면서 익숙해지는 게 답이라는 걸 느꼈다. 벽이 느껴졌다는 건 오히려 제대로 배우고 있다는 신호라고 생각한다.

내일은 객체 단독 연습부터 다시 차근차근 뚜드려볼 예정이다.

6. 실습 코드

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() + "대");
                }
            }
        }
    }
}
profile
Develop

0개의 댓글