Java - 객체배열

kojam9041·2022년 3월 20일
0

KH정보교육원 - JAVA

목록 보기
9/12

객체 vs 객체배열


package com.kh.chap01_oneVsmany.model.vo;

public class Book {
//	필드부
// 	도서명, 저자명, 출판사명, 가격
	private String title;
	private String author;
	private String publisher;
	private int price;
	
//	생성자부
//	기본 생성자
	public Book() {}
//	모든 필드를 매개변수로 갖는 생성자
//	객체 생성과 동시에 모든 필드의 값을, 
//	내가 원하는 값으로 초기화하기 위해서 작성.
	public Book(String title, String author ,String publisher, int price) {
		this.title = title;
		this.author = author;
		this.publisher=publisher;
		this.price = price;
	}
//	메소드부
	public void setTitle(String title) {
		this.title = title;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public void setPublisher(String publisher) {
		this.publisher = publisher;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	public String getTitle() {
		return title;
	}
	public String getAuthor() {
		return author;
	}
	public String getPublisher() {
		return publisher;
	}
	public int getPrice() {
		return price;
	}
	public String information() {
		return "title : "+title+", author : "+author+
        ", publisher : "+publisher + ", price: "+price;
	}
}

1. 객체 사용

package com.kh.chap01_oneVsmany.run;
import java.util.Scanner;
import com.kh.chap01_oneVsmany.model.vo.Book;

public class ObjectRun {

	public static void main(String[] args) {
		/*
		//1. 기본생성자를 통해 객체를 생성 + setter메소드로 값을 필드에 대입
		Book bk1 = new Book();	// JVM이 초기값으로 세팅
		bk1.setTitle("자바칩의 정석");
		bk1.setAuthor("김자바칩");
		bk1.setPublisher("KH정보교육원");
		bk1.setPrice(20000);
		
		//2. 매개변수 생성자를 이용하여 생성과 동시에 원하는 값으로 초기화.
		Book bk2 = new Book("C언어의 정석","나씨씨","씨언어출판사",20000);

		//3. 사용자가 입력한 값들로 객체를 생성
		Scanner sc = new Scanner(System.in);
		System.out.print("제목 : ");
		String title = sc.nextLine();
		System.out.print("저자 : ");
		String author = sc.nextLine();
		System.out.print("출판사 : ");
		String publisher = sc.nextLine();
		System.out.print("가격 : ");
		int price = sc.nextInt();
		sc.nextLine();
		
		Book bk3 = new Book(title, author, publisher, price);
		System.out.println(bk3.information()); 
		*/
        
		// 이 시점에서 책 3권이 완성됨.
		
		/*
		 * 세 개의 Book 객체가 필요하다는 가정 하에
		 * 각 Book 객체를 따로 관리 하고자 한다면?
		 * 단, 사용자에게 입력받은 값들로, 책의 정보를 채워 넣기!(Scanner를 이용)
		 */
		
//		Book 객체를 생성하기 전에, 일단 선언만 하고 임시로 null로 채워줌.
		Book bk1;
		Book bk2;        
		Book bk3;      
        Book bk1 = null;
		Book bk2 = null;
		Book bk3 = null;
//		Stack영역에 bk1, bk2, bk3의 빈공간이 생김.
//		이 공간은 나중에 할당(heap)이 되면 주소값이 담김.

		System.out.println(bk1);
        System.out.println(bk2);
        System.out.println(bk3);
		// stack영역에 선언만 한 상태이기 때문에
		// 값이 null이 뜸.
		
		Scanner sc = new Scanner(System.in);
		for(int i=0; i<3; i++) { // i=0,1,2
			System.out.print("제목 : ");
			String title = sc.nextLine();
			System.out.print("저자명 : ");
			String author = sc.nextLine();
			System.out.print("출판사 : ");
			String publisher = sc.nextLine();
			System.out.print("가격 : ");
			int price = sc.nextInt();
			sc.nextLine();
// 			Heap영역에 실제값을 넣고, Stack의 bk1,bk2,bk3에 주소값을 담음.
			if(i==0) {
				bk1 = new Book(title, author, publisher, price);
			}else if(i==1) {
				bk2 = new Book(title, author, publisher, price);
			}else {
				bk3 = new Book(title, author, publisher, price);
			}
//			객체(참조형 변수) : 서로 다른 자료형의 값을 넣을 수 있음.(1차원 배열과 비슷)
//			 stack				heap
//			bk1(0123)	-> 	0123 (title, author, publisher, price)	
//			bk2(1234)	->	1234 (title, author, publisher, price)
//			bk3(2345)	->	2345 (title, author, publisher, price)
//						    .getXXX
//							.information
		}
//		출력시에는 반복문 사용 불가 (bki로 못함)
//		출력을 하면 잘 입력된 것을 볼 수 있음.
		System.out.println(bk1.information());
		System.out.println(bk2.information());
		System.out.println(bk3.information());
//		여태까지는 책의 정보를 추가해주는 행위를 한 것!(추가기능)
		
//	    각 전체 도서들의 제목과 일일이 비교하여 일치하는 도서의 가격을 알려줌.(검색기능) 
		System.out.print("검색할 책 제목 : ");
		String searchTitle = sc.nextLine();
		
		if(searchTitle.equals(bk1.getTitle())) {
			System.out.println(bk1.getPrice());
		}
		if(searchTitle.equals(bk2.getTitle())) {
			System.out.println(bk2.getPrice());
		}
		if(searchTitle.equals(bk3.getTitle())) {
			System.out.println(bk3.getPrice());
		}
//		해당하는 검색이 있으면 가격을 출력, 없으면 빈칸이 출력됨.(정상작동)
//		단, 코드 작성시, 반복문을 활용하지 못하여 제한이 있음.
		
	}
}

2. 객체배열 사용

package com.kh.chap01_oneVsmany.run;

import java.util.Scanner;

import com.kh.chap01_oneVsmany.model.vo.Book;

// 객체 배열을 이용한 버전
public class ObjectArrayRun {

	public static void main(String[] args) {
//		객체 배열
//		클래스명[] 객체명 = new 생성자명[배열크기];
		Book[] books = new Book[3];
//		1. Book[] books로 Stack영역에 books라는 공간이 생김
//		2. new Book[3]에 의해 Heap영역에 3칸짜리 빈 공간이 생김.
//		=> 다만, Heap영역에는 빈공간을 허용하지 않아, 기본값인 null로 초기화함.
//		Book bk1 = null;
//		Book bk2 = null;
//		Book bk3 = null;
		
//		stack			    heap	
//		0123		-> 		null  
//		books				null      
//							null      
//							books[i] 0123
		
		Scanner sc = new Scanner(System.in);
		for(int i=0; i<books.length; i++) {
			System.out.print("제목 : ");
			String title = sc.nextLine();
			System.out.print("저자 : ");
			String author = sc.nextLine();
			System.out.print("출판사 : ");
			String publisher = sc.nextLine();
			System.out.print("가격 : ");
			int price = sc.nextInt();
			sc.nextLine();
				books[i] = new Book(title,author,publisher,price);
//				객체배열인 books[0]번째 방에 객체를 하나 만들어서, 매개변수의 값으로 채워줌.
//				객체배열인 books[1]번째 방에 객체를 하나 만들어서, 매개변수의 값으로 채워줌.
//				객체배열인 books[2]번째 방에 객체를 하나 만들어서, 매개변수의 값으로 채워줌.
//				stack			    heap	
//				0123		-> 		1234  	      ->    1234 book객체
//				books				2345       			2345 book객체
//									3456       			3456 book객체	       
//									books[i] 0123   	new Book()
//									
//				책 추가 완료 시점.
		}							
//		출력
		for(int i=0; i<books.length;i++) {
			System.out.println(books[i].information());
		}
//		전체 책 조회 기능이 완료된 시점
		
//		검색기능
		System.out.print("책제목 : ");
		String searchTitle = sc.nextLine();
		for(int i=0; i<books.length;i++) {
			if(searchTitle.equals(books[i].getTitle())) {
				System.out.println(books[i].getPrice());
				// getter메소드,information을 통해 books[i]의 생성자 값을 확인함.
				// 캡슐화로 인해 직접접근이 불가함.
			}
		}
	}
}

객체배열 응용

package com.kh.chap02_objectArray.model.vo;
// 클래스(VO:Value Object)
public class Phone {
//	필드부(멤버변수, 인스턴스변수)
//	이름, 시리즈, 브랜드명, 가격
	private String name;
	private String series;
	private String brand;
	private int price;
	
//	생성자부
//	기본생성자
	public Phone() {}
//	매개변수 생성자
//	메소드 이름이 같음 + 매개변수가 다름 : 오버로딩
	public Phone(String name, String series, String brand, int price) {
		this.name = name;
		this.series = series;
		this.brand = brand;
		this.price = price;
	}
	
//	메소드부
//	setter
	public void setName(String name) {
		this.name = name;
	}
	public void setSeries(String series) {
		this.series = series;
	}
	public void setBrand(String brand) {
		this.brand = brand;
	}
	public void setPrice(int price) {
		this.price = price;
	}
//	getter
	public String getName() {
		return name;
	}
	public String getSeries() {
		return series;
	}
	public String getBrand() {
		return brand;
	}
	public int getPrice() {
		return price;
	}
//	information
	public String information() {
		return "name : "+name + ", series : "+series + ", brand : "+brand + ", price : "+price;
	}
}

package com.kh.chap02_objectArray.run;
import com.kh.chap02_objectArray.model.vo.Phone;

public class ObjectArrayRun {

	public static void main(String[] args) {
		
//		1. 객체 배열 만들기 : 객체를 담을 수 있는 배열을 생성
//		- 선언과 동시에 할당
//		자료형[] 객체명 = new 자료형[크기]
		Phone[] arr = new Phone[3]; // 객체배열
//		배열 사용 준비 완료.
		/*
		System.out.println(arr);	// 주소값
		System.out.println(arr[0]); // null
        System.out.println(arr.length);	// 3
		*/
        
		Phone p1 = new Phone(); // 객체
//		stack           heap
//		0123			null
//		p1				0123
		
		arr[0] = p1;
//      arr[0] = new Phone();  
//		얕은 복사
//		
//		stack			heap 
//		1111			arr[0]
//		arr		---->   2222	
//						 ↓
//						 ↓
//		2222             ↓ 
//		p1       --->   2222
		
		System.out.println(p1);
//		같은 주소값이 담김
		
		p1 = null;
//      arr[0] = null;  
		System.out.println(p1);
//		System.out.println(arr[0]);
//		System.out.println(p1.information)을 하면 nullpointException이 뜸.
//		다만, p1이 null로 출력되는 것은, 아직 GC가 p1이라는 객체를 정리하지 않아서임.

		
//		arr[0]이 의미하는 것 : phone 객체 1개
		arr[0].setName("갤럭시");
		arr[0].setBrand("삼성");
		arr[0].setPrice(1000000)
		System.out.println(arr[0].information());

		arr[1] = new Phone("아이폰","11pro","애플",1000000);
		System.out.println(arr[1]); // 주소값
		System.out.println(arr[1].information()); // 내용물이 나옴.
		
		System.out.println("---- 총 마무리 ----");
		
		for(int i=0; i<arr.length; i++) {
			System.out.println(arr[i]); // 주소값
		}
        
		for(int i=0; i<arr.length; i++) {
			System.out.println(arr[i].information()); // 실제값.
		}
        
//		향상된 for문
		for(Phone p : list) {
			System.out.println(p.information());
		}
//		stack				  heap 	
//		0123	->		1234   ->   name : 갤럭시, series : null, brand : 삼성, price : 1000000
//		arr				2345	    name : 아이폰, series : 11pro, brand : 애플, price : 1000000
//						arr[i]	   .information
//		                0123       .getXXX
//									new Phone()
//									매개변수 생성자가 값으로 들어감.
//
//		for(int i=0; i<arr.length; i++) {
//			System.out.println(arr[i].information()); // 내용물
//		}
//		위에서는 arr[0], arr[1]에 대해서만 객체를 생성하고 값을 대입했음.
//		따라서, arr[2]를 호출하면 nullPointException이 뜸.
//		이에, arr[2]를 객체로 생성해주면, arr[2]로부터 값을 호출할 수 있어
//		nullpointError가 뜨지 않음.
//		
	}
}

package com.kh.chap02_objectArray.run;
import java.util.Scanner;
import com.kh.chap02_objectArray.model.vo.Phone;

public class PhoneRun {

	public static void main(String[] args) {
		System.out.println("-----당신 휴대폰 -----");
//		휴대폰을 몇개 쌓아두고 팔것인지? 최대 보관할 수 있는 재고의 수 : 100
		Phone[] arr = new Phone[100];
//		매개변수 생성자를 이용하여, 휴대폰을 만들어서 배열에 담는 과정을 한큐에 해결함.
		arr[0] = new Phone("갤럭시 s","10","삼성",1200000); // 1대 재고 완성 
		arr[1] = new Phone("아이폰","11","애플",1300000);
		arr[2] = new Phone("갤럭시노트","10","삼성",1500000);
		arr[3] = new Phone("갤럭시 z플립","1","삼성",1500000);
		arr[4] = new Phone("미노트","10","샤오미",550000);
		arr[5] = new Phone("아이폰","8","애플",800000);
		arr[6] = new Phone("아이폰","XR","애플",1000000);
//		우리가 보유한 휴대폰은 총 7대 / 100대까지 보관 가능
		System.out.println("구매 가능한 휴대폰 목록");
		
//		휴대폰이 null이 아닌 경우에만 목록이 조회되도록 조치함.
//		if(arr[i].getName() != null)
//		[오류메세지]
//		nullPointException
//		arr[7]이후 주소값이 존재하지않는데, getName()으로 참조하려고 해서 생김.
//		[해결법]
//		arr[i]에 들어있는 것이 null인 경우에는 break를
//		null이 아닐 경우에는 값을 출력하도록 하겠다.
		for(int i=0; i<arr.length; i++) {
			if(arr[i] != null) {
				System.out.println(arr[i].information());
			}else {
				continue;
			}
		}
		System.out.println("--------------------------------------------------");
		System.out.print("구매하고 싶은 기기명을 입력하시오. : ");
		Scanner sc = new Scanner(System.in);
		String searchName = sc.nextLine();
		System.out.print("기기의 시리즈를 입력하세요 : ");
		String searchSeries = sc.nextLine();
//		일치하는 정보의 개수를 변수로
		int count = 0;
//		몇번째 방의 휴대폰을 골랐는지 담아둘 변수를 세팅
		int pick = 0;
		for(int i=0; i<arr.length; i++) {
//			이 상황에서 아까처럼 nullPointException이 발생 가능함.
//			=> 애초에 비교를 하기 전, 한번 더 비교하면 됨.
//			=> arr[i]자체가 null인지 아닌지를 판별하고 들어가면 됨.
			if(arr[i] == null) {
				continue;
			}else {
//				현재, 상점에 존재하는 기기명과 시리즈를 같이 입력함.
				if(arr[i].getName().equals(searchName)&& 
						arr[i].getSeries().equals(searchSeries)) {
						System.out.println("기기정보");
						System.out.println(arr[i].information());
						count++; 
						pick = i;
						break;
				}
			}
		}
		
//		count값이 1이면? 찾는 정보와 일치할 때
//		이렇게 하면 총 검색결과 값을 알 수 있게 됨.
//		count값이 0이면? 찾는 정보가 없을 때.
		if(count == 0) {
			System.out.println("현재 찾으시는 재고가 없어요 ㅠ");
		}else {
			System.out.print("정말 구매하시겠습니까?(Y,N)");
			char answer = sc.nextLine().charAt(0);
			
			if(answer == 'Y') {
				System.out.println("지불할 가격은 "+arr[pick].getPrice()+"원 입니다.");
//				판매가 완료되면, 휴대폰의 정보를 지워주면 됨.=> 해당 배열 방의 값에 null을 넣어 처리함.
				arr[pick] = null;
			}else {
				System.out.println("안녕히 가세요.");
			}
		}
	}
}

0개의 댓글