객체 간의 협력 (Collaboration)
객체 지향 프로그램에서 객체 간에는 협력이 이루어진다.
자바 객체 간의 협력은 객체 지향 프로그래밍에서 매우 중요하다. 객체는 다른 객체와 상호작용하면서 비즈니스 로직 수행에 필요한 데이터를 처리한다.
협력을 위해서는 먼저 다른 객체에게 요청을 전송해야 한다. 이러한 요청을 메세지라고 한다.
메세지를 처리하는 기능은 메서드이다. 객체는 다른 객체에게 메세지를 전송할 때, 메세지를 처리할 수 있는 메소드를 가지고 있는지 확인한다. 메소드가 존재하면 해당 메소드를 호출하여 메세지를 처리하고 결과를 반환한다.
두 학생이 버스와 지하철을 타는 상황을 구현해 보자.
James와 Tomas는 각각 버스와 지하철을 타고 학교에 갑니다.
James는 5000원을 가지고 있었고, 100번 버스를 타면서 1000원을 지불합니다.
Tomas는 10000원을 가지고 있었고, 초록색 지하철을 타면서 1200원을 지불합니다.
Student.java
public class Student {
String name;
int money;
int busCost;
int subwayCost;
public Student(String name, int money){
this.name = name;
this.money = money;
busCost = 1000;
subwayCost = 1200;
}
public void takeBus(Bus bus){
bus.take(busCost);
this.money -= busCost;
}
public void takeSubway(Subway subway){
subway.take(subwayCost);
this.money -= subwayCost;
}
public void showInfo(){
System.out.println(name + "의 남은 돈: " + money);
}
}
Bus.java
public class Bus {
int number;
int passengerCount;
int earnings;
public Bus(int number){
this.number = number;
}
public void take(int money) {
passengerCount += 1;
earnings += money;
}
public void showBusInfo(){
System.out.println("버스 넘버: " + number + " 탑승 승객: " + passengerCount + " 수입: " + earnings);
}
}
Subway.java
public class Subway {
int number;
int passengerCount;
int earnings;
public Subway(int number){
this.number = number;
}
public void take(int money) {
passengerCount += 1;
earnings += money;
}
public void showSubwayInfo(){
System.out.println("지하철 넘버: " + number + " 탑승 승객: " + passengerCount + " 수입: " + earnings);
}
}
main.java
public class TakeTransTest {
public static void main(String[] args) {
Student studentJames = new Student("James", 5000);
Student studentTomas = new Student("Tomas", 10000);
Bus bus100 = new Bus(100);
Subway subway2 = new Subway(2);
studentJames.takeBus(bus100);
studentTomas.takeSubway(subway2);
studentJames.showInfo();
studentTomas.showInfo();
bus100.showBusInfo();
subway2.showSubwayInfo();
}
}
James의 남은 돈: 4000
Tomas의 남은 돈: 8800
버스 넘버: 100 탑승 슥객: 1 수입: 1000
지하철 넘버: 2 탑승 슥객: 1 수입: 1200
해당 예제에서는 Student
클래스로 생성된 학생 인스턴스는 각각 Bus
, Subway
에 의해 생성된 인스턴스에게 메세지를 보내 객체간 협력을 요청한다.
자바에서는 인터페이스를 통해 객체 간의 협력을 구현할 수 있다. 인터페이스는 객체가 어떤 메세지를 수신할 수 있는지를 정의한다. 이를 통해 객체간의 협력을 유연하게 구현할 수 있다.
인터페이스
자바에서 인터페이스는 interface
예약어를 사용하여 정의한다. 인터펭시는 추상 메서드와 상수필드로 이루어져 있으며, 클래스와 마찬가지로 패키지 내에서 사용된다. 인터페이스를 구현하는 클래스는 해당 인터페이스의 모든 추상 메서드를 오버라이드하여 구현해야 한다.
인터페이스를 사용하면 객체 간 협력을 유연하게 구현할 수 있다. 예를 들어, 자동차와 엔진이 있다고 가정해보자.
public interface Engine {
public void start();
public void stop();
}
public class GasolineEngine implements Engine {
public void start() {
// gasoline engine specific code here
}
public void stop() {
// gasoline engine specific code here
}
}
public class ElectricEngine implements Engine {
public void start() {
// electric engine specific code here
}
public void stop() {
// electric engine specific code here
}
}
여러 종류의 엔진은 공통적으로 가져야하는 기능이 존재한다. 그러므로 각 엔진은 Engine
인터페이스를 상속받아 추상메서드를 구현하게 된다.
public class Car {
private Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
public void start() {
engine.start();
}
public void stop() {
engine.stop();
}
}
엔진을 사용하는 Car
클래스의 경우 사용할 엔진을 매개값으로 전달만 하면 각 엔진에 맞는 동작을 수행하기 때문에 유연하게 객체간 협력이 이루어질 수 있다.
인터페이스를 사용하여 객체 간 협력을 구현하면 코드 유지보수성과 확장성을 높일 수 있다.
또한, 객체 지향 프로그래밍의 핵심인 다형성을 구현할 수 있어 코드의 재사용성을 높일 수 있다.
'JAVA' 카테고리의 다른 글
[JAVA] 싱글톤 패턴 (Singleton pattern) (0) | 2023.03.22 |
---|---|
[JAVA] Static (1) | 2023.03.22 |
[JAVA] This (0) | 2023.03.21 |
[JAVA] 정보 은닉과 캡슐화 (0) | 2023.03.21 |
[JAVA] 람다식 (lambda Expressions) (0) | 2023.03.21 |