선릉역 1번 출구

9. 인터페이스 본문

Language/Java

9. 인터페이스

choideu 2023. 11. 23. 15:45

상속과 달리 여러 인터페이스 implements 가능함

-> 모호성이 없기 때문임

 

인터페이스

 

  • 모든 메서드가 추상 메서드로 선언됨 public abstract
    • 추상 메서드로 선언된다는 말은 구현 코드가 없다는 것임
    • 자바 8 부터 디폴트 메서드(default method)와 정적 메서드(static method) 기능의 제공으로 일부 구현 코드가 있음
  • 모든 변수는 상수로 선언됨 public static final
<인터페이스가 하는 일>

1. 클래스나 프로그램이 제공하는 기능을 명시적으로 선언

2. 일종의 클라이언트 코드와의 약속이며 클래스나 프로그램이 제공하는 명세(specification)

3. 클라이언트 프로그램은 인터페이스에 선언된 메서드 명세만 보고 이를 구현한 클래스를 사용할 수 있음

4. 어떤 객체가 하나의 인터페이스 타입이라는 것은 그 인터페이스가 제공하는 모든 메서드를 구현했다는 의미임

5. 인터페이스를 구현한 다양한 객체를 사용함 - 다형성

예) JDBC 인터페이스

 

인터페이스의 요소

  • 상수
  • 추상 메서드
  • 디폴트 메서드
    • 구현을 가지는 메서드로 인터페이스를 구현하는 클래스들에서 공통으로 사용할 수 있는 기본 메서드
  • 정적 메서드
    • 인스턴스 생성과 상관 없이 인터페이스 타입으로 사용할 수 있는 메서드
  • private 메서드
    • 인터페이스를 구현한 클래스에서 사용하거나 재정의할 수 없음
    • 인터페이스 내부에서만 사용하기 위해 구현하는 메서드
    • default 메서드나 static 메서드에서 사용함
interface Calc {
    double PI = 3.14;
    int ERROR = -9;
    
    int add(int nu1, int num2);
    
    default void description(){
        System.out.println("정수의 사칙연산을 제공합니다.");
    }
    
    static int total(int[] arr){
        int total = 0;
        for(int num : arr){
            total += num;
        }
        return total;
    }
}

class InterCalc implements Calc{
    @Override
    public int add(int num1, int num2){
        return num1 + num2;
    }
}

public class Test{
    public static void main (String[] args) {
        InterCalc test = new InterCalc();
        int addNum = test.add(1, 2);
        
        test.description();
        
        int[] arr = {1,2,3,4,5};
        System.out.println(Calc.total(arr));
    }
}

 

더보기

interface A {
    void buy();
}

class B {
    public void buy(){
        System.out.println("B 구매");
    }
}

class C extends B implements A{
    
}

public class Test{
    public static void main (String[] args) {
        C c = new C();
        c.buy();

    }

// 해당 코드에서 클래스 C에서 buy()를 오버라이딩하지 않아도 되는 건 B를 상속하기 때문에 B의 buy()함수가 구현된 것이 클래스 A의 buy()를 오버라이딩한 것으로 인식하기 때문이야?

 

답변 with ChatGPT

네, 맞습니다. 클래스 C가 클래스 B를 상속하면서 동시에 인터페이스 A를 구현하는 경우, 클래스 B의 buy() 메서드를 상속받아서 인터페이스 A의 buy() 메서드를 오버라이딩한 것으로 간주됩니다. 인터페이스 A에는 buy() 메서드가 선언되어 있고, 클래스 C가 B를 상속하면서 A를 구현하였으므로 C 클래스는 A 인터페이스의 buy() 메서드를 구현한 것으로 간주됩니다.

따라서 클래스 C의 인스턴스를 생성하고 buy() 메서드를 호출하면, 클래스 B에서 상속한 buy() 메서드가 실행됩니다. 클래스 C에서 명시적으로 buy()를 오버라이딩하지 않아도 되는 것은 B에서 이미 해당 메서드를 구현하고 있기 때문입니다.

'Language > Java' 카테고리의 다른 글

8. 템플릿 메서드 패턴(template method pattern)  (0) 2023.11.23
7. 추상 클래스  (0) 2023.11.23
6. 자바의 특징  (0) 2023.11.23
5. 배열의 정규화  (0) 2023.11.21
4. 얕은 복사 vs 깊은 복사  (2) 2023.11.21
Comments