본문 바로가기

컴퓨터언어/JAVA(자바)

[JAVA강좌] 24강 여러 클래스 생성 후 객체 협력

728x90
반응형

 

 

 

 

 

 

 

 

- 이전 강좌들에서는 클래스를 하나만 생성한 후 main() 함수를 가진 클래스로 불러왔습니다.

- 이번에는 여러 클래스를 생성한 후 각자의 클래스가 어떻게 협력하는지 보도록 하겠습니다. 

- 승객이 버스나 지하철을 타는 프로그램을 만들어 보겠습니다.

- 그래서 승객, 버스, 지하철 클래스를 구분해서 만들고, main() 함수를 가진 클래스를 만들어 프로그램 전체를 컨트롤해보도록 하겠습니다. 

- 위와 같이 파일들을 만들어서 구현해보겠습니다.

- 패키지(ch16_multiple_object)를 만들고, 보이는 클래스 파일들을 모두 생성해 주세요.

- 이때 TransMain에만 main()를 추가해 줍니다. 

 

 

 

 

 

 

 

 

 

1.  Bus 클래스


- 버스 관련 정보를 담는 클래스를 제작하겠습니다.

- 버스 번호, 승객 수, 버스 수입을 멤버변수로 제작하겠습니다.

- 메서드는 승객이 탄 경우(take)와 버스 정보를 출력(printInfo)하는 것을 제작해 보겠습니다. 

 

 

 

1) 멤버 변수 처리

- 멤버 변수는 특별한 경우를 제외하고, 보통 private로 정보은닉을 처리한다고 했습니다.

- 그래서 멤버변수는 private로 선언을 해보겠습니다. 

 

## Bus.java

package ch16_multiple_object;

public class Bus {
	//멤버 변수
	private int busNumber;				//버스 번호
	private int passengerCount; 			//승객 수
	private int money;				//버스 수입
}

 

 

 


 

 

 

2) 생성자 처리

- 생성자는 버스 번호만 사용해서 제작하겠습니다.

- 코드를 보고 직접 쳐도 되겠지만 이클립스는 기능이 있습니다.

- 생성하고 싶은 곳에서 [마우스 오른쪽]-[Source]-[Generate Constructor using fields...]

 

- 뜨는 창에서 사용할 멤버변수만 선택 후 [Generate] 버튼을 눌러 줍니다.

- 그러면 멤버변수와 너무 붙어서 나오는데 정리해서 작성해 주세요.

- 그리고 내부에 생긴  super(); 는 삭제해 줍니다. 

 

## Bus.java

package ch16_multiple_object;

public class Bus {
	//멤버 변수
	private int busNumber;				//버스 번호
	private int passengerCount; 			//승객 수
	private int money;				//버스 수입
	
	//버스 번호를 매개변수로 받는 생성자
	public Bus(int busNumber) {
		this.busNumber = busNumber;
	}
}

 

- int 유형은 생성자에서 값을 지정하지 않아도 0이 기본값으로 들어갑니다.

- 그래서 승객수와 버스수입은 0으로 처리가 되는 겁니다. 

 

 


 

 

 

 

3) 메서드 처리

- 메서드는 승객이 탄 경우(take)와 버스 정보를 출력(printInfo)하는 것을 제작해 보겠습니다. 

- 승객이 타면 승객수가 1이 증가하고, 버스 수입도 증가하도록 처리하겠습니다. 

- 버스 수입은 어른인 경우와 학생인 경우 달라서, 매개변수로 처리하겠습니다.

- 버스 정보 출력은 버스 정보를 모두 출력해 보겠습니다.

 

 

## Bus.java

package ch16_multiple_object;

public class Bus {
	//멤버 변수
	private int busNumber;				//버스 번호
	private int passengerCount; 			//승객 수
	private int money;				//버스 수입
	
	//버스 번호를 매개변수로 받는 생성자
	public Bus(int busNumber) {
		this.busNumber = busNumber;
	}
	
	//승객이 버스탄 경우를 구하는 메서드
	public void take(int money) {
		this.money += money; 			//버스 수입 증가
    		passengerCount++;			//승객 수 증가
	}

	//버스 정보를 출력하는 메서드
	public void printInfo() {
		System.out.println("=====버스정보=====");
		System.out.println("버스번호 : " + busNumber);
		System.out.println("승객 수 : " + passengerCount);
		System.out.println("버스수입 : " + money);
	}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.  Subway 클래스


- 지하철 관련 정보를 담는 클래스를 제작하겠습니다.

- 지하철 노선, 승객 수, 지하철 수입을 멤버변수로 제작하겠습니다.

- 메서드는 승객이 탄 경우(take)와 지하철 정보를 출력(printInfo)하는 것을 제작해 보겠습니다. 

 

 

 

1) 멤버 변수 처리

