본문 바로가기
Android/Java

[ Java ] 인터페이스(interface)의 핵심 이해: 주요 특징과 사용 예시

by quessr 2024. 4. 1.

 

 

   public interface ItemTouchHelperExListener {
        void onItemMoveCompleted(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder);
    }

인터페이스는 자바에서 매우 중요한 개념 중 하나로서,
자바 프로그래밍에서 객체 간의 상호작용을 위한 중요한 수단으로 사용된다.
객체가 어떤 메소드를 가지고 있어야 할 지를 정의 하지만, 이 메소드들이 어떻게 구현되어야 하는 지는 정의하지 않는다.

인터페이스는 오로지 추상 메소드(구현부가 없는 메소드)와 상수만을 멤버로 가질 수 있다.

 

인터페이스의 주요 특징

1. 추상 메소드 

: 인터페이스 내의 모든 메소드는 기본적으로 추상 메소드이다.
즉, 메소드의 선언만 있고 구현부는 없다.

 

2. 상수만 포함 가능

: 인터페이스에서 "상수만 포함 가능하다"는 말은,
인터페이스 내에서 선언할 수 있는 필드가 오직 public, static, final 특성을 가진 상수만 가능하다는 의미이다.
즉, 인터페이스 내의 모든 필드는 자동으로 public, static, final로 선언되며 이는 변경할 수 없는 상수를 의미한다.

 

3. 다중 상속 가능
: 하나의 클래스가 여러 인터페이스를 구현 할 수 있다.

이는 자바 클래스가 다중 상속을 지원하지 않기 때문에 인터페이스를 통해 다중 상속과 유사한 효과를 낼 수 있게 한다.

 

인터페이스의 사용 이유

1. 계약 제공
: 인터페이스는 클래스가 구현해야 하는 메소드의 시그니처를 정의함으로써, 해당 클래스가 어떤 기능을 수행할 것인지에 대한 계약을 제공한다.
이를 통해 개발자는 구현의 세부 사항에 신경 쓰지 않고도 사용할 수 있다.

 

2. 다형성
: 인터페이스를 통해 다양한 구현을 가진 객체를 동일한 타입으로 처리할 수 있다.

이는 코드의 유연성과 재사용성을 높여준다.

다음은 다형성을 개념을 이해하기 쉽게 구현 한 예시이다.

interface 동작 {
    void 실행();
}

class 걷기 implements 동작 {
    public void 실행() {
        System.out.println("걷고 있습니다.");
    }
}

class 달리기 implements 동작 {
    public void 실행() {
        System.out.println("달리고 있습니다.");
    }
}

class 점프하기 implements 동작 {
    public void 실행() {
        System.out.println("점프하고 있습니다.");
    }
}

public class Main {
    public static void main(String[] args) {
        동작 myAction = new 걷기();
        myAction.실행();  // "걷고 있습니다." 출력

        myAction = new 달리기();
        myAction.실행();  // "달리고 있습니다." 출력

        myAction = new 점프하기();
        myAction.실행();  // "점프하고 있습니다." 출력
    }
}

 

3. 결합도 감소

: 인터페이스를 사용하면 구현 클래스들과의 결합도를 낮출 수 있다. 이는 시스템의 유지보수성과 확장성을 향상시킨다.

 

인터페이스 구현 예시

1. 인터페이스 선언

먼저, ItemTouchHelperExListener라는 이름의 인터페이스를 선언한다.
이 인터페이스는 아이템 이동이 완료 되었을 때 호출될 메소드 onItemMoveCompleted를 포함한다.

public interface ItemTouchHelperExListener {
     void onItemMoveCompleted(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder);
 }


2. 인터페이스 참조 변수 선언

ItemTouchHelperExListener 타입의 참조 변수 completionListener를 선언한다.

이 변수는 나중에 구현 객체를 담는 데 사용 된다.

 

private ItemTouchHelperExListener completionListener;


3. 메소드에서 인터페이스 호출

clearView 메소드 내에서 completionListener가 null이 아니라면,
즉, 어떤 구현 객체가 할당되었다면 그 객체의 onItemMoveCompleted 메소드를 호출한다.

 

    @Override
    public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
        super.clearView(recyclerView, viewHolder);
        recyclerView.getAdapter().notifyDataSetChanged();

        if (this.completionListener != null) {
            this.completionListener.onItemMoveCompleted(recyclerView, viewHolder);
        }
    }

 

4. 인터페이스 구현

ItemTouchHelperCallback 클래스의 인스턴스를 생성할 때,
ItemTouchHelperExListener 인터페이스를 익명 클래스로 구현하여 전달한다.
이 구현에서는
onItemMoveCompleted 메소드를 오버라이드하여 필요한 로직을 수행한다.

 

    touchHelper = new ItemTouchHelper(new ItemTouchHelperCallback(addedAdapter, new ItemTouchHelperCallback.ItemTouchHelperExListener() {
            @Override
            public void onItemMoveCompleted(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
                saveButtonCheck(true);
            }
        }));