인터페이스

hoon·2025년 1월 16일

JAVA

목록 보기
9/21

1. 인터페이스란?

인터페이스는 객체지향 프로그래밍에서 클래스가 따라야 할 규격을 정의하는 것으로, 추상 메서드와 상수만 포함할 수 있다. 인터페이스를 구현하는 클래스는 인터페이스에서 정의된 모든 메서드를 반드시 구현해야 한다.


2. 인터페이스의 특징

  1. 추상 메서드만 선언 가능 (Java 8 이전)

    메서드는 구현 없이 선언만 가능하다.

    final 을 붙이면 오버라이드가 안된다!!

    public interface Example {
        void methodA();  // 추상 메서드
    }
    
  2. Java 8 이후 추가 기능

    • 디폴트 메서드 (default method)
      메서드에 기본 구현을 제공할 수 있다.
    • 정적 메서드 (static method)
      객체 생성 없이 호출 가능한 정적 메서드를 정의할 수 있다.
  3. Java 9 이후

    • private 메서드
      인터페이스 내부에서만 사용 가능한 private 메서드 정의가 가능하다.
  4. 다중 상속 지원

    클래스는 단일 상속만 가능하지만, 인터페이스는 다중 구현이 가능하다.

  5. 필드는 자동으로 public static final
    인터페이스에 선언된 모든 변수는 상수로 취급된다.

    ```java
    int CONSTANT = 10;  // public static final int CONSTANT = 10;
    
    ```

3. 문법

인터페이스 정의

final 을 붙이면 오버라이드가 안된다!!

접근 제한자는 public이 다 생략 되어 있다

public interface MyInterface {
    // 상수: public static final이 자동으로 적용됩니다 (생략됨).
    // 오버라이드 불가 (상수는 재정의할 수 없음).
    // 상수필드는 생성자가 존재하지 않아 선언과 동시에 초기화 해야한다.
    int CONSTANT = 100;  // public static final int CONSTANT = 100;

    // 추상 메서드: public abstract가 자동으로 적용됩니다 (생략됨).
    // 오버라이드 가능 (구현 클래스에서 반드시 재정의해야 함).
    void abstractMethod();  // public abstract void abstractMethod();

    // 디폴트 메서드: public이 자동으로 적용됩니다 (생략됨).
    // 오버라이드 가능 (구현 클래스에서 재정의할 수 있음).
    default void defaultMethod() {
        System.out.println("디폴트 메서드입니다.");
    }

    // 정적 메서드: public이 자동으로 적용됩니다 (생략됨).
    // 오버라이드 불가 (정적 메서드는 클래스/인터페이스에 속하며 재정의할 수 없음).
    //정적 메서드는 본질적으로 오버라이드가 불가능하기 때문에, 굳이 final을 붙일 필요가 없습니다.
    static void staticMethod() {
        System.out.println("정적 메서드입니다.");
    }
}

인터페이스 구현

class MyClass implements MyInterface {
    @Override
    public void abstractMethod() {
        System.out.println("추상 메서드를 구현했습니다.");
    }
}

인터페이스 사용

public class Main {
    public static void main(String[] args) {
        MyClass myClass = new MyClass();
        myClass.abstractMethod();    // 추상 메서드 구현 호출
        myClass.defaultMethod();    // 디폴트 메서드 호출
        MyInterface.staticMethod(); // 정적 메서드 호출
    }
}

4. 주요 개념

다중 구현

한 클래스에서 여러 인터페이스를 구현할 수 있다.

interface A {
    void methodA();
}

interface B {
    void methodB();
}

class C implements A, B {
    @Override
    public void methodA() {
        System.out.println("A 메서드 구현");
    }

    @Override
    public void methodB() {
        System.out.println("B 메서드 구현");
    }
}

다중 상속 충돌 문제

디폴트 메서드가 여러 인터페이스에 정의된 경우, 명시적으로 오버라이딩해야 한다.

interface A {
    default void display() {
        System.out.println("A 인터페이스");
    }
}

interface B {
    default void display() {
        System.out.println("B 인터페이스");
    }
}

class C implements A, B {
    @Override
    public void display() {
        System.out.println("C에서 디폴트 메서드 오버라이딩");
    }
}

인터페이스 상속

인터페이스끼리 상속할 수 있다.

interface Parent {
    void parentMethod();
}

interface Child extends Parent {
    void childMethod();
}

class MyClass implements Child {
    @Override
    public void parentMethod() {
        System.out.println("Parent 메서드 구현");
    }

    @Override
    public void childMethod() {
        System.out.println("Child 메서드 구현");
    }
}

5. 인터페이스와 추상 클래스의 비교

특징인터페이스추상 클래스
메서드추상 메서드, 디폴트 메서드, 정적 메서드 가능추상 메서드와 일반 메서드 가능
필드상수만 선언 가능 (자동으로 public static final)일반 필드 및 상수 선언 가능
다중 상속다중 구현 가능단일 상속만 가능
생성자생성자 없음생성자 존재
사용 목적클래스 간 공통된 행동 규약 제공공통된 필드와 메서드를 공유하며 일부 구현 제공

6. 실사용 예제

예제: 다형성 구현

interface Animal {
    void sound();
}

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

class Cat implements Animal {
    @Override
    public void sound() {
        System.out.println("야옹!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog();
        Animal cat = new Cat();

        dog.sound();  // 멍멍!
        cat.sound();  // 야옹!
    }
}

7. 장점과 단점

장점

  • 다중 상속 지원: 다중 구현을 통해 유연한 설계 가능.
  • 구현 강제: 공통 규격을 제공해, 일관된 코드 작성.
  • 결합도 낮춤: 인터페이스를 통해 느슨한 결합 구조를 설계.

단점

  • 코드의 복잡성이 증가.
  • 모든 메서드를 구현해야 하므로 개발자가 많은 코드를 작성해야 할 수 있음.

8. 정리

  • 인터페이스는 규격을 정의하며, 구현 클래스에서 동작을 정의한다.
  • Java 8 이후부터는 디폴트 메서드와 정적 메서드 지원으로 인터페이스의 활용도가 높아졌다.
  • 추상 클래스와 함께 사용하면 객체지향 설계에서 강력한 도구로 활용 가능하다.
interface AAA {}
interface BBB extends {}
interface CCC extends AAA, BBB {}
//인터페이스는 다중 상속 가능

class EEE{}
class DDD extends EEE{}

class EEE implements AAA, BBB{}

//interface의 부모로 class는 사용 할 수 없다

0개의 댓글