JAVA/JAVA (basic)

인터페이스

momo0503 2021. 1. 13. 15:41

인터페이스

객체의 사용 방법을 정의한 타입. 객체의 교환성을 높여주기 때문에 다형성을 구현하는 매우 중요한 역할을 한다.

개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출시킨다. 그래서 개발 코드는 객체 내부 구조를 알 필요가 없고 인터페이스의 메소드만 알고 있으면 된다.

 

자식 클래스가 여러 부모 클래스를 상속받을 수 있다면, 다양한 동작을 수행할 수 있다는 장점을 가지게 될 것입니다.

하지만 클래스를 이용하여 다중 상속을 할 경우 메소드 출처의 모호성 등 여러 가지 문제가 발생할 수 있어 자바에서는 클래스를 통한 다중 상속은 지원하지 않습니다.

 

하지만 다중 상속의 이점을 버릴 수는 없기에 자바에서는 인터페이스라는 것을 통해 다중 상속을 지원하고 있습니다.

인터페이스(interface)란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스를 의미합니다.

 

자바에서 추상 클래스는 추상 메소드뿐만 아니라 생성자, 필드, 일반 메소드도 포함할 수 있습니다.

하지만 인터페이스(interface)는 오로지 추상 메소드와 상수만을 포함할 수 있습니다. 생성자X 

추상 클래스와 마찬가지로 new연산자로 객체를 생성할 수 없다. 추상 메서드를 구현해줄 클래스를 만들어야한다.

public A implements 인터페이스 이름

 

인터페이스는 .java 형태의 소스파일로 작성되고 javac를 통해 .class 형태로 컴파일된다. 형태는 클래스와 동일하지만 선소스 작성할때 선언하는 방법이다르다. interface 인터페이스명

 

interface 인터페이스이름{

//상수 
타입 상수명 = 값;

//추상 메서드 

//디폴트 메서드 

//정적 메서드

}

인터페이스는 객체 사용 설명서이므로 런타임 시 데이터를 저장할 수 있는 필드를 선언할 수없다. 하지만 상수 선언은 가능하다.

 

인터페이스를 통해 호출된 메서드는 최종적으로 객체에서 실행된다. 이에 인터페이스의 메소드는 실행 블록이 필요 없는 추상 메서드로 선언한다. (인터페이스에 선언된 추상 메서드는 모드 public abstract 특성을 가지므로 public abstract를 생략하더라도 자동으로 컴파일 과정에서 코드가 붙는다.)

 

 

 

인터페이스 구현

개발 코드가 인터페이스 메소드를 호출하면 인터페이스는 객체의 메소드를 호출한다. 객체는 인터페이스에서 정의된 추상 메서드와 동일한 메소드 이름, 매개 타입, 리턴 타입을 가진 실체 메서드를 가지고 있어야한다. 이러한 객체를 인터페이스 구현 객체라고 하고 구현 객체를 생성하는 클래스를 구현 클래스라고 한다.

 

구현클래스에서 인터페이스의 추상메소드들에 대한 실체 메소드(각각 클래스에 알맞게 코드한 메소드) 를작성할 때 인터페이스의 모든 메소드는 기본적으로 public 접근 제한을 갖기 때문에 public 보다 더 낮은 접근 제한으로 작성할 수 없다. public을 생략하면 컴파일 에러가 발생한다. 만약 인터페이스에 선언된 추상 메서드에 대응하는 실체 메서드를 구현 클래스가 작성하지 않으면 구현 클래스는 자동적으로 추상 클래스가 된다. 이런 경우 클래스 선언부에 abstract 키워드를 추가해야한다. 

 

익명 구현 객체

구현 클래스를 만들어 사용하는 것이 일반적이지만, 일회성의 구현 객체를 만들기 위해 소스 파일을 만들고 클래스를 선언하는 것은 비효율적이다. 자바는 소스 파일 만들지 않고도 구현 객체를 만들 수 있는 방법을 제공하는데, 그것이 익명 구현 객체이다.

 

 

 

인터페이스 A와 B가 객체의 메소드를 호출할 수 있을면 객체는 이 두 인터페이스를 모두 구현해야 한다.

public class 구현클래스명 implements A, B {
인터페이스 A에 선언된 추상메서드의 실체 메서드 선언
인터페이스 B에 선언된 추상메서드의 실체 메서드 선언
}

구현 클래스에서 모든 인터페이스의 추상메서드에 실체 메서드를 하나라도 작성하지 않으면 추상 클래스로 선언해야 한다.

 

인터페이스는 다른 인터페이스를 상속할 수 있다.. 클래스와 달리 다중 상속을 허용

public interface 하위인터페이스 extends 상위인터페이스1 , 상위인터페이스2