📌 인터페이스 (Interface)
두 객체를 연결하는 역할
객체A <=(메소드 호출 또는 리턴값)=> 인터페이스 <=(메소드 호출 또는 리턴값)=> 객체B
인터페이스는 연결된 객체의 메소드를 호출해주거나 결과값을 리턴해줌
인터페이스의 사용으로 객체의 교체가 일어나도 그 객체를 사용하는 다른 객체의 추가 작업이 필요 없게 됨 (객체B가 객체C로 바껴도 객체 A는 인터페이스만 이용하므로 신경 쓸 필요 없음)
인터페이스는 다형성 구현에 주된 기술로 이용됨
📌 인터페이스 선언
interface 키워드 사용
default, public 사용 가능
interface 인터페이스명 {...}
public interface 인터페이스명 {...}
📌 인터페이스의 멤버
인터페이스 선언 시, 중괄호 안에 들어갈 수 있는 멤버들
public 상수 필드
public 추상 메소드
public 디폴트 메소드
public 정적 메소드
private 메소드
private 정적 메소드
📌 구현 클래스 선언
인터페이스에 선언된 추상 메소드와 동일한 선언부를 가진 (재정의된) 메소드 필요
재정의된 메소드를 가진 객체 => 구현(implement) 객체
선언부에 implements 키워드로 명시
public class 구현클래스 implements 인터페이스명 {...}
📌 implements
해당 클래스가 인터페이스를 통해 사용할 수 있다는 의미
인터페이스의 추상 메소드를 재정의한 메소드가 있다는 의미
📌 변수 선언과 구현 객체 대입
인터페이스는 참조 타입
객체를 참조하고 있지 않다는 뜻으로 null 대입 가능
인터페이스를 통해 구현 객체를 사용하려면, 인터페이스 변수에 구현 객체 대입해야 함
인터페이스 변수를 통해 메소드 호출 => 실제 실행되는 것은 구현 클래스에 재정의된 메소드
인터페이스 변수;
인터페이스 변수 = null; //null 대입 가능
인터페이스 변수 = 구현클래스(); //구현 객체 대입을 통해 인터페이스 사용
변수.인터페이스메소드(); //인터페이스 메소드 호출 => 구현 클래스에 재정의된 메소드 실행
📌 인터페이스의 상수 필드
인터페이스는 public static final 특성을 갖는 상수 필드를 멤버로 가질 수 있음
public static final 생략 가능 (컴파일 과정에서 자동 생성)
상수명은 대문자, 언더바(_) 연결
구현 객체와 관련 없는 인터페이스 소속 멤버로 인터페이스에서 바로 접근 가능
public interface 인터페이스명 {
[ public static final ] 타입 상수명 = 값;
}
📌 인터페이스의 추상 메소드
인터페이스는 public 추상 메소드를 멤버로 가질 수 있음
public abstract 생략 가능 (컴파일 과정에서 자동 생성)
인터페이스에는 호출 방법만 기술, 구현 클래스에 재정의된 메소드 실행
구현 클래스에서 public보다 더 낮은 접근 제한으로 제정의 불가
인터페이스 변수로 추상 메소드 호출
public interface 인터페이스명 {
[ public abstract ] 리턴타입 메소드명(매개변수, ...);
}
💡 인터페이스 변수는 참조 타입이기 때문에 구현 객체가 대입되면 구현 객체의 번지를 저장
📌 인터페이스의 디폴트 메소드
인터페이스에서는 완전한 실행 코드를 가진 디폴트 메소드를 선언할 수 있음
추상 메소드와 달리 실행부가 있음 (중괄호 내부에 로직 있음)
실행부에는 상수 필드를 읽거나 추상 메소드를 호출하는 코드 작성 가능
(인터페이스의 디폴트 메소드) default 키워드가 리턴 타입 앞에 붙음
구현 클래스는 디폴트 메소드를 재정의 가능
(구현 클래스) 재정의 시, public 접근 제한자 반드시 붙이고 default 키워드 생략해야 함
public interface 인터페이스명 {
[ public ] default 리턴타입 메소드명(매개변수, ...) { ... }
}
📌 인터페이스의 정적 메소드
인터페이스에는 정적 메소드 선언이 가능
구현 객체가 없어도 인터페이스만으로 호출 가능
public을 생략하더라도 컴파일 과정에서 자동 생성
실행부(중괄호 안)에 상수 필드를 제외한 추상 메소드, 디폴트 메소드, private 메소드 등을 호출할 수 없음
위의 메소드들은 구현 객체가 필요하기 때문
public interface 인터페이스명 {
[ public | private ] static 리턴타입 메소드명(매개변수, ...) { ... }
}
📌 인터페이스의 private 메소드
인터페이스에는 외부에서 접근할 수 없는 private 메소드 선언 가능
private 메소드 : 구현 객체가 필요한 메소드 (디폴트 메소드 안에서만 호출 가능)
private 정적 메소드 : private 범위인 정적 메소드, 구현 객체가 필요 없는 메소드 (디폴트 메소드, 정적메소드에서 호출 가능)
private 메소드의 용도는 디폴트와 정적 메소드들의 중복 코드를 줄이기 위함