[그린컴퓨터] Server/JAVA(객체 지향 프로그래밍)

객체 간 협력 {학습목표, 학생 클래스 구현하기, 버스 클래스 구현하기, 지하철 클래스 구현하기, 학생&버스&지하철 객체 협력하기, 객체지향 프로그래밍 정리해보기, 객체지향 프로그래밍 연..

Ben의 프로그램 2023. 5. 22. 12:47
728x90

학습 목표

  • 객체 지향 프로그램은 객체를 정의하고 객체 간 협력으로 만든다고 공부했습니다.
  • 실제로 객체의 협력이 어떻게 이루어지는지 살펴보겠습니다.
  • 학생이 버스나 지하철을 타고 학교에 가는 것을 객체 지향으로 프로그래밍 해보겠습니다.
  • 학생, 버스, 지하철 세 객체를 만들고 이들 사이에 어떻게 협력이 이루어지는지 살펴보겠습니다

학생 클래스 구현하기

  • 학생 클래스는 '이름', '학년', '가진 돈'을 멤버 변수(속성)로 가집니다.
  • '버스를 탄다', '지하철을 탄다', '학생의 현재 정보를 보여 준다'를 메서드(멤버 함수)로 가집니다.
package cooperation;

public class Student {
	public String studentName;
	public int grade;
	public int money;
	
	public Student(String studentName, int money) {
		super();
		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 + "입니다.");
	}
}
  • 학생 클래스의 생성자는 학생 이름과 학생이 가진 돈을 매개변수로 받습니다. 
  • 즉, 학생 클래스를 하나 생성할 때마다 학생 이름과 학생이 가진 돈이 초기화 됩니다. (디폴트 생성자를 제공하지 않기 때문에 해당 생성자만을 사용해서 클래스를 생성할 수 있게 됩니다)

버스 클래스 구현하기

  • 버스 클래스의 멤버 변수로는 버스 번호, 승객 수, 버스가 받은 요금 총액이 있습니다.
  • take() 메서드에서는 승객이 탑승 할 때마다 버스 객체에 발생하는 변화를 구현합니다. 승객 수가 증가하고, 버스 수입이 증가하게 됩니다. 
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 + "입니다.");
	}
}

지하철 클래스 구현하기

  • 지하철 클래스는 지하철 노선명, 승객 수, 수입액 멤버 변수를 가지고 있습니다.
  • 버스 클래스와 마찬 가지로 승객 한 명이 탑승할 때마다 변화하는 값을 구현하는 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 showInfo() {
		System.out.println(lineNumber + "의 승객은 " + passengerCount + "명이고, 수입은 " + money + "입니다.");
	}
}

학생, 버스, 지하철 객체 협력하기

  • 이제 Student, Bus, Subway 클래스를 기반으로 학생이 버스나 지하철을 탔을 때 상황을 구현해보겠습니다.
  • James와 Tomas 학생이 각각 버스와 지하철을 타고 학교에 가는 상황을 작성하겠습니다.
package cooperation;

public class TakeTrans {

	public static void main(String[] args) {
		Student studentJames = new Student("James", 5000);
		Student studentThomas = new Student("Thomas", 10000);
		
		Bus bus100 = new Bus(100);
		studentJames.takeBus(bus100);
		studentJames.showInfo();
		bus100.showInfo();
		
		Subway subwayGreen = new Subway("2호선");
		studentThomas.takeSubway(subwayGreen);
		studentJames.showInfo();
		subwayGreen.showInfo();
	}

}

출력화면

  • 위 예제를 보면 두 개의 학생 인스턴스가 생성되었습니다. 
  • 학생 클래스의 생성자는 이름과 돈을 매개변수로 받습니다. 그 결과 James 와 Thomas 참조변수가 가리키는 인스턴스들은 각각 이름이 "James"와 "Thomas"로 초기화되고 가지고 있는 돈은 각각 5,000 과 10,000 으로 초기화되었습니다.
  • bus100 이라는 버스 클래스의 인스턴스가 생성되었고, subwayGreen 이라는 지하철 클래스의 인스턴스도 생성되었습니다. 
  • 버스 클래스와 지하철 클래스의 생성자는 각각 버스이름과 지하철 이름을 매개변수로 받으므로, bus100 과 subwayGreen 참조 변수가 가리키는 인스턴스의 이름이 초기화 되었습니다. 
  • studentJames 참조 변수가 가리키는 student 클래스의 인스턴스는 takeBus(bus100) 메서드로 버스를 탔고, studentThomas 참조 변수가 가리키는 student 클래스의 인스턴스는 takeSubway(subwayGreen) 메서드로 지하철을 탔습니다. 
  • 그러면 우리가 본 예제에서 객체의 협력이라는 것은 어디에서 이루어진 것일까요?
  • 우리의 예제에서 객체 간 협력은 학생, 버스, 지하철 사이에서 이루어졌습니다. 
  • 학생은 버스나 지하철을 이용할 수 있습니다. 학생이 버스를 선택하면 학생이 가진 돈은 1,000원이 줄고 버스 승객은 1명 증가하고 버스 수입은 1,000원이 증가합니다. 학생이 지하철을 이용하는 경우에는 학생이 가진 돈은 1,500원이 줄고 지하철 승객은 1명이 증가하고 지하철 수입은 1,500원 증가합니다. 
  • 우리가 객체를 클래스로 만들어 구현하면 이렇듯 객체 사이에는 서로 어떤 값을 주고 받는 메서드를 호출하는 일이 발생합니다. 

