- 이전 강좌들에서는 클래스를 하나만 생성한 후 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);
}
}
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원이 처리됩니다.
'컴퓨터언어 > JAVA(자바)' 카테고리의 다른 글
[JAVA강좌] 26강 자바 배열 (0) | 2024.01.26 |
---|---|
[JAVA강좌] 25강 static과 싱글톤패턴 (0) | 2024.01.18 |
[JAVA강좌] 23강 접근제어자와 정보은닉 (0) | 2024.01.17 |
[JAVA강좌] 22강 메서드와 게터세터 (0) | 2024.01.17 |
[JAVA강좌] 21강 클래스와 객체 (0) | 2024.01.16 |