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
반응형