Interface 쓰는 이유

이정연·2023년 7월 4일

자바기초

목록 보기
16/25

인터페이스는 애초에 미완성인 메서드를 가지고있기 때문에 동일한 이름의 필드 또는 메서드를 이용할 수 있다는 장점이있다.

즉, 역할과 구현을 분리시켜 놓았기때문에 동일한 역할이어도 구현을 다르게 할 수 있게된다.

따라서 인터페이스는 역할만을 가지고 있으며 그것에 의존하는 객체는 동일한 이름의 역할을 구현하게 된다.

public class InterfaceExample {
    public static void main(String[] args) {
        User user = new User(); // User 클래스 객체 생성
        user.callProvider(new Provider()); // Provider 객체 생성 후에 매개변수로 전달
    }
}

class User { // User 클래스
    public void callProvider(Provider provider) { // Provider 객체를 매개변수로 받는 callProvider 메서드
        provider.call();
    }
}

class Provider { //Provider 클래스
    public void call() {
        System.out.println("무야호~");
    }
}
  • 위의 코드를 보면 따로 인터페이스 없이 구현이 되어있는데, 갑자기 Provider를 Provider2 로 변경해야 한다면 어떻게 될까
  • 그렇게되면, User클래스의 callProvider의 참조변수, user.callProvider(new Provider()); 안의 Provider를 바꿔야할 것이다.
  • 한개의 클래스만 표현하고 있지만, 수천개의 클래스를 바꿔야할 수도 있다.

따라서 다음과 같이 고칠 수 있다.

interface Cover { // 인터페이스 정의
    public abstract void call();
}

public class Interface4 {
    public static void main(String[] args) {
        User user = new User();
        user.callProvider(new Provider2());
    }
}

class User {
    public void callProvider(Cover cover) { // 매개변수의 다형성 활용
        cover.call();
    }
}

class Provider implements Cover {
    public void call() {
        System.out.println("무야호~");
    }
}

class Provider2 implements Cover {
    public void call() {
        System.out.println("야호~");
    }
}

//출력값
야호~
  • 위의 코드에서 인터페이스는 call이라는 메서드의 역할만가지고 있다.
  • 결국 인터페이스의 목적은 main 에서 user.callProvider(new Provider2());의 참조변수만을 바꾸면서 기능을 구현하는데에있다.
  • 기존코드는 User의 참조변수까지 바꿔야했지만, 인터페이스인 Cover만을 참조해주면 call 메서드에 한하여 여러가지로 구현이 가능하게된다.
profile
반갑습니다.

0개의 댓글