목차
<객체 간 협력 구현하기>
객체 지향 프로그램은 객체를 정의하고 객체 간 협력으로 만들어진다.
그렇다면 실제로 객체의 협력이 어떻게 이루어지는지 보자.
'학생'이 '버스'와 '지하철'을 이용하는 프로그램을 구현해보자.
학생 (이름, 학년, 가진 돈)
↓(버스를 탄다.) ↘(지하철을 탄다.)
버스 (버스 번호, 승객 수, 수입) / 지하철 (노선 번호, 승객 수, 수입)
<학생 클래스 구현하기>
package cooperation;
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) { // 학생이 버스를 타면 1000원을 지불하는 메서드
bus.take(1000);
this.money -= 1000; // 학생의 돈이 -1500
}
public void takeSubway(Subway subway) { // 학생이 지하철을 타면 1500원을 지불하는 메서드
subway.take(1500);
this.money -= 1500; // 학생의 돈이 -1500
}
public void showInfo() { // 학생의 현재 정보를 출력하는 메서드
System.out.println(studentName+"학생의 남은 돈은"+money+"원 입니다.");
}
}
takeBus()메서드는 학생이 버스를 탑승하는 경우를 구현한 메서드.
this.money -= 1000;이 수행되며, 학생이 가진 돈이 1000원만큼 차감된다. (지하철도 마찬가지로 구성)
showInfo()메서드는 학생의 남은 돈 정보가 문자열로 출력.
<버스 클래스 구현>
package cooperation;
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+"입니다.");
}
}
Bus(int busNumber) 생성자에서는 버스 번호를 매게로 받아 버스가 생성될 때 버스 번호를 초기화 한다.
take()메서드에서 승객 한 명이 버스를 탄 경우를 구현. 요금을 매개변수로 받고, 요금이 들어오면 수입이 증가하고, 승객 수도 증가(++)한다.
<지하철 클래스 구현>
package cooperation;
public class Subway {
String lineNumber; //지하철 노선번호
int passengerCount; // 승객 수
int money; //수입 액
public Subway(String lineNumber) { //노선번호를 매개변수로 받는 생성자
this.lineNumber = lineNumber;
}
public void take(int money) { //승객이 지하철을 탄 경우를 구현한 메서드
this.money += money;
passengerCount++;
}
public void subwayInfo() { //지하철 정보를 출력하는 메서드
System.out.println("지하철"+lineNumber+"호선의 승객 수는 "+passengerCount+"명이며, 수입은 "+money+"입니다.");
}
}
Subway(String lineNumber) 생성자에서는 지하철 노선번호를 매게로 받아 지하철이 생성될 때 버스 번호를 초기화 한다.
take() 메서드에서 승객 한 명이 버스를 탄 경우를 구현. 버스와 마찬가지로 수입이 증가하고, 승객 수도 증가(++)한다.
<각 객채 간 협력하기>
package cooperation;
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); //새로운 버스 생성 - 100(버스번호)
studentJames.takeBus(bus100); //James가 bus100을 탐
studentJames.showInfo(); //James의 정보 출력
bus100.showInfo(); // bus100의 정보 출력
Subway subwayGreen = new Subway("2호선"); //새로운 지하철 생성 - 2호선
studentTomas.takeSubway(subwayGreen); //Tomas가 subwayGreen을 탐
studentTomas.showInfo(); //Tomas의 정보 출력
subwayGreen.subwayInfo(); //subwayGreen의 정보 출력
}
}
출력화면 :
정리
studentJames 인스턴스에서 학생의 이름은 "James", 가진 돈은 5000으로 초기화,
studentTomas 인스턴스에서는 "Tomas", 10000원으로 초기화 했다.
bus100 변수가 가리키는 새로운 버스와
subwayGreen 변수가 가리키는 새로운 지하철을 생성했다.
studentJames는 takeBus()메서드에서 버스를 타고,
studentTomas는 takeSubway()메서드에서 지하철을 탔다.
우리가 학생, 버스, 지하철등 객체를 클래스로 만들어 구현하여 서로 협력하는 것을 확인했다. 이렇게 서로 어떤 값을 주고받고 메서드를 호출하는 일이 발생한다.
각 객체(학생, 버스, 지하철)에 필요한 멤버 변수를 선언하고, 생성자를 정의했다. (public Student(String, int) { } )
객체 사이의 협력 기능도 구현했다. (takeBus(Bus bus), takeSubway(Subway subway), take(int money))
->'학생이 버스를 탄다'는 학생 객체의 입장에서 사용한 문장이다.
이것을 버스 입장에서 생각해보면 '버스에 학생이 탄다'이다.
즉 하나의 경우에 대해 두 객체에서 서로 다른 일이 발생하는 것이므로 이를 각각의 클래스에 메서드로 구현했다.
[Do it! 자바 프로그래밍 입문] 도서로 공부하며 정리한 글입니다.