갈림길 이정표

클래스 포함관계 연습 본문

Programming Language/Java 문제풀이(feat. 이것이 자바다)

클래스 포함관계 연습

이몽뇽 2020. 7. 19. 23:33

Q.다음 커피 자판기 프로그램을 클래스의 포함관계(has a관계)를 이용하여 설계하시오.

A. 

1. CoinIn class

package cafeProblem;

public class CoinIn {
	private int coin;
	private int jandon;
	
	
	public int calc(int coin, int cup) {
		int price = 200;
		
		this.coin = coin;
		this.jandon = coin - cup*price;
		
		return jandon;		//jandon은 private 멤버기 때문에 외부에서 부르기 위해선 return 값이 필요
			
	}
}

새로운 변수 및 최초 메소드 (변수간의 관계) 선언

 

메소드 선언

여기서 흥미로운 점은 "선언 되지 않은 'cup'이라는 변수가 메소드에 사용되었다는 것

※ 메소드 선언 시 argument(?)로 지역변수 생성 (추후 메소드 호출 시 input 값으로 사용될 것)

※price 를 굳이 변수로 둔 것은 나중에 커피 값이 바뀔 것을 대비 (개인적 고찰)

 

this.coin 과 this.jandon 에 값을 치환시켜 줌으로써 접근하지 못하는 private 멤버 값을 이용할 수 있음.

※주의: this.변수(전역변수) / argument 변수(지역변수: 그 메소드 내에서만 영향있는 변수)

 

리턴값이 있다고 선언 함으로써 private 멤버 jandon 에게 calc메소드 호출시 output 부여

 

 

2. Machine class 

package cafeProblem;

public class Machine {
	private int cupCount;
	CoinIn coinIn;
	
	public Machine() {
		coinIn = new CoinIn();
	}
	
	public void showData(int coin, int cup){
		int jandon = coinIn.calc(coin, cup);
		
		if(jandon < 0) System.out.println("돈 더 가져와 그지야");
		else System.out.println("주문하신 커피 " + cup + "잔과\n거스름돈 " + jandon + "원 나왔습니다.");
		
		
		
	}
}

멤버 필드

CoinIn 클래스의 coinIn 변수 선언 → CoinIn 클래스의 메소드 호출 가능

 

생성자 선언

새로운 객체 선언 (Instance): 멤버필드에 있던 coinIn속성의 변수를 복제했다고 보면 됨

 

메소드 선언

CoinIn 클래스 메소드에서 return 값을 int jandon으로 받았기 때문에 따로 멤버필드 선언 없이 값을 치환 받을 수 있음

※ 모든 데이터는 휘발성이므로 활용하고 싶다면 변수에 저장해야함. coinIn.calc(coin, cup) 을 통해 return jandon 값을 받겠지만 활용불가능한 상태 (데이터가 소실될 수 있는 상태) ... 따.라.서. int jandon이라는 새로운 지역변수에 저장한 후 if문 사용하여 조건 따라 분리시켜야 함

※ 멤버 필드 선언은 해당 클래스가 다른 클래스에서 사용되는 변수가 있을 때만 선언

coin과 cup 값 (input) 입력 → return jandon → jandon을 기준으로 if 조건문 (계산 가능 / 불가능)

 

 

3. MachineUse class

 

※ <더보기 펼쳐보기>Scanner를 이용하여 값을 키보드로 직접 입력시키는방법 (ex. int a 변수에 입력시)

더보기
Scanner a = new Scanner(System.in);
		int a = a.nextInt();
package cafeProblem;

import java.util.Scanner;

public class MachineUse {

	public static void main(String[] args) {
		
		Machine machine = new Machine();
		
		System.out.println("커피는 한잔에 200원 입니다.\n동전을 투입해 주세요.");
		
		Scanner coinIn = new Scanner(System.in);
		int coin = coinIn.nextInt();
		
		System.out.println("몇잔을 원하십니까?");
				
		Scanner cupCount = new Scanner(System.in);
		int cup = cupCount.nextInt();
		
		machine.showData(coin, cup);
		
	}

}

import java.util.Scanner;

 

메인 메소드 선언

가장 먼저 Machine 클래스의 machine 객체 생성 (showData 메소드 호출을 위해)

[End 사용자 기준] 동전 투입 ([Scanner]input: coin) → 주문 잔 수 입력 ([Scanner]입력: cup) → '주문 잔 수' 와 거스름 돈 출력 ([showData 메소드 실행]output: cup 과 jandon)

※ Machine class에서 showData 메소드 입력값에 대한 데이터 타입을 미리 정의해 놨기 때문에 MachineUse class 에선 값만 입력해도 되는 것

'Programming Language > Java 문제풀이(feat. 이것이 자바다)' 카테고리의 다른 글

DTO 연습  (0) 2020.07.23
추상 클래스 연습  (2) 2020.07.21
Comments