[java] 자바 추상 클래스와 인터페이스의 정적 메서드와 디폴트 메서드 차이

자바에서는 추상 클래스와 인터페이스를 사용하여 객체 지향 프로그래밍을 구현할 수 있습니다. 이 둘은 각각 다른 목적과 특징을 가지고 있으며, 정적 메서드와 디폴트 메서드를 사용하는 방법도 서로 다릅니다.

추상 클래스

추상 클래스는 일부 메서드를 구현하지 않고 남겨두는 추상 메서드를 포함할 수 있는 클래스입니다. 추상 클래스는 다른 클래스에서 상속받아 사용될 목적으로 설계되며, 객체의 공통 동작을 정의하고 상속받는 클래스에서 구체적인 동작을 구현하는 데에 사용됩니다.

추상 클래스는 일반적으로 abstract 키워드를 사용하여 선언되며, 추상 메서드를 포함할 수 있습니다. 추상 메서드는 구현하지 않고 선언만 하는 메서드입니다. 추상 클래스는 추상 메서드를 하나 이상 포함해야 하며, 추상 메서드를 포함한 클래스는 반드시 추상 클래스로 선언되어야 합니다.

abstract class AbstractClass {
    public abstract void abstractMethod();
    
    public void concreteMethod() {
        // 구현된 메서드
    }
}

추상 클래스는 일반적인 메서드 외에도 필드, 생성자 등을 가질 수 있습니다. 상속을 통해 다른 클래스에서 추상 클래스를 확장하고, 추상 메서드를 오버라이딩하여 필요한 구현을 완성할 수 있습니다.

인터페이스

인터페이스는 모든 메서드가 추상 메서드인 클래스입니다. 인터페이스는 클래스와 클래스 사이의 계약(Contract) 역할을 하며, 일반적인 동작을 정의하고 이를 구현하는 클래스에서 실제 동작을 구현합니다.

인터페이스는 interface 키워드를 사용하여 선언되며, 인터페이스에 정의된 모든 메서드는 암시적으로 publicabstract입니다. 따라서 인터페이스에서는 메서드의 본문을 구현하지 않고, 메서드만 선언합니다.

interface MyInterface {
    void interfaceMethod();
}

인터페이스는 다중 상속이 가능하며, 클래스에서 인터페이스를 구현할 때는 implements 키워드를 사용합니다. 인터페이스를 구현하는 클래스는 인터페이스에 선언된 모든 메서드를 구현해야 합니다.

class MyClass implements MyInterface {
    public void interfaceMethod() {
        // 인터페이스의 메서드 구현
    }
}

정적 메서드

정적 메서드(Static Method)는 클래스의 인스턴스 생성 없이 호출할 수 있는 메서드입니다. 추상 클래스와 인터페이스는 모두 정적 메서드를 가질 수 있지만, 사용 방법이 약간 다릅니다.

추상 클래스의 정적 메서드는 상속받는 클래스에서 직접 호출할 수 있으며, 정적 메서드는 일반적인 Java 클래스 메서드처럼 구현됩니다.

abstract class AbstractClass {
    public static void staticMethod() {
        // 정적 메서드 구현
    }
}

class MyClass extends AbstractClass {
    public void someMethod() {
        staticMethod(); // 상속받은 추상 클래스의 정적 메서드 호출
    }
}

인터페이스의 정적 메서드는 InterfaceName.methodName()과 같은 형식으로 호출됩니다. 인터페이스를 구현하는 클래스를 통해 호출할 수도 있지만, 일반적으로 인터페이스 이름을 직접 사용하여 호출합니다.

interface MyInterface {
    static void staticMethod() {
        // 정적 메서드 구현
    }
}

class MyClass implements MyInterface {
    public void someMethod() {
        MyInterface.staticMethod(); // 인터페이스의 정적 메서드 호출
    }
}

디폴트 메서드

디폴트 메서드(Default Method)는 인터페이스에 기본 구현이 포함된 메서드입니다. 디폴트 메서드는 인터페이스를 구현하는 클래스에서 필요에 따라 오버라이딩할 수 있으며, 기본적으로 인터페이스의 일부 메서드를 구현하는 방법입니다.

인터페이스에서 디폴트 메서드를 정의할 때는 default 키워드를 사용합니다. 구현체에서 디폴트 메서드를 오버라이딩하지 않으면 인터페이스의 기본 구현이 사용됩니다.

interface MyInterface {
    default void defaultMethod() {
        // 디폴트 메서드 구현
    }
}

클래스에서 인터페이스의 디폴트 메서드를 오버라이딩하면 인터페이스의 기본 구현보다 우선하여 사용됩니다.

class MyClass implements MyInterface {
    public void defaultMethod() {
        // 인터페이스의 디폴트 메서드를 오버라이딩
    }
}

결론

자바에서는 추상 클래스와 인터페이스를 사용하여 객체 지향 프로그래밍을 구현할 수 있습니다. 추상 클래스는 상속과 함께 사용되며, 공통 동작을 정의하고 구체적인 동작을 구현하는데 사용됩니다. 인터페이스는 클래스와 클래스 사이의 계약 역할을 하며, 메서드의 기본 구현을 제공하기 위해 정적 메서드와 디폴트 메서드를 사용할 수 있습니다. 상황과 목적에 맞게 추상 클래스와 인터페이스, 정적 메서드와 디폴트 메서드를 선택하여 탄탄하고 유연한 코드를 작성할 수 있습니다.


참고 자료