인터페이스
Java에서 클래스들이 구현해야 하는 동작을 지정하는데 사용되는 추상 자료형
여러 구현체에서 공통적인 부분을 추상화한다.(다형성)
인터페이스의 특징
•
추상 클래스보다 추상성이 더욱 심화된 개념
•
모든 멤버 변수는 상수형(public static final)으로 선언되어야 함
•
모든 메서드는 추상 메서드(public abstract)로 선언되어야 함
•
상수와 추상 메서드 외에 다른 멤버를 갖지 못하게 함으로써 추상 클래스보다 더욱 완벽한 추상화를 제공함
•
클래스와는 다르게 다중 상속을 지원한다.
•
논리적으로 is a ~ 관계가 성립하지 않거나(상속 X) 다중상속을 받고 싶은 경우에 활용된다.
•
인터페이스를 통해 구현과 사용의 분리를 제공한다
1.
사용자 관점 : 사용 방법, 약속
2.
제공자 관점 : 구현의 책임
인터페이스 vs 추상 클래스
추상 클래스
•
하위 클래스를 통해 공간 생성이 가능
•
변수가 존재하는 경우, 공간이 필요한 경우 (상태를 가질 때)
•
객체마다 고유한 상태를 가져야 하는 경우엔 추상 클래스를 사용한다!!
인터페이스
•
객체마다 고유한 상태를 가질 필요가 아닌 경우
인터페이스의 필요성
•
구현의 강제로 표준화 처리 (벤더가 바뀌어도 호출 함수는 변경되지 않음)
•
인터페이스를 통한 간접적인 클래스 사용으로 손쉬운 모듈 교체 지원
•
서로 상속 관계가 없는 클래스들에게 인터페이스를 통한 관계 부여로 다형성 확장
⇒ 상속 관계가 없는 경우 최상위 객체인 Object로밖에 묶을수가 없지만
인터페이스 배열을 통해 하나의 배열로 묶어서 관리가 가능! + 참조변수를
Interface로 사용하였기 때문에 Interface의 메서드 호출도 가능!
•
독립적인 프로그래밍으로 개발 기간 단축
⇒ 인터페이스만 신경쓰고 서로 다른 팀에서 동시 개발 가능!!
인터페이스의 정의 방법
•
인터페이스의 선언은 예약어로 class 대신 interface 키워드를 사용한다.
•
접근 제어자로는 public 또는 default를 사용한다.
•
인터페이스의 변수 선언에 사용된 static final이나 메서드 선언에 사용된 abstract는 생략 가능
인터페이스의 구현 방법
•
인터페이스는 추상 클래스와 마찬가지로 자신이 직접 인스턴스를 생성할 수 없다
•
인터페이스가 포함하고 있는 추상 메서드를 구현해 줄 클래스를 작성해야 한다
•
클래스에서 인터페이스를 구현할 시 implements 키워드를 사용한다.
class 클래스명 implements 인터페이스명 { ... }
Java
복사
인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
•
인터페이스 사용 시 클래스와 동일하게 묵시적 형변환과 명시적 형변환이 가능하다
•
인터페이스 유형의 객체 참조 변수는 인터페이스에 선언된 요소에만 접근이 가능하다.
•
인터페이스를 구현한 객체의 요소에 접근하는 것은 허용되지 않는다.
인터페이스의 상속
•
클래스와 동일하게 인터페이스도 상속을 받을 수 있다.
•
이때 인터페이스의 조상은 인터페이스만 가능하다 (Object가 최고 조상이 아님)
•
다중 상속이 가능하다
interface Movable{ void move(int x, int y); }
interface Attackable { void attack(Unit u); }
interface Fightable extends Movable, Attackable { }
Java
복사
인터페이스 - default method (Java 8)
•
자바 8부터 지원하기 시작한 기능
•
인터페이스에 선언된 구현부가 있는 메서드
•
메서드 선언부에 default modifier 추가 후 메서드 구현부를 작성한다
•
접근 제한자는 public 으로 한정된다 (생략 가능)
default method의 필요성
•
기존에 interface 기본으로 동작하는 라이브러리의 interface에 추가해야하는 기능이 생김
•
기존 방식으로라면 모든 구현체들이 추가되는 메서드를 override해야하는 문제가 있음
•
default 메서드는 abstract가 아니므로 반드시 구현할 필요가 없어짐!!
default method의 충돌
•
기존에 추상 메서드만 가지는 인터페이스는 충돌의 위험이 없었지만 default 메서드의 개념이 도입되며 충돌의 가능성이 생겼다
•
이 경우 method의 우선순위를 통해 어느 method가 사용될지를 결정한다.
◦
클래스 vs 인터페이스
▪
class가 구체적인 메서드를 갖는 경우 default method는 무시됨
◦
interface vs interface
▪
하나의 interface에서 default method를 제공하고, 다른 interface에서도 같은
이름의 메서드(default 무관) 가 있을 때 sub class는 반드시 override해야함!
인터페이스 - static method (Java 8)
•
default 메서드와 마찬가지로 자바 8부터 지원하기 시작한 기능
•
인터페이스 내에서 static 키워드를 통해 사용할 수 있음
•
static 키워드를 통해 정의된 메서드는 객체 없이도 interface명.메서드명 으로 사용 가능
•
해당 인터페이스와 관련된 유틸, 공통 메서드를 제공하기 위한 용도로 사용
•
static method는 재정의가 불가능하다
인터페이스 - private method (Java 9)
•
자바 9부터 추가된 기능이다
•
인터페이스에서의 캡슐화를 제공한다.
•
인터페이스 내부의 코드 재사용성을 증가시킨다.
private method의 작성 규칙
•
private interface method는 추상화가 불가능하다
•
private method는 인터페이스 내에서만 사용할 수 있다.
•
private static method는 다른 static , non-static interface method 내에서 사용할 수 있다
•
private non-static method는 private static method 내에서 사용 불가능하다( static 영역 때문)