중앙정보기술인재개발원/JAVA

[JAVA] 인터페이스

soidev 2025. 4. 7. 17:23

인터페이스

   개발코드와 객차가 서로 통신하는 접점 역할을 함. 개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출시킴. 그렇기 때문에 개발 코드는 객체의 내부 구조를 알 필요가 없고 인터페이스의 메소드만 알고 있으면 됨

  • 하나의 객체가 아니라 여러 객체들과 사용이 가능하므로 어떤 객체를 사용하느냐에 따라서 실행 내용과 리턴값이 다름.
    1. 인터페이스 선언
      • [public ] interface 인터페이스이름 {***}
      • 객체 사용 방법을 정의한 것이므로 인스턴스 또는 정적 필드를 선언할 수 없음
      • 그래서 상수필드는 선언이 가능함  → public static final
      • 인터페이스에 선언된 메소드는 전부 다 '추상메소드(abstract)'임
      • 전역 접근 방식 제공  :  static 메서드를 통해 객체를 가져오도록 함
    2. 사용하는 이유
      • 다형성 지원(Polymorphism) 
        하나의 인터페이스로 여러 개의 구현체를 다룰 수 있어 코드의 확장성이 증가
      • 코드의 결합도(Dependency) 감소
        실제 구현 클래스에 의존하지 않고, 인터페이스를 통해 객체를 다룰 수 있음 - 유지보수 쉬워짐
      • 실행 시점에서 결정됨(동적 바인딩)
      • 기능을 명확하게 명시
    3. 다형성 적용
      • 메서드 호출 시 적용되는 개념
      • 같은 인터페이스(또는 부모 클래스) 타입의 변수를 통해 다른 객체가 들어와도 그 객체의 메서드가 호출될때 각각 다른 동작을 수행하는 것
      • 표준화 제공

📌 인터페이스 vs 상속 (extends) 차이점

인터페이스 (implements)상속 (extends)

 

목적 기능(행동)의 규약(설계도) 제공 기존 클래스의 코드 재사용 & 확장
다중 구현 가능 여부 ✅ 가능 (Java에서는 여러 개의 인터페이스를 구현 가능) ❌ 불가능 (Java는 단일 상속만 지원)
메서드 구현 여부 메서드 선언만 존재 (구현 X, 단 Java 8부터 default 메서드 가능) 부모 클래스의 메서드를 상속받아 사용 가능 (재정의 가능)
필드(변수) 포함 여부 필드 가질 수 없음 (상수만 가능 static final) 필드(변수) 가질 수 있음
접근 제한자 기본적으로 public (모든 구현 클래스에서 사용 가능) private, protected, public 등 다양한 접근 제한자 사용 가능
사용 예시 여러 개의 클래스에서 같은 기능을 강제하고 싶을 때 (ex. Animal 인터페이스) 기존 클래스의 기능을 확장하고 싶을 때 (ex. Mammal → Dog)

 

📌 언제 상속을 쓰고, 언제 인터페이스를 써야 할까?

✅ 인터페이스 사용하면 좋은 경우✅ 상속 사용하면 좋은 경우
여러 개의 클래스에서 같은 동작(메서드)을 강제하고 싶을 때 기존 클래스를 확장하고 새로운 기능을 추가하고 싶을 때
특정 행동을 표준화(규칙화)하고 싶을 때 부모 클래스의 기능을 그대로 가져와서 쓰고 싶을 때
다중 구현이 필요할 때 부모 클래스의 공통 필드(변수)와 메서드를 공유하고 싶을 때

 

예제 코드

interface Animal {
    void makeSound();
    void move();  // 두 번째 기능 추가
}

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

    public void move() {
        System.out.println("네 발로 뛰어요!");
    }
}

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

    public void move() {
        System.out.println("날아다녀요!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Dog();
        myAnimal.makeSound();  // 출력: 멍멍!
        myAnimal.move();       // 출력: 네 발로 뛰어요!

        myAnimal = new Bird();
        myAnimal.makeSound();  // 출력: 짹짹!
        myAnimal.move();       // 출력: 날아다녀요!
    }
}

 

 

 

'중앙정보기술인재개발원 > JAVA' 카테고리의 다른 글

[JAVA] 예외 처리 | try ~ catch  (1) 2025.04.07
[JAVA] 람다식(Lamda)  (0) 2025.04.07
[JAVA] Linked List  (3) 2025.04.01
[JAVA] 상속, 다형성  (0) 2025.03.27
[JAVA] Depdency, DI, Composition, Aggregation  (1) 2025.03.26