JAVA

[til_211123][java] 메시지패싱

yuull 2021. 11. 23. 23:27

용이 성을 공격하는 메시지패싱

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값 리턴하여 매치시킨 차이.)