[til_211123][java] 메시지패싱
용이 성을 공격하는 메시지패싱
class Castle {
private int strength;
void set_st (int st) {
if (st<0) {
System.out.println("음수는 입력제한");
}
else {
strength = st;
}
}
void show() {
System.out.println("성의 내구력은"+strength);
}
void destroy (int att) {
strength -= att;
if (strength < 0) {
System.out.println("성이 무너진다 ~");
}
}
}
class Dragon {
private int power;
void set_po(int po) {
power = po;
}
void show() {
System.out.println("용의 화력은"+power);
}
void fire(Castle ca) { // 메시지패싱 1) 상대 객체를 인자로 전달
ca.destroy(power); // 2) 상대의 메소드 호출
}
}
public class Main {
public static void main (String args[]) {
Castle North = new Castle();
North.set_st(10);
North.show();
Dragon Blue = new Dragon();
Blue.set_po(5);
Blue.show();
//용이 성을 공격한다.
Blue.fire(North);
North.show();
Blue.fire(North);
North.show();
Blue.fire(North);
North.show();
}
}
>>
성의 내구력은10
용의 화력은5
성의 내구력은5
성의 내구력은0
성이 무너진다 ~
성의 내구력은-5
✔ 메시지패싱의 두 단계:
1) 상대 객체를 인자로 전달
2) 상대 메소드 호출
✔ 캡슐화: 외부로부터의 접근, 임의 변경 등의 위험으로부터 보호하기 위해 차단..
by 클래스를 만드는 것 자체가 캡슐화 과정. 객체(=클래스의 모양대로 만들어진 실체)의 멤버들 (메소드와 필드) 를 외부에서 직접 접근하지 못하도록
접근지정자 private을 이용.
객체 외부에서 비공개 멤버 (private 멤버) 접근하려면 공개된 메소드를 통해 접근.
여기서 공개된 메소드를 getter, setter 라 함. setter라는 공개 메소드를 통해 비공개 field값을 설정할 수 있음. (ex. North.set_st(10))
의의는, 이렇게 함으로써 사용자가 음수를 입력하는 등 범위 밖의 것을 임의로 입력하는 것을 막을 수 있다는 것. (ex. if문으로 음수 입력시 "음수는 입력제한")
♧ 여기서 잠깐 !
클래스를 새로운 파일로 만들 때 Package: 에 입력을 하지 않으면 default로 같은 패키지에 생성된다. (만약 무언갈 입력하면 그 입력한 값을 이름으로 하는 새로운 패키지에 저장이 됨.)
이 때 modifiers 선택시에는 public으로 하면 맨 첫줄에 public class ~가 되고 package로 선택하면 맨 첫줄에 class ~가 된다. public이면 다른 패키지에서도, 그러니까 어디서나 접근이 가능하고 package이면 같은 패키지 안에서만 접근이 가능.
자동차가 주유소로부터 주유하는 메시지패싱.
<< 내 답안 >>
class Car{
private int gas;
void set_gas (int g) {
gas = g;
}
void show() {
System.out.println("현재 주유량: "+gas+"l");
}
void fill_gas(int g, GasStation G) {
boolean b = G.extract(g);
if (b==true) {
gas += g;
}
}
}
class GasStation{
private int gas;
void set_gas (int g) {
gas = g;
}
void show() {
System.out.println("현재 재고량: "+gas+"l");
}
boolean extract(int g) {
if (gas-g<0) {
System.out.println("주유실패");
return false;
}
else {
gas -= g;
return true;
}
}
}
public class Main {
public static void main (String args[]) {
System.out.println("자동차와 주유소");
Car SM5 = new Car();
GasStation GS = new GasStation();
SM5.set_gas(10);
GS.set_gas(500);
SM5.show();
GS.show();
SM5.fill_gas(50,GS);
SM5.show();
GS.show();
SM5.fill_gas(460, GS);
}
}
모범답안도 내 것과 유사하니 생략. (boolean 대신 임의의 int값 리턴하여 매치시킨 차이.)