<클래스와 클래스간의 상호관계>
요구사항 : "나는 과일장수에게 사과 2개를 구매했다." 를 객체지향 프로그래밍으로 묘사하라

 

1) MVC 

Model : 데이터, 데이터 제어
View : 화면, 사용자와 대화
Controller : Model, View를 중간 제어, 업무 컨트롤

2) 명사/동사분류법
    명사 : 클래스, 필드
    동사 : 클래스, 메서드
    
- 명사 : 나, 과일장수, 사과
- 동사 : 구매했다.


- 클래스의 대상 : 나, 과일장수
- 필드 : 사과 (2개) 
- 메서드 : 구매했다.

 

 

 

- 필드는 메서드를 통해 간접접근하는 것이 원칙
- 필드는 여러 메서드에서 사용하게 되는데 외부에서 필드에 자유롭게 접근하게되면 관련 메서드들이 모두 오작동할 위험이 있기 때문에 메서드의 매개변수와 return값을 통해 간접 접근한다.

- 필드초기화 작업시 별도 초기화 함수를 사용하는 것의 단점

1. 초기화 함수가 여러번 호출되면 중간의 값이 사라질 수 있다.
2. final필드는 초기화 메서드에서는 초기화할 수 없다.
 
→ 그래서 초기화 메서드 대신 "생성자"를 사용하도록 한다.

 

- 생성자

필드의 초기화와 초기동작 설정을 위해 만들어졌다.
final 필드를 초기화하는 것이 가능하다.

 

 

public class FruitMain {
	public static void main(String[] args) {
		//객체가 만들어 질 때, 생성자가 호출됨
		FruitSeller seller = new FruitSeller(0, 20, 1000);//괄호안의 값들이 생성자의 변수값에 전달.
		FruitBuyer buyer = new FruitBuyer(10000, 0);
		
		
//		객체의 참조값은 스택에 있는 변수에 저장되고
//		참조값을 jvm에 의해서 힙에 있는 객체 실체를 가리키게 된다.
		System.out.println(seller);
		System.out.println(buyer);
		
		// 상호작용(객체간의 메시지 전송/수신)
		// 둘중에 어느 것으로 표현해도 좋다.
		// 구매했다
		// 상대 객체의 기능을 사용하고 싶으면
		// 상대 객체의 참조변수를 매개변수로 해서 가리키게 한다
		// 그리고 메서드 내부에서 상대의 메서드를 호출한다
		buyer.buyApple(seller, 2000);
		//seller.saleApple(buyer, 2000);
		
		seller.showSaleResult();
		buyer.showBuyResult();
	}
}
//변수의 상수화 - final

public class FruitSeller {// 생성자
	private int numOfApple; // 사과 개수
	private int saleMoney; // 판매 금액
	private final int APPLE_PRICE; // 사과 가격

	// 판매하다
	public int saleApple(int money) {
		int num = money / APPLE_PRICE;
		numOfApple -= num;
		saleMoney += money;
		return num;
	}

	//생성자
	//final필드를 초기화 시킬 수 있다.
	public FruitSeller(int money, int appleNum, int price) {
		saleMoney = money;
		numOfApple = appleNum;
		APPLE_PRICE = price;
	}

	// 판매결과
	public void showSaleResult() {
		System.out.println("***과일 장수의 현재 상황***");
		System.out.println("남은 사과: " + numOfApple);
		System.out.println("판매 수익: " + saleMoney);
	}
}
public class FruitBuyer {
	private int myMoney;	// 보유 금액
	private int numOfApple;	// 사과 개수
	
	//객체가 생성될때 자동으로 호출되는 메서드: 생성자
	public FruitBuyer(int money, int appleNum){
		myMoney=money;
		numOfApple=appleNum;
	}
	
	
	// 메시지 전송(buyer->seller)
	// 상대방의 객체의 메서드를 호출하는 것을 
	// 객체지향에서는 메시지 전송(상호작용)
	public void buyApple(FruitSeller seller, int money) {
		numOfApple += seller.saleApple(money);
		myMoney -= money;
	}
	public void showBuyResult() {
		System.out.println("***과일 구매자의 현재 상황***");
		System.out.println("현재 잔액: " + myMoney);
		System.out.println("사과 개수: " + numOfApple);
	}
	
}

'java' 카테고리의 다른 글

Java/ String의 개념과 비교  (0) 2020.02.10
Java/ Static의 개념과 응용  (0) 2020.02.10
Java/Class exc/클래스 응용  (0) 2020.01.28
Java/Def of Class/클래스정의  (0) 2020.01.28
Java/Recursion/재귀호출  (0) 2020.01.28