Good Morning

Java 인터페이스와 다형성 이해하기 본문

Back-End/Java

Java 인터페이스와 다형성 이해하기

욘쥰 2024. 9. 28. 22:10

소개

Java 프로그래밍에서 인터페이스와 다형성은 객체 지향 설계의 핵심 개념입니다. 이 포스트에서는 간단한 예제를 통해 이 개념들을 살펴보고, 코드의 유연성과 확장성을 높이는 방법을 알아보겠습니다.

기본 예제

먼저, 인터페이스를 사용하지 않는 기본적인 코드 구조를 살펴봅시다:

class A {
    public void method(C c) {
        c.method();
    }
}

class C {
    public void method() {
        System.out.println("C클래스의 메서드");
    }
}

public class InterfaceTest {
    public static void main(String[] args) {
        A a = new A();
        a.method(new C()); // A가 C를 사용(의존)
    }
}

 

이 코드에서 클래스 A는 클래스 C에 직접적으로 의존하고 있습니다. 이는 코드의 유연성을 제한합니다.

인터페이스 도입

이제 인터페이스를 도입하여 코드를 개선해 봅시다:

interface I {
    public void method();
}

class A {
    public void method(I i) {
        i.method();
    }
}

class B implements I {
    public void method() {
        System.out.println("B클래스의 메서드");
    }
}

class C implements I {
    public void method() {
        System.out.println("C클래스의 메서드");
    }
}

public class InterfaceTest {
    public static void main(String[] args) {
        A a = new A();
        a.method(new C()); // 또는 a.method(new B());
    }
}

 

이 개선된 버전에서는:

  1. I 인터페이스를 도입하여 method()를 선언합니다.
  2. 클래스 A는 이제 특정 클래스 대신 인터페이스 I를 참조합니다.
  3. B와 C 클래스 모두 인터페이스 I를 구현합니다.

이 구조는 다음과 같은 이점을 제공합니다:

  • 더 높은 유연성: A 클래스는 I 인터페이스를 구현하는 어떤 클래스와도 작동할 수 있습니다.
  • 향상된 확장성: 새로운 클래스를 추가할 때 기존 코드를 수정할 필요가 없습니다.
  • 느슨한 결합: 클래스 간의 의존성이 줄어듭니다.

다양한 구현 방식

a.method(new C());를 대체할 수 있는 여러 방법이 있습니다:

  1. 객체 미리 생성:
  2. C c = new C(); a.method(c);
  3. 익명 클래스 사용:
  4. a.method(new I() { @Override public void method() { System.out.println("익명 클래스로 구현된 메서드"); } });
  5. 람다식 사용 (Java 8+):
  6. a.method(() -> System.out.println("람다식으로 구현된 메서드"));
  7. 메서드 참조 사용 (Java 8+):
  8. C c = new C(); a.method(c::method);
  9. 다형성을 활용한 다른 구현체 사용:
  10. a.method(new B());

결론

인터페이스와 다형성을 활용하면 더 유연하고 확장 가능한 코드를 작성할 수 있습니다. 이는 소프트웨어의 유지보수성을 높이고, 새로운 기능을 쉽게 추가할 수 있게 해줍니다. Java 프로그래밍에서 이러한 개념들을 잘 이해하고 적용하는 것은 효과적인 객체 지향 설계의 핵심입니다.