대학교

자바 - (8) 패키지와 접근 제한자

매 석 2023. 11. 21. 21:33
반응형

패키지

위와 같이 클래스 작성 시에 해당 클래스가 어떤 패키지에 속할 것인지 선언해준다.

만약 사용하고자 하는 클래스 또는 인터페이스가 다른 패키지에 소속된 경우는 import를 사용한다.

 

접근 제한자

클래스와 인터페이스 및 이들이 가진 멤버의 접근 제한을 말한다.

  1. public : 외부 클래스가 자유롭게 사용할 수 있다.
  2. protected : 같은 패키지 또는 자식 클래스에서 사용할 수 있다.
  3. private : 외부에서 사용할 수 없다.
  4. default : 같은 패키지에 소속된 클래스에서만 사용 가능하다.

즉 1>2>4>3 순으로 접근 제한이 강화된다.

출처 : 혼자 공부하는 자바

클래스에는 보통 private을 설정하지 않고,

그 안의 생성자와 필드 등에 사용하여 외부에서 접근할 때

임의로 값을 수정하지 못하게 할 수 있다.

출처 : 혼자 공부하는 자바

 

 

Getter, Setter

Setter는 외부의 값을 받아 필드의 값을 변경하는 것이 목적이다.

출처 : 혼자 공부하는 자바

Getter의 경우 외부로 필드값을 전달하는 것이 목적이다.

private로 설정되어있는 경우 등에 사용할 수 있다.

출처 : 혼자 공부하는 자바

 

실습 문제

조건 :

(1) CoffeeShop 클래스는 현재 디렉토리 하의 coffeeShop 패키지에, CoffeeList 와 Coffee 클래스는 coffee 패키지에 작성합니다.

(2) 디폴트 클래스 Coffee는 String name과 int price 필드를 private으로 갖습니다. 생성자 는 Coffee(String name, int price)입니다. 필드 변수들에 대한 Getter 메소드들을 갖습니다.

(3) public 클래스 CoffeeList 는 Coffee 배열 coffees를 private 필드로 갖습니다. 생성자 CoffeeList()는 coffees 에 초기배열로 아메리카노 5000원과 카페라떼 8000원을 지정합니다. 배열 크기는 2가 됩니다.

(4) run() 메소드를 호출하면, 명령을 입력 받아 주문이면 order() 메소드를, 입력이면 coffeeAdd() 메소드를, 출력이면 showList() 메소드를 실행하여 아래 출력예와 같이 실행되도 록 합니다. 커피를 추가하면 배열의 크기가 하나 증가하도록 새로 동적할당을 합니다. 커피 주문은 출력시 커피명 앞의 번호를 기준으로 0이 입력될 때까지 반복해서 주문을 받습니다.

(5) 출력 예: 커피숍을 오픈합니다.

명령: 1=주문 2=입력 3=출력 4=종료>> 3

1: 커피명=아메리카노, 가격=5000원

2: 커피명=카페라떼, 가격=8000원

명령: 1=주문 2=입력 3=출력 4=종료>> 2

커피명 가격>> 에스프레소 3000

명령: 1=주문 2=입력 3=출력 4=종료>> 3

1: 커피명=아메리카노, 가격=5000원

2: 커피명=카페라떼, 가격=8000원

3: 커피명=에스프레소, 가격=3000원

명령: 1=주문 2=입력 3=출력 4=종료>> 1

커피(번호) 갯수 (종료=0)>> 1 2

아메리카노 2잔 가격=10000 입니다.

커피(번호) 갯수 (종료=0)>> 2 1

카페라떼 1잔 가격=8000 입니다.

커피(번호) 갯수 (종료=0)>> 3 2

에스프레소 2잔 가격=6000 입니다.

커피(번호) 갯수 (종료=0)>> 0

총 주문액은 24000원 입니다.

명령: 1=주문 2=입력 3=출력 4=종료>> 4

커피숍을 종료합니다.

Coffee.java

package coffee;

class Coffee {
	private String name;
	private int price;
	
	Coffee(String name, int price){
		this.name = name;
		this.price = price;
	}
	String getName() {
		return this.name;
	}
	int getPrice() {
		return this.price;
	}
}

 

CoffeeList.java

package coffee;
import java.util.Scanner;

public class CoffeeList {

	private Coffee[] coffees;
	
	public CoffeeList(){
		coffees = new Coffee[2];
		coffees[0] = new Coffee("아메리카노",5000);
		coffees[1] = new Coffee("카페라떼",8000);
	}
	
	public void run() {
		System.out.println("커피숍을 오픈합니다.");
		Scanner s = new Scanner(System.in);
		while(true) {
			System.out.print("명령: 1=주문 2=입력 3=출력 4=종료>> ");
			int sel = s.nextInt();
			if(sel==1) {
				order();
			}
			else if(sel==2) {
				coffeeAdd();
			}
			else if(sel==3) {
				showList();
			}
			else if(sel==4) {
				System.out.println("커피숍을 종료합니다.");
				break;
			}
		}
	}
	void order() {
		Scanner s = new Scanner(System.in);
		int sum=0;
		while(true) {
			System.out.print("커피(번호) 갯수 (종료=0)>> ");
			int Name = s.nextInt();
			if(Name==0) {
				break;
			}
			int num = s.nextInt();
			String coffeeName = coffees[Name-1].getName();
			int price = coffees[Name-1].getPrice()*num;
			sum+=price;
			System.out.printf("%s %d잔 가격=%d 입니다.\n",coffeeName,num,price);
		}
		System.out.println("총 주문액은 "+sum+"원 입니다.");
	}
	void coffeeAdd() {
		Scanner s = new Scanner(System.in);
		Coffee[] tmp = new Coffee[coffees.length];
		System.out.print("커피명 가격>> ");
		String name = s.next();
		int price = s.nextInt();
		for(int i=0;i<coffees.length;i++) {
			tmp[i] = coffees[i];
		}
		
		coffees = new Coffee[tmp.length+1];
		for(int i=0;i<tmp.length;i++) {
			coffees[i] = tmp[i];
		}
		coffees[tmp.length] = new Coffee(name,price);
		
	}
	void showList() {
		for(int i=0;i<coffees.length;i++) {
			String name = coffees[i].getName();
			int price = coffees[i].getPrice();
			System.out.printf("%d: 커피명=%s, 가격=%d원\n", i+1,name,price);
		}
	}
}

 

 

CoffeeShop.java

package coffeeShop;
import coffee.*;
public class CoffeeShop {

	public static void main(String[] args) {
		CoffeeList c = new CoffeeList();
		c.run();
	}

}