JAVA/기본 이론

JAVA | 접근 제어자(Access Modifier)

로아다 2023. 3. 29. 17:17
728x90
반응형
접근 제어자 (Access Modifier)

- 다른 클래스에서 해당 자원을 사용하려고 허용 범위를 설정한다.

- 같은 패키지의 다른 클래스가 접근할

- 다른 패키지의 다른 클래스가 접근할

 

  • 종류

- public : 다른 패키지의 다른 클래스에서도 해당 자원에 자유롭게 접근할 있다.

- protected : 다른 패키지의 다른 클래스에서 해당 자원에 접근하려면 상속을 받아야 한다.

- default : (접근 제어자 미설정) 다른 패키지에서는 접근할 수 없다.

- private : 같은 패키지의 다른 클래스에서도 접근할 없다. (현재 클래스에서만 사용할 수 있는 자원이 된다.)

 

  • 용도

- 내가 만든 클래스를 가져다 쓰는 사람이 public 접근 제어자를 지닌 자원에만 접근하는 것을 원하기 때문이다.

- 클래스 내부의 모든 리소스에 접근 권한을 주게 되면 설계 의도대로 사용하지 않을 가능성이 있기 때문에 접근을 제한한다.

 

 

 

  • 같은 패키지에 있을 때
public class C11_ModifierTest {
	public static String s1 = "ABC";
	protected static String s2 = "ABC";
	static String s3 = "ABC";
	private static String s4 = "ABC";
	
	public int i1 = 10; // public
	protected int i2 = 20; // protected
	int i3 = 30; // default
	private int i4 = 40; // private
	
	public static int m11() {
		return 10;
	}
	
	protected static int m12() {
		return 10;
	}
	
	static int m13() {
		return 10;
	}
	
	private static int m14() {
		return 10;
	}
	
	public int m1() {
		return 10;
	}
	
	protected double m2() {
		return 1.1;
	}
	
	boolean m3() {
	     return true;
	}
	
	private int[] m4() {
		return new int[10];
	}
}

 

  • 다른 패키지에 있을 때
package myobj;

public class C11_ModifierTest {
	public static String s1 = "ABC";
	protected static String s2 = "ABC";
	static String s3 = "ABC";
	private static String s4 = "ABC";
	
	public int i1 = 10; // public
	protected int i2 = 20; // protected
	int i3 = 30; // default
	private int i4 = 40; // private
	
	public static int m11() {
		return 10;
	}
	
	protected static int m12() {
		return 10;
	}
	
	static int m13() {
		return 10;
	}
	
	private static int m14() {
		return 10;
	}
	
	public int m1() {
		return 10;
	}
	
	protected double m2() {
		return 1.1;
	}
	
	boolean m3() {
		return true;
	}
	
	private int[] m4() {
		return new int[10];
	}
}

 

public class C11_AccessModifier extends myobj.C11_ModifierTest {
        
        public static void main(String[] args) {
        
                // 같은 패키지의 다른 클래스에서 사용할 수 있는 자원은
                // public, protected, default이다.
                C11_ModifierTest.m11();
                C11_ModifierTest.m12();
                C11_ModifierTest.m13();
                
                C11_ModifierTest instance = new C11_ModifierTest();
                
                instance.m1();
                instance.m2();
                instance.m3();
                
                // 다른 패키지의 다른 클래스에서 사용할 수 있는 자원은
                // public 밖에 없지만
                // 상속을 받으면 추가로 protected까지 사용할 수 있게 된다.
                // main method는 static method이기 때문에 static 자원만 사용할 수 있다.
                myobj.C11_ModifierTest.m11();
                myobj.C11_ModifierTest.m12();
                myobj.C11_ModifierTest.m11();
                
                myobj.C11_ModifierTest instance2 = new myobj.C11_ModifierTest();
                
                instance2.m1();
        }
        
        // protected가 붙은 자원은 다른 패키지에서 상속을 받으면 사용할 수 있다.
        public C11_AccessModifier() {
                System.out.println("public value: " + super.i1);
                System.out.println("protected value: " + super.i2);
        }
}

 

 

Quiz

