<클래스와 클래스간의 상호관계>
요구사항 : "나는 과일장수에게 사과 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 |