- Do it! 자바 프로그래밍 입문 온라인 강의를 수강하며 작성하였습니다.
- Section 1. 자바의 핵심 - 객체지향 프로그래밍
- 14강 "클래스와 객체2(2)"
- 객체 간의 협력
학생이 버스나 지하철을 타는 상황을 프로그래밍하기 위해서는 클래스가 학생, 버스, 지하철이 필요하다.
public class Student {
String studentName;
int grade;
int money;
public Student(String studentName, int money) {
this.studentName = studentName;
this.money = money;
}
public void takeBus(Bus bus) {
bus.take(1000);
money -= 1000;
}
public void takeSubway(Subway subway) {
subway.take(1500);
money -= 1500;
}
public void showInfo() {
System.out.println(studentName + "님의 남은 돈은 " + money + "원 입니다.");
}
}
학생의 속성은 이름, 학년(해당 상황에 필요한 것은 아님), 가진 돈으로 만들어 주었고, 버스를 타는 행위와 지하철을 타면 가진 돈이 줄어드는 메서드로 만들어 주었다.
public class Bus {
int busNumber;
int passengerCount;
int money;
public Bus(int busNumber) {
this.busNumber = busNumber;
}
public void take(int money) {
passengerCount++;
this.money += money;
}
public void showInfo() {
System.out.println("버스 " + busNumber + "번의 승객은 " + passengerCount + "명이고, 수입은 " + money +"입니다.");
}
}
버스의 속성은 버스 번호, 승객 수, 수입으로 만들어 주었고, 탑승하는 경우에 승객과 수입이 증가하는 메서드를 만들어 주었다.
public class Subway {
int lineNumber;
int passengerCount;
int money;
public Subway(int lineNumber) {
this.lineNumber = lineNumber;
}
public void take(int money) {
passengerCount++;
this.money += money;
}
public void showInfo() {
System.out.println("지하철 " + lineNumber + "호선의 승객은 " + passengerCount + "명이고, 수입은 " + money +"입니다.");
}
}
지하철의 속성은 노선 번호, 승객 수, 수입으로 만들어 주었고, 버스와 마찬가지로 탑승하는 경우에 승객과 수입이 증가하는 메서드를 만들어 주었다.
public class TakeTrans {
public static void main(String[] args) {
Student james = new Student("James", 5000);
Student tomas = new Student("Tomes", 10000);
Bus bus100 = new Bus(100);
james.takeBus(bus100);
james.showInfo();
bus100.showInfo();
Subway subway2 = new Subway(2);
tomas.takeSubway(subway2);
tomas.showInfo();
subway2.showInfo();
}
}
main 함수에서 실행시킨 후 showInfo()로 확인해본 결과 정상 작동하는 것을 확인할 수 있다.
강의에서 작성한 코드가 깔끔하지 않다고 생각해서 약간 수정해보았습니다.
public class Student {
String studentName;
int age;
int money;
public Student(String studentName, int age, int money) {
this.studentName = studentName;
this.age = age;
this.money = money;
}
public void takeBus(Bus bus) {
bus.take(this);
money -= bus.fare;
showInfo();
}
public void takeSubway(Subway subway) {
subway.take(this);
money -= subway.fare;
showInfo();
}
public void showInfo() {
System.out.println(studentName + "님의 남은 돈은 " + money + "원 입니다.");
}
}
나이마다 요금을 다르게 설정하기 위해 Student 클래스에 나이 변수를 추가하였고, 가진 돈은 그 요금만큼 줄어들도록 코딩하였다.
public class Bus {
int busNumber;
int passengerCount;
int fare;
int money;
public Bus(int busNumber) {
this.busNumber = busNumber;
}
public void take(Student student) {
if(student.age < 7) {
fare = 450;
}else if(student.age < 19) {
fare = 720;
}else {
fare = 1050;
}
passengerCount++;
money += fare;
showInfo();
}
public void showInfo() {
System.out.println("버스 " + busNumber + "번의 승객은 " + passengerCount + "명이고, 수입은 " + money +"입니다.");
}
}
public class Subway {
int lineNumber;
int passengerCount;
int fare = 1500;
int money;
public Subway(int lineNumber) {
this.lineNumber = lineNumber;
}
public void take(Student student) {
if(student.age < 7) {
fare = 450;
}else if(student.age < 19) {
fare = 720;
}else {
fare = 1250;
}
passengerCount++;
money += fare;
showInfo();
}
public void showInfo() {
System.out.println("지하철 " + lineNumber + "호선의 승객은 " + passengerCount + "명이고, 수입은 " + money +"입니다.");
}
}
버스와 지하철의 take() 메서드는 Student의 나이에 따라 요금이 달라지도록 설정하였다.
public class TakeTrans {
public static void main(String[] args) {
Student james = new Student("James", 25, 10000);
Student tomas = new Student("Tomes", 15, 10000);
Student harry = new Student("Harry", 5, 10000);
Bus bus100 = new Bus(100);
james.takeBus(bus100);
tomas.takeBus(bus100);
harry.takeBus(bus100);
Subway subway2 = new Subway(2);
james.takeSubway(subway2);
tomas.takeSubway(subway2);
harry.takeSubway(subway2);
}
}
25살, 15살, 5살의 Student 객체를 만들고 각각 버스와 지하철을 탔을 때 요금이 다르게 줄어드는 것을 확인할 수 있다.