돌림판을 돌려서 경품을 추첨하는 프로그램을 만들어 보세요

 

(1) 각 경품들은 한정된 수량이 있으며 이는 경품마다 다를 수 있다.

 

(2) 각 경품들이 나올 수 있는 확률이 모두 다르며 수량이 모두 소진된 상품은 당첨될 수 없다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Answer
package myobj;

public class PotterWheel {

	Prize[] prizes;
	Prize[] box;

	public PotterWheel() {
		prizes = new Prize[5];

		prizes[0] = new Prize("노트북", 300, 5, 0.001);
		prizes[1] = new Prize("태블릿", 100, 10, 0.002);
		prizes[2] = new Prize("로봇 청소기", 20, 30, 0.01);
		prizes[3] = new Prize("샤프", 0, 300, 0.1);
		prizes[4] = new Prize("물휴지", 0, 1000, 0.3);
		
		updateBox();
	}

	public Prize wheel() {
		Prize prize = box[(int)(Math.random() * box.length)];
		if (prize != null) {

			if (prize.qty == 0) {
				return null;
			} else {
				--prize.qty;
			}
		}

		return prize;
	}

	/** 상품 항목 배열에 새 상품 추가하기 */
	public void addPrize(Prize prize) {
		int len = prizes.length;

		// 새 배열의 크기를 1개 증가시킨다.
		Prize[] n_prizes = new Prize[len + 1];

		// 기존 배열 값을 새 배열로 옮긴다.
		for (int i = 0; i < prizes.length; ++i) {
			n_prizes[i] = prizes[i];
		}

		// 맨 마지막 칸에 새 상품을 추가한다.
		n_prizes[len] = prize;

		// 방금 새로 만든 배열이 상품 배열이 된다.
		prizes = n_prizes;
		
		// 상품 종류가 변경되었으니 박스를 새로 만들어야 한다.
		updateBox();
	}
	
	// 외부에서 박스 업데이트를 신경 쓸 필요 없으므로 안보이게 설정한다.
	private void updateBox() {
		box = new Prize[1000];

		int index = 0;

		// 등록된 상품의 종류만큼 반복
		for (int i = 0; i < prizes.length; ++i) {

			// 확률대로 box에 개수를 채워놓는다.
			int num = (int)(prizes[i].rate * 1000);

			for (int j = 0; j < num; ++j) {
				box[index++] = prizes[i];
			}
		}
	}
}
package myobj;

public class Prize {
	String name;
	int price;
	int qty;
	double rate;
	
	public Prize(String name, int price, int qty, double rate) {
		this.name = name;
		this.price = price;
		this.qty = qty;
		this.rate = rate;
	}
	
	@Override
	public String toString() {
		// String.format() : 서식을 이용해 원하는 문자열을 만든다.
		// out.printf() : 서식을 이용해 원하는 문자열을 콘솔에 출력한다.
		return String.format("[%s/%d/%.3f]", name, qty, rate);
	}
	
	public int getQty() {
		return qty;
	}
}
package answer;

import myobj.PotterWheel;

public class C11_PotterWheel {
	/*
		# 돌림판을 돌려서 경품을 추첨하는 프로그램을 만들어 보세요
	
		(1) 각 경품들은 한정된 수량이 있으며 이는 경품마다 다를 수 있다.
	
		(2) 각 경품들이 나올 수 있는 확률이 모두 다르며
			수량이 모두 소진된 상품은 당첨될 수 없다.
	 */
	public static void main(String[] args) {
		PotterWheel potterWheel = new PotterWheel();
		
		potterWheel.addPrize(new myobj.Prize("초코파이", 0, 1000, 0.053));
		
		int count = 0;
		while (true) {
			// 같은 패키지에 같은 이름의 클래스가 존재하는 경우 import를 사용할 수 없다.
			// 이럴 때는 패키지명을 제대로 명시해 두 클래스를 구분해야 한다.
			myobj.Prize prize = potterWheel.wheel();
			
			System.out.printf("%d번째: %s\n", count++, prize);
			if (prize != null && prize.getQty() == 0) {
				break;
			}
		}
	}
}
728x90
반응형