자바 (ref. 자바의정석)

인터페이스(interface) - JAVA

쿠쿠s 2022. 2. 21. 14:49

 

인터페이스(inteface) 란?

 

인터페이스는 객체를 어떻게 구성해야 하는지 정리한 설계도로 일종의 추상클래스입니다. 하지만 추상클래스보다 추상화의 정도가 높아서 추상클래스와 달리 몸통을 가지지 않습니다. 오직 추상메서드와 상수만을 멤버로 가질 수 있습니다. 인터페이스는 그 자체만으로 사용되기보다 다른 클래스를 작성하는데 도움을 줍니다.

 

 

선언방법

interface 인터페이스이름 {
     public statc final 타입 상수이름 = 값;
     public abstarct 메서드이름(매개변수목록);
}

- 모든 멤버변수는 public static final 이어야 하며, 이를 생략할 수 있다.

- 모든 메서드는 public abstract 이어야 하며, 이를 생략할 수 있다.

 

 

 

 

구현방법

 인터페이스도 추상클래스 처럼 그 자체로 인스턴스를 생성할 수 없습니다.  구현의 의미를 가진 'implements'를 사용하는데, 구현체를 만들 때 인터페이스에 정의된 추상메서드를 반드시 정의해야 합니다. (만약 일부만 구현할 때는 'abstract' 키워드 사용)

 

interface Animal{
    void cry();
    String leg();
}

interface Terrestrial{
    void live();
}

class Dog implements Animal, Terrestrial{

    @Override
    public void cry() {
        System.out.println("멍멍");
    }

    @Override
    public String leg() {
        return "네발로 뛰어다녀";
    }

    @Override
    public void live() {
        System.out.println("난 땅위에 살지");
    }
}

//  leg를 구현하지 않아 에러가 난다. 해당클래스에 abstarct를 사용하면 에러가 나지않음.
//class Penguin implements Animal{
//
//    @Override
//    public void cry() {
//        System.out.println("꾸에에에");
//    }
//}

public class InterfaceEx {
    public static void main(String[] args) {
        Dog dog = new Dog();

        dog.cry();
        dog.live();
        String dogLeg = dog.leg();
        System.out.println(dogLeg);
    }
}

인터페이스를 구현할 때 정의된 메서드를 구현하지 않으면 컴파일러가 오류를 내고 인터페이스는 클래스의 상속과 다르게 다중상속도 구현이 가능합니다.

 

 

 

인터페이스를 이용한 다형성

- 인터페이스도 구현한 클래스의 부모라고 할 수 있습니다. 그래서 인터페이스의 타입의 참조변수로 구현한 클래스의 인스턴스를 참조가능합니다. 메서드의 매개변수, 반환타입으로도 사용이 가능하고 반환타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을 의미합니다.

 

interface Animal{
    void cry();
}

class Dog implements Animal {

    @Override
    public void cry() {
        System.out.println("멍멍");
    }
}

class Cat implements Animal {

    @Override
    public void cry() {
        System.out.println("야옹");
    }
}

public class InterfaceEx {
    public static void main(String[] args) {
        Animal animal = whatAnimal("Dp");

        if (animal != null) {
            animal.cry();
        }
    }

    static Animal whatAnimal(String name) {
        if (name.equals("강아지")) {
            return new Dog();
        }else if(name.equals("고양이")){
            return new Cat();
        }else{
            return null;
        }
    }
}

매개변수로 받는 name 에 따라 Dog, Cat 인스턴스를 반환합니다. 나중에 새로운 종류의 동물이 추가되어도 whatAnimal 메서드의 return 문만 따로 변경하면 됩니다. 이러한 장점은 분산환경 프로그래밍에서 위력을 발휘하게 됩니다. 사용자 컴퓨터에 설치된 프로그램 변경없이 서버측의 변경만으로도 사용자가 개정된 프로그램을 사용하도록 합니다.

 

 

 

그러면 이러한 인터페이스 기능을 왜 사용하고 무엇이 좋을까요?

 

1. 인터페이스는 객체지향 설계 5원칙 - SOLID 을 지킬 수 있게 해 줍니다.

- SOLID 가 무엇인지 궁금하면 제가 이전에 포스팅한 글들을 참고하시면 도움이 되실 겁니다.

   

2. 개발시간을 단축시킬 수 있습니다.

- 클래스와 작성과 인터페이스의 구현을 동시에 진행할 수 있기 때문입니다.

 

3. 표준화가 가능하다.

- 기본 틀을 인터페이스로 작성하여 개발자들에게 인터페이스를 구현하여 프로그램을 자성하게 하면 보다 일관되고 정형화된 개발이 가능합니다.

 

4. 독립적인 프로그래밍이 가능하다.

- 인터페이스를 이용하면 클래스의 선언과 구현을 분리가 가능하기 때문에 실제 구현에 독립적인 프로그램을 작성하는 것이 가능하다.

 

 

 

 

좀 더 쉽게 설명을 하여 실세계에 비유를 하자면 인터페이스는 '역할'이라고 생각하면 됩니다.

 

참고 - 김영한님 스프링 강의 中

 

 

클라이언트인 운전자가 있고 자동차 인터페이스가 있습니다. 이렇게 역할과 구현으로 구분을 하면 단순하고 유연 해지며 변경이 편리해집니다. 운전자는 자동차가 k3, 아반떼, 테슬라 건 그냥 면허증만 있다면 차종과 관계없이 운전이 가능합니다. 차가 다른 어떤 차로 바뀌어도 상관없고 그 내부구조가 어떻든 영향을 받지 않습니다.

 

정리를 하면

  • 클라이언트는 대상의 역할(인터페이스)만 알면 됩니다.
  • 클라이언트는 구현 대상의 내부 구조를 몰라도 됩니다. 
  • 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않습니다.
  • 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않습니다.

 

 

 

 

 

 

 

 

'자바 (ref. 자바의정석)' 카테고리의 다른 글

Comparator 와 Comparable - JAVA  (3) 2022.03.07
String 클래스 - JAVA  (0) 2022.02.24
다형성(polymorphsim) - JAVA  (0) 2022.02.18
오버라이딩(overriding) + super( ) - JAVA  (0) 2022.02.17
상속(inheritance) - JAVA  (0) 2022.02.16