study/java
자바/JAVA 인터페이스 정리
올스왑
2021. 1. 5. 02:52
인터페이스는 객체의 사용 방법을 정의한 타입이다. 이를 통해 다양한 객체를 동일한 방법으로 사용할 수 있고, 다형성을 구현할 수 있다.
- 개발 코드, 클라이언트는 인터페이스를 통해 객체와 통신한다.
- 인터페이스의 메소드를 호출하면, 객체의 메소드가 호출된다.
- 이 방법을 통해 개발 코드를 수정하지 않으면서 객체 교환이 가능하다.
- 구현되는 클래스의 설명서 역할을 하므로, 보통 프로그램 설계 단계에서 작성된다.
인터페이스의 코드는 .java, .class로 같다.
선언 방법: [public] interface 인터페이스이름 {....}
인터페이스는 객체가 아니므로 생성자는 없지만, 상수 필드와 추상 메소드를 갖고 있다. 추상 메소드는 프로토타입 메소드라고도 한다.
인터페이스의 요소들
interface A {
// 상수 필드
int age = 10;
// 추상 메소드
int ageplus(int num1, int num2);
// default 메소드
default void description(){
System.out.println("이것은 디폴드 메소드");
}
// 정적 메소드
static int normalAdd(int num1, int num2){
return num1 + num2;
}
// private 메소드
private void thisisprivate(){
System.out.println("this is private");
}
}
- 상수 : 선언된 모든 변수는 컴파일 과정에서 상수로 처리된다.
- 일반 클래스의 변수는 객체화되서 heap 영역에 올라가지만, 인터페이스는 객체화 되지 않기 때문에 상수가 올라간다.
- 기본적으로 public static final 성질을 갖고 있으므로, 따로 적지 않아도 상수의 특성을 갖는다.
- 인스턴스 또는 정적 필드는 선언이 안되고, 상수 필드만 선언 가능하다.
- 추상 메소드 선언: 모든 메소드는 컴파일 과정에서 추상 메소드로 처리된다. 따라서 new(인스턴스화) 될 수 없다.
- 마찬가지로 기본적으로 public abstrat의 특성을 가지므로, 생략해도 된다.
- interface를 통해 호출한 추상 메소드는 최종적으로 객체에서 실행된다.
- java8, java9 이후에 들어간 요소들 : default 메소드, 정적 메소드, private 메소드. 구현하는 클래스들의 메소드의 중복 구현을 막기 위해 사용한다.
- default 메소드(java8부터) : 기본 구현이 된 메소드. 구현하는 클래스에서 재정의할 수 있다.(defalut 키워드)
- 정적 메소드(java8부터) : 인터페이스 타입으로 호출하는 메소드. 일반적인 클래스의 정적 메소드와 달리 인터페이스의 정적 메소드는 인터페이스가 클래스에 의해 구현된 후에야 사용 가능하다. (static 키워드)
- private 메소드(java9부터) : 인터페이스 내에서 사용하기 위해 구현한 메소드. defalut 메소드나, 정적 메소드에서 사용한다. 당연히 정적 메소드에서 사용하려면 static으로 선언되어야 한다. (private 키워드)
- 구현 클래스는 인턴페이스의 추상 메소드를 재정의하고, 다른 실행문이 있는 클래스다.
- 클래스를 선언할 때, implemets 를 추가해 구현한다.
- 인터페이스 타입의 변수에 구현 객체를 담아 사용한다. 구현 클래스 타입에 담아도 되지만 다형성과는 멀어진다.
//구현 클래스 선언
public class temp implemnts A{...}
//구현 객체 사용
A a;
a = new temp();
//또는
A a = new temp();
다중 인터페이스 구현 클래스: 하나의 클래스가 다수의 인터페이스의 구현 클래스로 사용 가능하다.
public class temp implements A,B;
인터페이스는 클래스 선언 시 필드로, 매개변수로, 지역변수로도 사용가능하다.
예를 들어 인터페이스가 매개변수로 사용된 경우, 그 생성자 또는 메소드에 구현 객체를 대입하여 사용한다.
myClass(A a){}//인터페이스가 매개변수로 사용됨
//매소드를 사용할 때
myClass(new temp());