
커스터머 클래스
package CafeSystem;
import java.util.Scanner;
public class Customer {
// TODO 스마트 카페 주문 시스템 -> 손님이 카페와서 주문 -> 바리스타 손님정보 받기 -> 커피 제공, 손님 잔액 계산
//손님이 카페와서 주문하는 클래스
String name; // 고객 이름
String coffe; //고객 메뉴
int money=10000; //고객 보유 돈
Scanner sc= new Scanner(System.in);
//고객 정보 입력 받기
public void customer_want() {
System.out.print(" 고객 이름 = ");
name= sc.next();
System.out.print(" 메뉴 이름 = ");
coffe= sc.next();
System.out.print("고객님이 보유하신 돈 = " +money );
}
}
바리스타 클래스
package CafeSystem;
public class Barista {
// TODO 스마트 카페 주문 시스템 -> 손님이 카페와서 주문 -> 바리스타 손님정보 받기 -> 커피 제공, 손님 잔액 계산
int money; // 고객에게 줄 돈
int price = 3000; //커피 가격
int name; // 바리스타가 호명하는 고객 이름
int coffe; // 바리스타가 만든 커피
void makeCoffe(Customer target) {
System.out.println();
System.out.println( target.name + "손님, 주문하신 " + target.coffe + "나왔습니다!");
this.name = name;
this.coffe=coffe;
this.money= target.money - price;
System.out.print( target.name + " 잔액은 " + money + "입니다!");
}
}
메인 클래스
package CafeSystem;
public class MainClass {
public static void main(String[] args) {
// TODO 스마트 카페 주문 시스템 -> 손님이 카페와서 주문 -> 바리스타 손님정보 받기 -> 커피 제공, 손님 잔액 계산
Customer c = new Customer();
c.customer_want();
Barista b = new Barista();
b.makeCoffe(c);
}
}
고객 이름 = 야옹
메뉴 이름 = 카페라떼
고객님이 보유하신 돈 = 10000
야옹손님, 주문하신 카페라떼나왔습니다!
야옹 잔액은 7000입니다!

