Search
Duplicate
😀

06. 인터페이스

태그
인터페이스
interface method
추상 클래스

인터페이스

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 영역 때문)