[Java] 인터페이스 왜 쓸까

19·2022년 10월 21일
0

Java

목록 보기
9/13
post-custom-banner

인터페이스?

인터페이스 사용을 통해 독립적인 프로그래밍이 가능하다.
클래스 간 직접적인 관계에서 인터페이스 사용을 통해 간접적인 관계로 전환할 수 있고,
이로 인해 클래스 변경으로 인한 영향을 받지 않을 수 있다.


인터페이스 사용 전

public class Main {
    public static void main(String[] args) {
        A a = new A();
        a.method(new B());
    }
}

class A {
    public void method(B b) {
        b.method();
    }
}

class B {
    public void method() {
        System.out.println("methodInB");
    }
}
[출력]
methodInB
  • 클래스 A, B가 있다.

  • A와 B는 직접적인 관계를 맺고 있다.

    • A는 B를 사용(의존)한다.
    • 이로 인해 B -> C로 변경 시, A의 변경은 불가피하다
    class A {
        // B -> C를 사용하기 때문에 변경이 필요
        //public void method(B b) {
        //    b.method();
        //}
        
        public void method(C c) {
            c.method()
        }
    }
    
    class B {
        public void method() {
            System.out.println("methodInB");
        }
    }
    
    class C  {
        public void method() {
            System.out.println("methodInC");
        }
    }
    • B -> C로 변경하니, A 클래스에서 변경이 필요하다
      • 변경에 열려있지 못하며, 강한 결합 상태

인터페이스 사용 후

인터페이스 사용으로 강한 결합을 약한 결합으로 결합도를 낮출 수 있다.

interface I {
    void method();
}
  • 인터페이스 I로 미리 구현할 메소드를 선언한다.

class B implements I {
    @Override
    public void method() {
        System.out.println("methodInB");
    }
}
  • 인터페이스로 미리 선언한 메소드를 구현한다.

선언부(인터페이스)와 구현부(구현 클래스)를 분리 -> 결합이 느슨해지며, 변경에 용이해진다


public class Main {
    public static void main(String[] args) {
        A a = new A();
        a.method(new B());
    }
}

class A {
    // Class B -> Interface I
    public void method(I i) {
        i.method();
    }
}
[출력]
methodInB
  • 이제 A 클래스는 직접적으로 B와 관계가 없다.
    • A가 사용하는 클래스가 B -> 인터페이스 I로 변경되었기 때문

인터페이스 사용 전 : A -> B
인터페이스 사용 후 : A -> I -> B

-> A는 인터페이스와 관계가 있기 때문에, B가 변경되어도 A와는 상관이 없다. (I를 구현한 클래스면 상관없음)


class C implements I {
    public void method() {
        System.out.println("methodInC");
    }
}
  • I를 구현한 클래스 C 클래스

public class Main {
    public static void main(String[] args) {
        A a = new A();
        a.method(new C());
    }
}

class A {
    public void method(I i) {
        i.method();
    }
}
[출력]
methodInC
  • 출력이 'methodInB' -> 'methodInC'로 바뀌었다.
    • 출력이 바뀌었지만, A 클래스에서 변한 건 없다.
    • A는 인터페이스 I와 관계하고 있기 때문
  • 구현체가 갈아끼워져도 A는 영향을 받지 않는다. (약한 결합)

인터페이스를 사용함으로써, 선언부와 구현부를 분리해 한 클래스의 변경이 관련된 다른 클래스에 영향을 미치지 않는 독립적인 프로그래밍이 가능하도록 할 수 있습니다.
'강한 결합 -> 약한 결합'

profile
하나씩 차근차근
post-custom-banner

0개의 댓글