언어/자바
인터페이스
AlgoPoolJa
2022. 5. 4. 22:51
인터페이스란?
인터페이스는 클래스의 청사진으로 볼 수 있는 기능이며 클래스에게 인터페이스 내에 있는 메서드들을 구현하도록 강제합니다.
언제 인터페이스를 사용해야 할까?
- 추상화 사용하려고 할 때 사용됩니다.
- 다형성을 위해 사용됩니다.
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()); }
- 참고로 다형성이란, 런타임 중에 객체가 다른 형식을 취할 수 있는 기능입니다. 더 구체적으로 말하면 런타임에 특정 객체 유형과 관련된 override 메서드를 실행하는 것입니다.
- Java 에서 Class 는 다중상속을 허용하지 않기 때문에 다중 상속을 하려면 Interface를 사용해야 합니다.
- 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!!");
}
} - 느슨한 결합을 위해 사용됩니다.
- 구현 클래스들에게 특정 동작기능을 의무적으로 구현하도록 할 때 사용합니다.
추상 클래스는 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 메서드
- 다중 상속을 허용합니다.
- 느슨한 결합을 만들기 위해 사용됩니다.