언어/자바

인터페이스

AlgoPoolJa 2022. 5. 4. 22:51

인터페이스란?

인터페이스는 클래스의 청사진으로 볼 수 있는 기능이며 클래스에게 인터페이스 내에 있는 메서드들을 구현하도록 강제합니다.

언제 인터페이스를 사용해야 할까?

  1. 추상화 사용하려고 할 때 사용됩니다.
  2. 다형성을 위해 사용됩니다.
    public interface Shape {
        String name();
    }
    ​
    public class Circle implements Shape {
    ​
        @Override
        public String name() {
            return "Circle";
        }
    }
    ​
    public class Square implements Shape {
    ​
        @Override
        public String name() {
            return "Square";
        }
    }
    ​
    List<Shape> shapes = new ArrayList<>();
    Shape circleShape = new Circle();
    Shape squareShape = new Square();
    ​
    shapes.add(circleShape);
    shapes.add(squareShape);
    ​
    for (Shape shape : shapes) {
        System.out.println(shape.name());
    }
  3. 참고로 다형성이란, 런타임 중에 객체가 다른 형식을 취할 수 있는 기능입니다. 더 구체적으로 말하면 런타임에 특정 객체 유형과 관련된 override 메서드를 실행하는 것입니다.
  4. Java 에서 Class 는 다중상속을 허용하지 않기 때문에 다중 상속을 하려면 Interface를 사용해야 합니다.
  5. public interface Transform {
       void transform();
    }

    public interface Fly {
       void fly();
    }

    public class Car implements Fly, Transform {

       @Override
       public void fly() {
           System.out.println("I can Fly!!");
      }

       @Override
       public void transform() {
           System.out.println("I can Transform!!");
      }
    }
  6. 느슨한 결합을 위해 사용됩니다.
  7. 구현 클래스들에게 특정 동작기능을 의무적으로 구현하도록 할 때 사용합니다.

추상 클래스는 non-final 상수가 있을 수 있지만, 인터페이스의 상수는 public static final 입니다.

ClassInterface

클래스에서 변수를 인스턴스화하고 개체를 만들 수 있습니다. 인터페이스에선 변수를 인스턴스화 할 수 없고 객체로 만들 수 없습니다.
Concrete method(메서드에 몸통이 있는) 를 가질 수 있습니다. Concrete method(메서드에 몸통이 있는) 를 가질 수 없습니다.
모든 접근 제한자를 사용할 수 있습니다. public 접근 제한자만 사용할 수 있습니다.(자바 9 부터는 private 메서드도 사용할 수 있습니다.링크)

주의점

  • 만약 클래스가 interface를 구현하고 인터페이스에서 지정된 함수중 구현하지 않은 함수가 있다면 해당 클래스는 추상 클래스로 선언되어야 합니다.
  • 참고로, 자바 8 이전에는 인터페이스는 메서드 본문이 있을 수 없었습니다. 메서드 본문이 없는 추상 메서드만 가질 수 있었습니다. 하지만 자바 8이상 부터는 인터페이스 메서드에 default 키워드를 사용하여 메서드를 구현 할 수 있습니다. 이 경우 기존에 해당 인터페이스를 구현한 다른 클래스들에겐 다른 제약사항(해당 메서드를 구현해야하는 등)을 주지 않고 사용할 수 있습니다.
  • 또한 자바 8이상 부터는 인터페이스 안에 static 메서드를 선언할 수 있습니다. 인터페이스 안에 static 메서드는 object(new 키워드를 사용하면 만든 객체) 없이 호출 될 수 있습니다.(단, 이 메서드는 상속되지 않습니다.)인터페이스에서 선언된 상수는 public static final 이며 추상 메서드는 public 입니다.

요약

  • 클래스는 한개 이상의 인터페이스를 구현할 수 있습니다.
  • 인터페이스는 한개 이상의 인터페이스를 상속 할 수 있습니다.
  • 인터페이스를 상속한 클래스는 인터페이스 안에 정의된 모든 메서드를 구현해야 합니다.
  • 인터페이스는 비어있을 수 있습니다.(즉, 어떤 상수나 메서드들도 없어도 됩니다.)
  • 인터페이스를 선언할 때 final 키워드를 사용하여 선언할 수 없습니다.
  • 인터페이스는 메서드는 protected 거나 final 일 수 없습니다.
  • 특정 선언을 하지 않는 한 모든 메서드는 public , abstract 입니다.
  • 모든 필드는 public, static, final 입니다. 또한 접근제한자를 변경할 수 없습니다.
  • 인터페이스에서 사용할 수 있는 상수 및 메서드는 아래와 같습니다.
    • 상수(public static final)
    • 추상 메서드
    • static 메서드
    • default 메서드
  • 다중 상속을 허용합니다.
  • 느슨한 결합을 만들기 위해 사용됩니다.

참고