- 멤버 변수는 특별한 경우를 제외하고, 보통 private로 정보은닉을 처리한다고 했습니다.

- 그래서 멤버변수는 private로 선언을 해보겠습니다. 

 

## Subway.java

package ch16_multiple_object;

public class Subway {
	//멤버 변수
	private String lineNumber;				//지하철 번호
	private int passengerCount; 				//승객 수
	private int money;					//지하철 수입
}

 

- 지하철 노선 같은 경우는 분당선, 신분당선 이런 식으로 들어갈 수도 있으므로 String타입으로 선언했습니다.

 

 


 

 

 

2) 생성자 처리

- 생성자는 지하철 노선만 사용해서 제작하겠습니다.

- 위에서 설명을 했기 때문에, 직접 작성할지 이클립스 기능을 이용할지 선택해 주세요.

 

## Subway.java

package ch16_multiple_object;

public class Subway {
	//멤버 변수
	private String lineNumber;				//지하철 번호
	private int passengerCount; 				//승객 수
	private int money;					//지하철 수입
	
	//지하철 노선을 매개변수로 받는 생성자
	public Subway(String lineNumber) {
		this.lineNumber = lineNumber;
	}
}

- 역시 int타입은 기본값이 0으로 들어가기 때문에 따로 지정해주진 않았습니다.

 

 

 


 

 

 

3) 메서드 처리

- 메서드는 승객이 탄 경우(take)와 지하철 정보를 출력(printInfo)하는 것을 제작해 보겠습니다. 

- 승객이 타면 승객수가 1이 증가하고, 지하철 수입도 증가하도록 처리하겠습니다. 

- 버스 수입은 어른인 경우와 학생인 경우 달라서, 매개변수로 처리하겠습니다.

- 지하철  정보 출력은 지하철  정보를 모두 출력해 보겠습니다.

 

 

## Subway.java

package ch16_multiple_object;

public class Subway {
	//멤버 변수
	private String lineNumber;				//지하철 번호
	private int passengerCount; 				//승객 수
	private int money;					//지하철 수입
	
	//지하철 노선을 매개변수로 받는 생성자
	public Subway(String lineNumber) {
		this.lineNumber = lineNumber;
	}
	
	public void take(int money) {  
		this.money += money;				//지하철  수입 증가
		passengerCount++;				//승객 수 증가
	}

	//지하철 정보를 출력하는 메서드
	public void printInfo() {
		System.out.println("=====버스정보=====");
		System.out.println("지하철노선 : " + lineNumber);
		System.out.println("승객 수 : " + passengerCount);
		System.out.println("지하철수입 : " + money);		
	}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.  Passenger 클래스


- 승객 관련 정보를 담는 클래스를 제작하겠습니다.

- 승객이름, 승객 등급, 갖고 있는 돈을 멤버변수로 제작하겠습니다.

- 메서드는 버스를 탄 경우(takeBus)와 지하철을 탄 경우(takeSubway)와 승객정보를 출력(printInfo)해보겠습니다. 

 

 

 

1) 멤버 변수 처리

- 멤버 변수는 특별한 경우를 제외하고, 보통 private로 정보은닉을 처리한다고 했습니다.

- 그래서 멤버변수는 private로 선언을 해보겠습니다. 

 

## Passenger.java

package ch16_multiple_object;

public class Passenger {
	private String passengerName;				//승객이름
	private boolean grade;					//승객등급 - 어른(false), 학생(true)
	private int money;					//승객이 가지고 있는 돈
}

- 등급은 어른과 학생으로 나눌 건데, 이렇게 2개의 값으로 처리하는 경우는 boolean타입으로 선언하는 것이 편리합니다.

 

 

 


 

 

 

2) 생성자 처리

- 생성자는 모든 멤버변수를 사용해서 제작하겠습니다. 

- 위에서 설명을 했기 때문에, 직접 작성할지 이클립스 기능을 이용할지 선택해 주세요.

 

## Passenger.java

package ch16_multiple_object;

public class Passenger {
	private String passengerName;				//승객이름
	private boolean grade;					//승객등급 - 어른(false), 학생(true)
	private int money;					//승객이 가지고 있는 돈
	
	//생성자
	public Passenger(String passengerName, boolean grade, int money) {
		this.passengerName = passengerName;
		this.grade = grade;
		this.money = money;
	}
}

- 모든 멤버변수를 매개변숫값으로 처리하겠습니다. 

 

 

 


 

 

 