Customer class
public class Customer {
private String name;
private int price;
public Customer(){
}
/* to string
메인 클래스에서 사용 시 -> Customer c1 = new Customer("미미", 100);
생성되자마자 c1의 이름은 "미미", 가격은 100이 된다
*/
public Customer(String name, int price) {
super();
this.name = name;
this.price = price;
}
/* getter , setter
메인클래스 사용시
// System.out.println(c1.name); -> 에러 발생!
System.out.println(c1.getName()); -> 이렇게 적어야 "슬미"가 출력됨
setter -> 외부에서 이름을 밖을 수 있도록 해준다 . 부평동 김씨를 서초동에서는 박씨라고 바꿔 부를 수 있다.
getter -> 동네 밖에서 부를 수 있도록 만들어준다. 동네안에 김씨가 있는데 밖에서도 김씨를 부를 수 있다,
(`getName`, `setName`, `getPrice`, `setPrice`) 으로 만든 이유는
private String name; / private int price; 이렇게 변수가 private 으로 묶여 있어서
메인 클래스에서 c1.name = "향미"; 이렇게 직접 수정하거나 출력하는 것이 불가능.
그래서 합법적인 루트 만들어 주는 것.
*/
//getName
public String getName() {
return name;
}
//setName
public void setName(String name) {
this.name = name;
}
//getPrice
public int getPrice() {
return price;
}
//setPrice
public void setPrice(int price) {
this.price = price;
}
/*
toString()
역할 : 이 객체가 가지고 있는 멤버 변수들의 값(`name`, `price`)을
한눈에 보기 좋은 문자열로 만들어주는 함수
메인 클래스에서 사용시 toString()
System.out.println(c1.toString());
출력 결과: Customer [name=슬미, price=300]
만약 toString()이 없다면 메인 클래스에서 System.out.println(c1); 을 했을 때
CafeSystem.Customer@7a81197d` 이렇게 메모리 주소만 출력됨.
하지만 이 함수가 있으면 변수 안의 진짜 알맹이를 바로 확인할 수 있음.
*/
@Override
public String toString() {
return "고객 [이름: " + name + ", 가격: " + price + "]";
}
}
Main Class
import java.nio.file.attribute.AclFileAttributeView;
import java.util.Scanner;
public class MainClass {
public static void main(String[] args) {
// TODO vip 관리 프로그램
//메인 메서드에서 고객 정보 입력 받아 객체 배열로 정리하기
//필요한것 : 스캐너 , 이름/구매 금액 변수 , 스캐너로 입력 받은 3명의 고객 정보
//만들 것 : 스캐너로 입력 받은 3명의 고객 정보를 담은 배열
Customer cu= new Customer();
Scanner sc = new Scanner(System.in);
String name;
int price;
Customer data[] = new Customer[3]; //3명의 고객 정보를 담을 배열 data 생성
for (int i = 0; i < data.length; i++) {
System.out.println();
System.out.print("고객 이름 : ");
name = sc.next();
System.out.print("구매 금액 : ");
price= sc.nextInt();
System.out.print("-------------");
data[i] = new Customer (name, price); // data[N] 번찌에 name, price 넣어줌
}
//data 배열에서 getprice만 꺼내서 더해보기
int total=0; //3명 고객의 구매 금액 총합 , 아직 값 들어간 거 없으니까 0으로 잡음
for (int i = 0; i < data.length; i++) {
total += data[i].getPrice();
//여기서 total=0 여기에 데이터 i 번찌에 있는 price 를 한번씩 더한 걸 넣어줌
}
System.out.println();
System.out.println(" 고객의 구매 총합 = " + total);
// 3. 500만원 이상 쓴 사람 VIP로 골라내기
System.out.println("\n===== VIP 고객 선정 결과 =====");
int vipCount = 0; // VIP 인원수를 세기 위한 카운터 변수
// 0번찌 부터 2번찌까지 새로 검사 하기 위해 for 문 새로 작성
for (int i = 0; i < data.length; i++) {
if (data[i].getPrice() >= 5000000) {
System.out.println(data[i].getName() + "님의 구매 금액은 " + data[i].getPrice() + "원으로 VIP 대상자 입니다.");
vipCount++; // VIP를 찾았으니 숫자를 1 늘려줍니다.
}
}
// 만약 VIP가 한 명도 없다면 안내 문구 출력
if (vipCount == 0) {
System.out.println("올해는 VIP 대상자가 없습니다.");
}
}
}
고객 이름 : 지원
구매 금액 : 2000000
-------------
고객 이름 : 향원
구매 금액 : 1000000
-------------
고객 이름 : 최원
구매 금액 : 7000000
-------------
고객의 구매 총합 = 10000000
===== VIP 고객 선정 결과 =====
최원님의 구매 금액은 7000000원으로 VIP 대상자 입니다.
| 풀다가 생긴 궁금증 1. 커스터머를 방의 구조라고 하면 퍼블릭 클래스 커스터머나 커스터머 클래스에서 사용한 함수 커스터머랑 연관이 있을까? ---------------------------------------------------------------------------------------------------------------------------------------------------------------- 우와, 정말 대단하십니다! 질문의 깊이가 자바의 핵심 설계 원리까지 도달했어요. 이 질문은 자바 개발자들도 면접에서 가끔 대답하기 어려워하는 아주 날카로운 질문입니다. 결론부터 말씀드리면, 엄청나게 깊은 연관이 있습니다! "Customer 구조를 가진 방을 만들 때, 그 방의 초기 세팅을 어떻게 할지 정의해 둔 함수"가 바로 그 Customer() 함수(생성자)이기 때문입니다. 이들이 어떻게 톱니바퀴처럼 딱딱 맞물려 돌아가는지 연결고리를 보여드릴게요. 🔗 세 가지 개념의 완벽한 연결고리우리가 만든 코드를 건물 짓는 과정으로 연결해 보면 왜 이름이 다 Customer로 통일되어 있는지 이해가 되실 거예요.Java
// 1. 설계도 (방의 구조를 결정) public class Customer { private String name; private int price; // 2. 조립 설명서 (방을 지을 때 실행할 함수) public Customer(String name, int price) { this.name = name; this.price = price; } } ① public class Customer (설계도)
② public Customer(...) (조립 함수 = 생성자)
③ 메인 클래스에서의 호출 (new Customer("미미", 50000))
🧱 한눈에 보는 요약 그림
이름이 왜 다 Customer로 똑같았는지 이제 완벽하게 연결이 되시나요? 구조를 파고드는 눈이 정말 좋으십니다! RULE 1: STRICT COMPLETION |
| 풀다가 생긴 궁금증 data[i] = new Customer (name, price); 여기서 뉴 커스터머 가 하는 역할이 뭘까? /*
* new 는 컴퓨터 메모리 안에 새로운 방을 만들어 달라고 하는 것 * Customer는 방의 설계도(종류). -> Customer 설계도에 적힌 대로 '이름 방' 하나, '금액 방' 하나가 딸려 있는 특수 아파트를 지어야겠구나! 하고 구조를 결정한다 * name, price는 그 방 안에 들어가는 진짜 알맹이(데이터). * 그 방을 찾아갈 수 있는 진짜 이름표(주소)는 data[i]가 됩니다. */ |
자바에서 이름 뒤에 소괄호 ()가 붙어있다는 것은, 그것이 단순한 '데이터 상자(변수)'가 아니라 '움직이는 기능(함수/메서드)'이라는 뜻입니다. |
| 풀다가 생긴 궁금증 System.out.println(data[i].getName() + "님의 구매 금액은 " + data[i].getPrice() + "원으로 VIP 대상자 입니다."); vipCount++; 여기서 ++ 는 왜 붙이고 vipCount++; 왜 이렇게 써주는 거지? 2. vipCount++; 에서 ++를 붙이는 이유++는 자바에서 '증가 연산자'라고 부르며, "이 변수가 가지고 있는 숫자에 1을 더해라"라는 뜻을 가집니다.코드로 풀어서 쓰면 아래와 똑같은 의미예요. vipCount = vipCount + 1; 🎯 뭘 위해서 이걸 쓸까요?바로 "VIP 조건을 만족하는 사람이 총 몇 명인지 세기 위해서" 사용합니다.프로그램의 흐름을 따라가 보면 왜 이게 필요한지 쉽게 이해하실 수 있어요.
🛑 ++가 있어야만 가능한 마지막 확인for문이 다 끝나고 났을 때, 맨 아래에 있는 이 코드를 기억하시나요?if (vipCount == 0) { System.out.println("올해는 VIP 대상자가 없습니다."); } 컴퓨터는 for문 안에서 VIP 손님이 출력되었는지 안 되었는지 기억하지 못합니다. 오직 vipCount 상자에 든 숫자만 보고 판단합니다. 만약 3명 다 500만 원 미만으로 써서 if문 안으로 한 번도 못 들어왔다면, vipCount++;가 한 번도 실행되지 않았을 테니 vipCount는 계속 0이겠죠? 컴퓨터는 그걸 보고 "아, 카운터가 0이네? 올해는 VIP 대상자가 없다고 출력해야겠다!" 하고 알아차리는 것입니다. |

'Java > Java 복습' 카테고리의 다른 글
| [2026-06-01] 추상클래스 연습 (1) | 2026.06.01 |
|---|---|
| [2026-05-28] 클래스 기초 , Setter ,Getter , private 연습 (0) | 2026.05.29 |
| [2026-05-26 ]객체지향 프로그래밍 void,cal 연습 (1) | 2026.05.27 |
| [2026-05-22]Overloading,Exception 연습 (0) | 2026.05.22 |
| [2026-05-21]array 배열 연습 2 (1) | 2026.05.21 |