객체 지향 프로그래밍 정리해보기

  • 지금까지 프로그램을 구현한 과정을 정리해봅시다. 
  • 1. 필요한 객체를 찾았습니다. (우리 상황에서 필요했던 객체는 학생, 버스, 지하철입니다)
  • 2. 각 객체를 정의했습니다. (멤버 변수를 선언하고, 생성자를 정의했으며, 객체 사이의 협력 기능을 반영한 멤버 함수 선언)
  • 객체 사이의 협력 기능을 반영한 멤버 함수를 선언했다는 것은 무엇을 말하는 것일까요? 
  • '학생이 지하철을 탄다'는 학생 객체의 입장에서 사용한 문장입니다. 이를 지하철 객체의 입장에서 생각해 보면 '지하철에 학생이 탄다'입니다. 즉 하나의 경우에 대해 두 객체에서 서로 다른 일이 발생하는 것이므로 이를 각각의 클래스에서 서로 다른 기능을 가진 메서드로 구현했습니다. 이렇게 하나의 사건에 대해 각각의 객체들에 맞는 멤버 함수를 선언하는 것을 '객체 사이의 협력 기능을 반영한 멤버 함수를 선언했다'를 의미합니다.
  • 이렇게 보니, 객체 간 협력은 우리 일상의 현실을 반영했다는 것을 느낄 수 있습니다. 그래서 객체 지향 프로그램은 현실 세계를 가장 잘 반영한 프로그램 방식이라고도 부릅니다.

객체 지향 프로그래밍 연습해보기

  • ben 이라는 학생이 지각을 해서 택시를 타고 학교에 가야하는 상황입니다. 
  • taxi 클래스를 생성하고 ben 학생이 이용하는 것을 객체 사이의 협력 기능을 반영한 멤버 함수를 선언하여 구현해봅시다.
package cooperationpractice;

public class Taxi {
	int money;
	int passengerCount;
	String taxiRegion;
	String taxiName;
	
	public Taxi(String taxiRegion, String taxiName) {
		this.taxiRegion = taxiRegion;
		this.taxiName = taxiName;
	}
	
	public void take(int money) {
		this.money += money;
		this.passengerCount++;
	}
	
	public void showInfo() {
		System.out.println(taxiRegion + " " + taxiName + "의 승객 수는 " + passengerCount + "이며, 수입은 " + this.money + "원 입니다.");
	}
}
package cooperationpractice;

public class Student {
	String name;
	int money;
	
	public Student(String name, int money) {
		this.name = name;
		this.money = money;
	}
	
	public void takeBus(Bus bus) {
		this.money -= 1000;
		bus.take(1000);
	}
	
	public void takeSubway(Subway sub) {
		this.money -= 1500;
		sub.take(1500);
	}
	
	public void takeTaxi(Taxi taxi) {
		this.money -= 7000;
		taxi.take(7000);
	}
	
	public void showInfo() {
		System.out.println(this.name + "의 현재 잔액은 " + this.money + "원 입니다.");
	}
}
package cooperationpractice;

public class TakeTrans {
	public static void main(String[] args) {
		Student james = new Student("James", 10000);
		Student thomas = new Student("Thomas", 5000);
		Student ben = new Student("Ben", 17000);
		
		Bus bus100 = new Bus(100);
		Subway subwayGreen = new Subway("subwayGreen");
		Taxi taxiSeoul = new Taxi("서울", "15나1701");
		
		james.takeBus(bus100);
		thomas.takeSubway(subwayGreen);
		ben.takeTaxi(taxiSeoul);
		
		james.showInfo();
		thomas.showInfo();
		ben.showInfo();
		subwayGreen.showInfo();
		taxiSeoul.showInfo();
		bus100.shoInfo();
		
	}

}

출력값