학생이 지하철이나 버스를 타고 학교에 가는 것을 객체 지향으로 프로그래밍 해본다.
학생, 버스, 지하철 세 객체를 만들고 이들 사이에 어떻게 협력이 이루어지는지 살펴보자.
학생 클래스 구현하기
학생 클래스는 '이름', '학년', '가진 돈'을 멤버 변수(속성)로 가진다.
그리고 '버스를 탄다', '지하철을 탄다', ' 학생의 현재 정보를 보여 준다'를 메서드(멤버 함수)로 가진다.
package chap6;
public class Student {
public String studentName;
public int grade;
public int money;
public Student(String studentName, int money){
this.studentName = studentName;
this.money = money;
}
public void takeBus(Bus bus){
bus.take(1000);
this.money -= 1000;
}
public void takeSubway(Subway subway){
subway.take(1500);
this.money -= 1500;
}
public void showInfo(){
System.out.println(studentName + "님의 남은 돈은 " + money + "원입니다.");
}
}
8행의 생성자는 학생 이름과 학생이 가진 돈을 매개변수로 받는다.
학생 클래스를 하나 생성하면 학생 이름과 학생이 가진 돈을 초기화 한다.
디폴트 생성자를 제공하지 않으므로 학생 클래스를 생성하려면 매개변수가 있는 Student(String studentName, int money) 생성자를 호출해야 한다.
takeBus() 메서드는 학생이 한 버스를 선택해서 탄 경우를 구현한 코드이다.
버스를 타면 버스 요금을 내기 떄문에 this.money -= 1000; 문장이 수행되면 학생이 가진 돈이 천원만큼 줄어든다.
지하철도 마찬가지이다.
showInfo() 함수는 학생 정보를 출력해 준다.
버스 클래스 구현하기
학생 한 명이 승차하면 버스 요금을 받고 승객 수가 증가한다.
package chap6;
public class Bus {
int busNumber;
int passengerCount;
int money;
public Bus(int busNumber){
this.busNumber = busNumber;
}
public void take(int money){
this.money += money;
passengerCount++;
}
public void showInfo(){
System.out.println("버스 " + busNumber + "번의 승객은 " + passengerCount + "명이고, 수입은 " + money + "입니다.");
}
}
버스 클래스의 멤버 변수로는 버스 번호, 승객 수, 버스가 받은 요금 총액이 있다.
take() 메서드에서 승객 한 명이 버스를 탄 경우를 구현한다.
승객이 요금을 지불한다. 요금을 매개변수로 받고 요금이 들어오면 버스 수입이 증가하고 승객 수도 증가한다.
Bus(int busNumber) 생성자에서는 버스 번호를 매개변수로 받아 버스가 생성될 때 버스 번호를 초기화한다.
shoInfo() 메서드에서 버스 번호와 버스를 탄 승객 수 그리고 버스 수입을 출력한다.
지하철 클래스 구현하기
버스와 유사하다.
package chap6;
public class Subway {
String lineNumber;
int passengerCount;
int money;
public Subway(String lineNumber){
this.lineNumber = lineNumber;
}
public void take(int moeny){
this.money += moeny;
passengerCount++;
}
public void showInfo(){
System.out.println(lineNumber + "의 승객은 " + passengerCount + "명이고, 수입은 " + money + "입니다.");
}
}
Subway(String lineNumber) 생성자가 지허철 몇 호선인지를 매개변수로 받아 Subway 클래스를 생성한다.
take() 메서드는 승객이 탄 경우에 발생하는 일을 구현한다.
지하철 수입이 증가하고 지하철 승객 수가 한 명 증가한다.
showInfo() 메서드는 지하철 노선, 승객 수, 지하철 수입 금액을 문자열로 출력한다.
학생, 버스, 지하철 객체 협력하기
Student, Bus, Subway 클래스를 기반으로 학생이 버스나 지하철을 탔을 때 상황을 구현해 본다.
두 학생 James와 Tomas가 있다.
이 두 학생은 각각 버스와 지하철을 한 번씩 타고 학교에 간다.
두 학생이 교통 수단을 이용한 후 각자가 가진 돈의 변화와 버스, 지하철 수입의 합을 알아본다.
package chap6;
public class TakeTrans {
public static void main(String[] args){
Student studentJames = new Student("james", 5000);
Student studentTomas = new Student("tomas", 10000);
Bus bus100 = new Bus(100);
studentJames.takeBus(bus100);
studentJames.showInfo();
bus100.showInfo();
Subway subwayGreen = new Subway("2호선");
studentTomas.takeSubway(subwayGreen);
studentTomas.showInfo();
subwayGreen.showInfo();
}
}

두 개의 학생 인스턴스가 생성되었다.
studentJames 인스턴스에서 학생 이름은 James, 가진 돈은 5000원으로 초기화하고, studentTomas 인스턴스에서 학생 이름은 Tomas, 가진 돈은 10000원으로 초기화했다.
그리고 bus100 변수가 가리키는 버스와 subwayGreen이 가리키는 지하철이 생성되었다.
studentJames는 TakeBus() 메서드에서 버스를 타고, studentTomas는 takeSubway() 메서드에서 지하철을 탔다.
예제에서 객체 간 협력은 학생, 버스, 지하철 사이에 이루어졌다.
학생은 버스나 지하철을 이용할 수 있다.
학생이 버스를 선택하면 학생이 가진 돈은 천원 줄고 버스 승객은 1명이 증가하고 버스 수입은 천원 증가한다.
학생이 지하철을 이용하는 경웨 학생이 가진 돈은 천오백원이 줄어들고 지하철 승객은 1명이 증가하고 지하철 수입은 천오백원 증가한다.
객체를 클래스로 만들어 구현하면 이렇게 객체 사이에는 서로 어떤 값을 주고받고 메서드를 호출하는 일이 발생한다.
- 지금까지 구현한 과정
맨 처음 필요한 객체를 정의했다.
이 프로그램에서 사용한 객체는 학생, 버스, 지하철이다.
각 객체에 필요한 멤버 변수를 선언하고, 생성자를 정의했다.
객체 사이의 협력 기능도 구현했다.
'학생이 지하철을 탄다'는 학생 객체 입장에서 사용한 문장이다.
이를 지하철 객체의 입장에서 생각해 보면 '지하철에 학새이 탄다'이다.
즉 하나의 경우에 대해 두 객체에서 서로 다른 일이 발생하는 것이므로 이를 각각의 클래스에 메서드로 구현했다.