TIL

자바 - 약한 결합 및 약한 의존성

Big Iron 2023. 2. 25. 16:14

자바와 객체지향에대해 공부하다보면 약한 결합, 약한 의존성 등의 단어를 들어봤을 것이다.
나중에 코드의 수정이나 재사용을 쉽게 하기위함 이라고 생각하면 편할 것이다.

아래의 코드를 예로 들어보겠다.

public class PublicTransport {
    void move() {
        Bus bus = new Bus();
        bus.move();
    }
    public static void main (String[] args) {
        PublicTransport p = new PublicTransport();
        p.move();
    }
} // 대중교통

class Bus {
    void move() {
        System.out.println("움직이다");

    }
} // 버스

Bus 클래스와 PublicTransport 클래스가 있다. 만약 PublicTransport 클래스에서 Bus 클래스가 아니라 택시나 기차 클래스를 호출하고자 한다면
많은 변경이 불가피하다. 그렇다면 어떻게 바꿔야할지 생각해보자.

  1. 추상클래스, 인터페이스의 활용
    • 각자의 공통된 부분을 추상메서드로 만들어 상속을 통해 사용.
  2. 각 클래스에서 오버라이드 - 메서드 재정의
  3. 메인 메서드에서 객체 생성후 호출

위의 방식대로 두 가지 코드를 만들어봤다.

public class PublicTransport {

    public static void main (String[] args) {
        Bus bus = new Bus();
        Taxi taxi = new Taxi();

        bus.move();
        taxi.move();
    }
}

interface Interface {
    void move();
} // 추상메서드 집합 인터페이스

class Bus implements Interface{

    @Override
    public void move() {
        System.out.println("버스를 타다");
    }
} // 버스 클래스 - 인터페이스의 move 메서드 상속, 재정의

class Taxi implements Interface{

    @Override
    public void move() {
        System.out.println("택시를 타다");
    }
} // 택시 클래스 - 인터페이스의 move 메서드 상속, 재정의
public class PublicTransport {
    void drive(Interface in) {
        in.move();
    }
    public static void main (String[] args) {
        PublicTransport pub = new PublicTransport();

        pub.drive(new Bus());
        pub.drive(new Taxi());
    }
}

interface Interface {
    void move();
} // 추상메서드 집합 인터페이스

class Bus implements Interface{

    @Override
    public void move() {
        System.out.println("버스를 타다");
    }
} // 버스 클래스 - 인터페이스의 move 메서드 상속, 재정의

class Taxi implements Interface{

    @Override
    public void move() {
        System.out.println("택시를 타다");
    }
} // 택시 클래스 - 인터페이스의 move 메서드 상속, 재정의

이처럼 공통된 메서드를 만들어두고 클래스가 늘어나면 메서드를 가져와서 사용하면 그만이다.
조금 더 편하고 쉬운 코드를 만들기 위해 여러가지 방법을 찾아보자