3) 메서드 처리

- 메서드는 버스를 탄 경우(takeBus)와 지하철을 탄 경우(takeSubway)와 승객정보를 출력(printInfo)해보겠습니다. 

- 승객이 타면 승객수가 1이 증가하고, 지하철 수입도 증가하도록 처리하겠습니다. 

- 버스 수입은 어른인 경우와 학생인 경우 달라서, 매개변수로 처리하겠습니다.

- 지하철  정보 출력은 지하철  정보를 모두 출력해 보겠습니다.

 

 

## Subway.java

package ch16_multiple_object;

public class Passenger {
	private String passengerName;				//승객이름
	private boolean grade;					//승객등급 - 어른(false), 학생(true)
	private int money;					//승객이 가지고 있는 돈
	
	//생성자
	public Passenger(String passengerName, boolean grade, int money) {
		this.passengerName = passengerName;
		this.grade = grade;
		this.money = money;
	}
	
	//버스타면 금액을 지불하는 메서드
	public void takeBus(Bus bus) { //Bus클래스를 인스턴스로 생성해서 매개변수 처리
		if(grade) { //grade가 true(어른이면)
			bus.take(1200); //1200원 지불
			money -= 1200; //승객의 남은돈에서 1200원 감소
		}else{ //grade가 false(학생이면)
			bus.take(1000); //1000원 지불
			money -= 1000; //승객의 남은돈에서 1000원 감소
		}
	}
	
	//지하철타면 금액을 지불하는 메서드
	public void takeSubway(Subway subway) { //Subway클래스를 인스턴스로 생성해서 매개변수 처리
		if(grade) { //grade가 true(어른이면)
			subway.take(1500); //1500원 지불
			money -= 1500; //승객의 남은돈에서 1500원 감소
		}else{ //grade가 false(학생이면)
			subway.take(1200); //1200원 지불
			money -= 1200; //승객의 남은돈에서 1200원 감소
		}
	}
	
	//학생의 현재 정보를 출력하는 메서드
	public void printInfo() {
		String gradeName; //어른, 학생을 문자로 담을 변수
		if(grade) { 
			gradeName = "어른";
		}else {
			gradeName = "학생";
		}
		
		System.out.println("=====승객정보=====");
		System.out.println("이름 : " + passengerName);
		System.out.println("등급 : " + gradeName);
		System.out.println("남은 돈 : " + money);
	}
}

 

- 메서드들의 자세한 설명은 주석으로 달아놨으니 확인 바랍니다.

- 승객등급이 어른인 경우와 학생인 경우 지불하는 금액을 다르게 처리했습니다.

- grade는 boolean 타입이라 정보 출력할 때는 문자로 반환되도록 gradeName변수를 선언했습니다. 

 

 

 

 

 

 

 

 

 

 

 

4.  TransMain 클래스


- Bus, Subway, Passenger 클래스를 인스턴스로 생성해서 프로그램을 실행할 파일입니다. 

- 승객은 두 명만 생성하고, 한 승객은 버스를 이용, 한 승객은 지하철을 이용시키겠습니다. 

 

 

## TransMain.java 코드

package ch16_multiple_object;

public class TransMain {

	public static void main(String[] args) {
		//승객 두명 추가
		Passenger ps01 = new Passenger("김석진", false, 5000);
		Passenger ps02= new Passenger("김태형", true, 15000);
		
		//버스 생성
		Bus bus100 = new Bus(100); //100번 버스 인스턴스 생성
		ps01.takeBus(bus100);//학생01이 100번버스를 탐
		ps01.printInfo(); //학생01 정보출력
		bus100.printInfo(); //100번버스 정보출력
		
		//지하철 생성
		Subway subway2 = new Subway("2호선"); //2호선 지하철 인스턴스 생성
		ps02.takeSubway(subway2); //학생02가 2호선 지하철을 탐
		ps02.printInfo(); //학생02 정보출력
		subway2.printInfo(); //2호선 지하철 정보출력
	}
}

- 설명은 주석으로 달아놨으니 확인 바랍니다.

- 이런 식으로 클래스를 분할하고 협력하도록 처리를 합니다.

 

 

## TransMain.java 결과

- 그럼 김석진 학생은 남은 돈이 4000원으로 처리됩니다.

- 버스도 승객 한 명을 태웠고, 버스 수입도 학생요금인 1000원이 처리됩니다.

- 김태형 어른은 남은 돈이 13500원입니다.

- 지하철도 승객한명을 태웠고, 지하철 수입도 어른 요금인 1500원이 처리됩니다. 

 

 

 

 

 

 

 

 

728x90
반응형