JAVA/기초

[Java] 인터페이스(interface)와 디폴트(default) 메서드

안양큰스님 2024. 2. 27. 01:32

인터페이스(Interface)는 Java 프로그래밍 언어에서 객체 지향 프로그래밍의 핵심 개념 중 하나입니다. 인터페이스는 메서드의 선언만을 가지고 있고, 해당 메서드들의 구현은 제공하지 않습니다. 즉, 인터페이스는 메서드의 시그니처를 정의하는데 사용되며, 그 구현은 인터페이스를 구현하는 클래스에서 이루어집니다.

인터페이스의 특징

  1. 추상성(Abstractness) : 인터페이스는 추상적인 개념으로, 실제로 어떻게 동작하는지에 대한 구현을 포함하지 않습니다. 단지 어떤 메서드들이 존재하는지만을 정의합니다.
  2. 다형성(Polymorphism) : 인터페이스를 구현하는 클래스들은 모두 동일한 인터페이스 유형을 가집니다. 따라서 인터페이스는 다형성을 구현하는데 사용될 수 있습니다.
  3. 추상 메서드(Abstract Method) : 인터페이스에 선언된 메서드는 기본적으로 추상 메서드입니다. 이는 메서드의 시그니처만을 포함하고 구현은 제공되지 않습니다.
  4. 상수(Constant) : 상수 필드를 가질 수 있으며, 이들은 자동으로 `public static final`로 선언됩니다.
  5. 다중 상속(Multiple Inheritance) : 인터페이스는 다른 인터페이스로부터 상속받을 수 있습니다. Java에서는 다중 상속이 클래스간에는 허용되지 않지만 인터페이스 간에는 허용됩니다.

인터페이스의 선언

public interface MyInterface {
    // 추상 메서드 선언
    void method1();
    void method2();
    
    // 상수 선언
    int MAX_VALUE = 100;
}


위의 예시는 `MyInterface`라는 인터페이스를 정의하고 있습니다. 이 인터페이스에는 두 개의 추상 메서드와 하나의 상수가 선언되어 있습니다.

 

인터페이스의 구현

public class MyClass implements MyInterface {
    // 인터페이스의 추상 메서드 구현
    public void method1() {
        System.out.println("method1 구현");
    }
    
    public void method2() {
        System.out.println("method2 구현");
    }
}


위의 예시에서 `MyClass` 클래스는 `MyInterface` 인터페이스를 구현하고 있습니다. 따라서 이 클래스는 `method1`과 `method2` 메서드를 구현하여야 합니다.

인터페이스는 다형성을 활용하여 유연한 코드를 작성하는 데 도움이 됩니다. 또한 인터페이스를 사용함으로써 코드의 의존성을 낮추고 재사용성을 높일 수 있습니다.


 

인터페이스의 디폴트 메서드(default method)는 Java 8에서 도입된 기능으로, 인터페이스에 메서드의 구현을 제공할 수 있게 합니다. 이로써 인터페이스를 수정하지 않고도 새로운 기능을 추가할 수 있습니다. 주로 인터페이스를 구현하는 클래스에게 기본 동작을 제공하기 위해 사용됩니다.

인터페이스 디폴트 메서드의 특징

  1. default 키워드 : 디폴트 메서드는 메서드 선언 앞에 `default` 키워드를 사용하여 정의됩니다.
  2. 메서드 구현 : 디폴트 메서드는 메서드의 본문을 포함하며, 일반적인 메서드와 마찬가지로 모든 유효한 Java 코드를 포함할 수 있습니다.
  3. 오버라이드 가능 : 클래스에서 디폴트 메서드를 재정의하여 구현을 변경할 수 있습니다.
  4. 다중 상속 문제 해결 : 인터페이스에서 메서드를 제공하는 것은 다중 상속을 사용할 때 발생할 수 있는 모호성 문제를 해결합니다.

예시

interface Animal {
    void makeSound();
    
    default void sleep() {
        System.out.println("동물이 잠을 잡니다.");
    }
}

class Dog implements Animal {
    public void makeSound() {
        System.out.println("멍멍!");
    }
}


위의 예시에서 `Animal` 인터페이스에는 `makeSound()` 메서드와 `default`로 구현된 `sleep()` 메서드가 있습니다. `Dog` 클래스는 `Animal` 인터페이스를 구현하고 있으며, `sleep()` 메서드를 재정의하지 않았으므로 디폴트 구현이 사용됩니다.

주의사항

  1. 명확성 : 디폴트 메서드를 사용할 때는 해당 메서드가 인터페이스의 목적과 관련이 있는지 신중히 고려해야 합니다. 명시적으로 선언된 메서드와 디폴트 메서드의 구분이 모호해질 수 있습니다.
  2. 상속과 충돌 : 클래스에서 상속받은 메서드와 디폴트 메서드가 충돌할 수 있습니다. 이 경우 클래스에서 메서드를 오버라이드하여 충돌을 해결해야 합니다.
  3. 확장성 : 디폴트 메서드는 기존의 인터페이스에 새로운 기능을 추가하는 데 사용될 수 있지만, 인터페이스를 설계할 때 미래의 확장 가능성을 고려하여야 합니다.

인터페이스 디폴트 메서드는 Java 8부터 도입된 유용한 기능으로, 기존 코드의 호환성을 유지하면서 새로운 기능을 추가하는 데 사용됩니다. 그러나 신중하게 사용해야 하며, 명확성과 상속 충돌에 대한 이해가 필요합니다.