객체배열 -- 메서드 -- 메모리 (자판기프로그램)

stan·2023년 5월 13일
0

Java 개념

목록 보기
18/33

※ main()에서 객체의 멤버변수에 직접적으로 접근 하지 않는다

자판기

package class01;

import java.util.Scanner;

class Product{
	// 1. 멤버변수
	int num; // PK
	String name;
	int cnt;
	int price;
	// 3. 생성자
	Product(int num,String name,int price){
		this.num=num;
		this.name=name;
		this.cnt=5; // 재고의 디폴트값은 5
		this.price=price;
		System.out.println(this.name+" 생성완료!");
	}
	// 2. 메서드
	//  1) 기능파악
	// : 사용자가 3개구매할건데, 구매가능?
	// : 가능하다면 재고 마이너스
	// : 총 가격안내
	// : 불가능하다면 구매실패
	//  2) 메서드 시그니처 파악
	// : INPUT -> int 구매할상품의개수
	// : OUTPUT -> int 총가격, boolean
	//          => int 총가격(구매실패시 0원)
	//  3) 기능구현
	int sell(int cnt) {
		int sum=0;
		if(this.cnt>=cnt) {
			this.cnt-=cnt;
			sum=cnt*this.price;
			System.out.println("총 금액은 "+sum+"원 입니다.");
		}
		else {
			System.out.println(this.name+" 재고가 부족합니다.");
		}
		return sum;
	}
	// 1) 관리자가 ㅁㅁㅁ원으로 가격을 변경
	//    변경되었습니다!
	// 2) INPUT -> int 가격
	//    OUTPUT -> void
	// 3) 
	void setPrice(int price) { // 멤버변수(인스턴스변수)의 값을 새로 정의하는 것 == setter
		this.price=price;
		System.out.println(this.name+" 가격변경완료!");
	}
	void printInfo() {
		System.out.println(this.name+" ["+this.cnt+"] "+this.price+"원");
	}
}
public class Test01 {
	public static void main(String[] args) {
		// ※ main()에서 객체의 멤버변수에 직접적으로 접근 xxxxx

		Product[] data=new Product[3];
		// 현재 상품배열 data[]에 저장된 상품의 개수는 0개!
		// data[]의 크기 == 3
		int index=0; // 상품배열에 저장되어있는 상품의 개수

		Scanner sc=new Scanner(System.in);
		while(true) {
			System.out.println("=== 자판기 ===");
			System.out.println("1. 메뉴추가");
			System.out.println("2. 메뉴출력");
			System.out.println("3. 메뉴구매");
			System.out.println("4. 가격변경");
			System.out.println("5. 프로그램종료");
			System.out.println("===============");
			System.out.print("입력) ");
			int action=sc.nextInt();

			if(action==5) {
				System.out.println("프로그램종료...");
				break;
			}
			else if(action==1) { // C
				// 상품 객체를 생성해서,
				System.out.println("생성할 상품의 이름입력");
				System.out.print("입력) ");
				String name=sc.next();
				System.out.println("생성할 상품의 가격입력");
				System.out.print("입력) ");
				int price=sc.nextInt();
				
				// 상품 객체 배열에 저장해줘~
				data[index++]=new Product(index,name,price);
			}
			else if(action==2) { // R
				// 상품배열에 저장되어있는 상품만큼 화면에 출력해줘~
				for(int i=0;i<index;i++) { // 상품배열에 저장되어있는 상품의 개수
					///// System.out.println((i+1)+". "+data[i].name+" ["+data[i].cnt+"] "+data[i].price+"원");
					///// 안정성(보안)의 문제로, 이렇게 코딩 xxxxx
					System.out.print((i+1)+". ");
					data[i].printInfo();
				}
			}
			else if(action==3) { // U
				// 사용자가 구매할상품번호입력
				// 해당상품구매를 진행
				System.out.println("구매할 상품의 번호입력");
				System.out.print("입력) ");
				int num=sc.nextInt();
				System.out.println("구매할 상품의 개수입력");
				System.out.print("입력) ");
				int cnt=sc.nextInt();
				data[num-1].sell(cnt);
			}
			else if(action==4) { // U
				System.out.println("가격변경할 상품의 번호입력");
				System.out.print("입력) ");
				int num=sc.nextInt();
				System.out.println("상품의 가격입력");
				System.out.print("입력) ");
				int price=sc.nextInt();
				data[num-1].setPrice(price);
			}
			else { // 유효성 검사(사용자의 입력값 검사)
				System.out.println("잘못된 번호입니다! 확인후 다시이용해주세요!");
			}
		}
	}
}

생성자

	Student1(int num, String name, int score) {
		this.num = num;
		this.name = name;
		this.score = score;
		System.out.println(num + "번 " + name + "학생이 저장되었습니다!");
	}

메서드

	// 학생 목록 출력 메서드
	void printList() {
		System.out.println("=== 학생부 목록 ===");
		System.out.println(" | "+num+"번 학생 "+ this.name + " [" + this.score + "점]");
		System.out.println("==============");
	}
	// 학생 점수 변경
	void setScore(int score) {
		this.score = score;
		System.out.println( this.name + " 학생의 점수가 " + this.score + "점으로 업데이트 되었습니다!\n");
	}

메인

// 학생 배열 객체에 저장
data[index++] = new Student1(index, name, score);
break;
}

객체배열은 new 연산자를 쓰기 때문에 heap 메모리에 주소값으로 기억이 되고
각 생성자(함수) 메서드 에서도 주소값으로 heap 메모리에 접근해 기억 할 수 있다

profile
이진 입니다

0개의 댓글

관련 채용 정보