본문 바로가기

카테고리 없음

인터페이스

자바에서 인터페이스는 클래스의 기능을 정의하고 구현하는 중요한 개념입니다. 인터페이스를 사용하면 다양한 클래스가 공통된 메서드 집합을 구현하도록 강제할 수 있으며, 객체 지향 프로그래밍의 다형성, 코드 재사용성, 그리고 유연성을 높일 수 있습니다.

인터페이스의 기본 개념
인터페이스 정의: 인터페이스는 메서드의 시그니처만 정의하고, 메서드의 구현은 포함하지 않습니다. 클래스가 인터페이스를 구현하면, 그 클래스는 인터페이스에서 정의된 모든 메서드를 구현해야 합니다.

형식:

java
코드 복사
public interface InterfaceName {
    // 상수 정의 (optional)
    int CONSTANT = 100;

    // 추상 메서드 정의
    void method1();
    int method2(int param);
}
인터페이스 구현: 클래스가 인터페이스를 구현하면, 해당 클래스는 인터페이스에서 정의된 모든 메서드를 구체적으로 구현해야 합니다.

형식:

java
코드 복사
public class ClassName implements InterfaceName {
    @Override
    public void method1() {
        // 메서드 구현
    }

    @Override
    public int method2(int param) {
        // 메서드 구현
        return 0;
    }
}
인터페이스의 주요 특징
다중 상속: 자바에서는 클래스는 단일 상속만 가능하지만, 인터페이스는 다중 상속을 지원합니다. 즉, 하나의 클래스가 여러 인터페이스를 구현할 수 있습니다.

예제:

java
코드 복사
public interface InterfaceA {
    void methodA();
}

public interface InterfaceB {
    void methodB();
}

public class CombinedClass implements InterfaceA, InterfaceB {
    @Override
    public void methodA() {
        System.out.println("Method A");
    }

    @Override
    public void methodB() {
        System.out.println("Method B");
    }
}
디폴트 메서드: 자바 8부터 인터페이스는 디폴트 메서드를 지원합니다. 디폴트 메서드는 인터페이스에 기본 구현을 제공할 수 있는 메서드입니다.

예제:

java
코드 복사
public interface MyInterface {
    // 디폴트 메서드
    default void defaultMethod() {
        System.out.println("This is a default method.");
    }
}
정적 메서드: 자바 8부터 인터페이스는 정적 메서드를 정의할 수 있습니다. 정적 메서드는 인터페이스 이름을 통해 직접 호출할 수 있으며, 인터페이스에 속하지만 인스턴스 메서드는 아닙니다.

예제:

java
코드 복사
public interface Utility {
    static void staticMethod() {
        System.out.println("This is a static method.");
    }
}
상수: 인터페이스에 정의된 필드는 자동으로 public, static, final입니다. 인터페이스의 필드는 상수로 사용됩니다.

예제:

java
코드 복사
public interface Constants {
    int MAX_VALUE = 100;
}
인터페이스의 사용 예
인터페이스는 주로 다음과 같은 용도로 사용됩니다:

다형성: 인터페이스를 통해 서로 다른 클래스들이 동일한 메서드 집합을 구현함으로써, 다양한 객체를 동일한 방식으로 다룰 수 있습니다.

클래스와의 분리: 인터페이스를 사용하면 클래스의 구현과 관계없이 공통된 기능을 정의할 수 있습니다. 이는 코드의 모듈화와 유지보수를 용이하게 합니다.

API 설계: 인터페이스는 API를 설계할 때, 구체적인 구현에 의존하지 않고 추상적인 동작을 정의하는 데 유용합니다.

예제:

java
코드 복사
public interface Drawable {
    void draw();
}

public class Circle implements Drawable {
    @Override
    public void draw() {
        System.out.println("Drawing a circle.");
    }
}

public class Square implements Drawable {
    @Override
    public void draw() {
        System.out.println("Drawing a square.");
    }
}

public class Main {
    public static void main(String[] args) {
        Drawable[] shapes = { new Circle(), new Square() };

        for (Drawable shape : shapes) {
            shape.draw(); // 다형성: 각 객체의 draw() 메서드 호출
        }
    }
}
인터페이스와 추상 클래스 비교
인터페이스와 추상 클래스는 비슷한 목적을 가지고 있지만, 다음과 같은 차이점이 있습니다:

다중 상속: 인터페이스는 다중 상속을 지원하지만, 추상 클래스는 단일 상속만 지원합니다.

구현: 인터페이스는 기본적으로 메서드의 시그니처만 정의하고, 메서드의 구현은 포함하지 않습니다. 반면, 추상 클래스는 메서드의 구현을 포함할 수 있습니다.

필드: 인터페이스의 필드는 상수만 정의할 수 있으며, 추상 클래스는 일반 필드와 메서드, 그리고 추상 메서드를 정의할 수 있습니다.

사용 목적: 인터페이스는 주로 다양한 클래스들이 공통된 동작을 구현하도록 할 때 사용하며, 추상 클래스는 공통된 필드와 메서드를 여러 서브클래스에 제공할 때 사용됩니다.

요약
인터페이스는 클래스에 특정 메서드의 구현을 강제하고, 여러 클래스에서 공통된 기능을 정의할 때 사용됩니다.
다중 상속을 지원하며, 디폴트 메서드와 정적 메서드를 통해 기본 구현을 제공할 수 있습니다.
상수를 정의할 수 있으며, 다형성을 지원하여 다양한 객체를 동일한 방식으로 다룰 수 있게 합니다.
인터페이스를 통해 자바 프로그램의 유연성과 확장성을 높이고, 다양한 클래스 간의 통일된 동작을 정의할 수 있습니다.