728x90
인터페이스
@24.04.09
인터페이스
💡
추상된 틀을 만들어 개발에 혼선이 없게끔 도와주는 역할을 하는 객체로, 추상화를 통해
관련 있는 메서드들의 집합
을 말한다.
@기본 구조
접근 제한자 interface 인터페이스명 {
// 추상 메서드
// default 메서드
// 정적 메서드
}
관련 있는 메서드들의 집합
을 말한다.
@기본 구조
접근 제한자 interface 인터페이스명 {
// 추상 메서드
// default 메서드
// 정적 메서드
}
- implements 키워드 사용
- 인터페이스 메서드는 기본적으로 public 과 abstract이며, 이는 생략 가능하다
- 구현하는 클래스는 인터페이스에 선언된 모든 메서드를 구현해야 하므로,
모든 멤버가 외부에서 접근 가능해야 한다.
- 구현하는 클래스는 인터페이스에 선언된 모든 메서드를 구현해야 하므로,
- 특징
- 다중 상속 지원
- 한 클래스가 여러 개의 인터페이스를 구현 가능
- JAVA8부터 디폴트 메서드, 정적 메서드 사용 가능
- 객체화 불가능
- 추상 클래스 vs 인터페이스
- 공통된 기능을 추상화하고 공유하기 위해서는 추상 클래스 사용
- 다양한 타입의 객체를 통일적으로 처리하고자 할 때는 인터페이스 사용
일반 클래스 추상 클래스 인터페이스
메서드완결한 메서드
(=구현된 메서드)완결 메서드
추상 메서드추상 메서드
정적 메서드
default 메서드멤버 변수 0 0 0 객체화 0 X X
- 사용 용도
- 구현 클래스 간의 공통된 동작을 정의
- 표준화
- 표준화된 메서드를 정의하여, 서로 다른 클래스들이 동일한 방식으로 동작 ⇒ 강제성
- 다형성
- 동일한 인터페이스를 구현한 여러 클래스들을 동일한 방식으로 다룰 수 있다.
⇒ 우리가 가전제품을 제품 설명서 없이 잘 사용하는 이유
- 동일한 인터페이스를 구현한 여러 클래스들을 동일한 방식으로 다룰 수 있다.
- 예시
- 다양한 도형 클래스의 넓이 구하기
// Shape 인터페이스 public interface Shape { double getArea(); // 도형의 넓이를 계산하는 메서드 } // Circle 클래스 - Shape 인터페이스를 구현 public class Circle implements Shape { private double radius; public Circle(double radius) { this.radius = radius; } // 반드시 구현 @Override public double getArea() { return Math.PI * radius * radius; } } // Rectangle 클래스 - Shape 인터페이스를 구현 public class Rectangle implements Shape { private double width; private double height; public Rectangle(double width, double height) { this.width = width; this.height = height; } @Override public double getArea() { return width * height; } }
default 메서드
💡
인터페이스가 변경되면, 인터페이스를 구현하는 모든 클래스들이 변경된 메서드를 구현해야 하므로, 이런 문제를 해결하기 위해 인터페이스에 메서드를 구현해 놓을 수 있도록 한다.
- 인터페이스에 이 기능은 꼭 넣고 싶다! 해서 추상 메서드 추가
- 이 인터페이스를 구현한 모든 클래스에서 에러가 남
- 이를 방지하기 위해 default 메서드가 생겨나게 된다.
- 오버라이드는 가능하나, 강제화 불가능
public interface Calculator{ // 추상메서드 public in plus(int i, int j); // default 메서드 default int multiple(int i, int j) { return i-j; }
static 메서드
💡
인스턴스화되지 않은 인터페이스에 직접 속해 있는 메서드이며, 이런 메서드는 인터페이스의 일부로써 호출될 수 있으며, 인터페이스의 구현 클래스에 상속되지 않는다.
- 디폴트 메서드와 차이점
- 정적 메서드는 구현 클래스에 상속되지 않으므로, 더 강력한 유틸리티 함수를 제공한다.
- 디폴트 메서드는 구현 클래스에서 재정의 되므로, 인터페이스의 기본 동작을 변경하거나 확장하는 데 사용된다.
- 유의할 점
- 메서드는 인터페이스 명으로 직접 호출해야 한다.
- 기본 구현을 제공할 때 유용하며, 이는 인터페이스를 구현하는 클래스에서 오버라이드 할 필요 없이 바로 사용할 수 있다.
- 상속되지 않는다 ⇒ static 메서드를 오버라이드 할 수 없다.
interface MyInterface { static void staticMethod() { System.out.println("나는! 정적 메소드야!"); } } public class Main implements MyInterface { public static void main(String[] args) { // static 메소드 직접 호출 MyInterface.staticMethod(); } }
+
728x90