Show All
Search
•
추상 클래스도 객체화는 불가능하지만 안에 추상, 구상 모두 가능하다. 반면에 인터페이스는 모두 추상으로 만들어 모호성을 없앴다는 특징이 있다.
예외
•
인터페이스는 다른 인터페이스들을 다중 상속 할 수 있다.
•
인터페이스에는 private를 쓸 수 없다. 모든 필드, 메소드는 public이어야 한다.
◦
필드는 컴파일 과정에서 자동으로 public static final이 붙는다.
▪
static 블록 사용으로 초기화 불가능하여 반드시 인터페이스 선언 시 초기화 필요
◦
메소드는 컴파일 과정에서 자동으로 public abstract가 붙는다.
•
인터페이스, 추상 클래스 모두 public 접근 제어자만 가능
인터페이스 특징
•
상수와 메소드만을 구성 멤버로 가진다.
◦
자바 8부터는 디폴트 메소드와 정적 메소드 선언이 가능하다.
•
객체에 다형성을 부여한다.
•
규약을 정의하는 데 용이하다. 결국에 결합성을 낮춰준다.
◦
쉽게 말해서 한 소스가 변경되도 다른 소스들에 미치는 영향(의존)이 적어진다.
◦
개발 코드를 수정하지 않고 사용하는 객체를 변경할 수 있도록 해준다.
•
즉, 호환성이 확보되어 유연한 대처가 가능하다.
◦
예시로 타이어가 변경되도 같은 인터페이스(규약)을 따르는 타이어는 = new 새로운 타이어(); 로만 변경하여 사용할 수 있다.
•
개발 코드는 객체의 내부 구조를 알 필요가 없고 인터페이스의 메소드만 알고 있으면 된다.
•
.class로 컴파일되기 때문에 물리적 형태는 클래스와 동일하다.
•
구현 클래스는 인터페이스의 모든 추상 메소드를 구현해야 한다. 그렇지 않으면 추상 클래스로 선언해야 한다.
익명 구현 객체
•
소스 파일을 만들지 않고도 구현 객체를 만들 수 있는 방법
인터페이스 변수 = new 인터페이스() {
//인터페이스에 선언된 추상 메소드의 실체 메소드 선언
public void 메소드() { /* 실행문 */ }
}
Java
복사
•
객체는 “인터페이스명 + $번호” 의 형태로 클래스 파일명이 생성된다.
디폴트 메소드
•
디폴트 메소드는 인터페이스의 모든 구현 객체가 가지고 있는 기본 메소드
•
오버라이딩이 가능하다.
정적 메소드
•
인터페이스로 바로 호출이 가능하다.
자동 타입 변환
•
구현 객체가 인터페이스 타입으로 변환되는 것은 자동 타입 변환(Promotion)에 해당한다.
•
인터페이스 구현 클래스를 상속해서 자식 클래스를 만들었어도 자식 객체 역시 인터페이스 타입으로 자동 타입 변환됨
강제 타입 변환
•
구현 객체가 인터페이스 타입으로 자동 변환되면, 인터페이스에 선언된 메소드만 사용 가능하다는 제약 사항이 따른다.
•
하지만 다시 구현 클래스 타입으로 바꾸면 메소드를 다시 쓸 수 있다.
객체 타입 확인
•
instanceof로 확인
인터페이스 상속
•
인터페이스는 클래스와 달리 다중 상속을 허용한다.
•
extends 키워드 뒤에 상속할 인터페이스들을 나열할 수 있다.
•
하위 인터페이스를 구현하는 클래스는 하위 인터페이스의 메소드 뿐만 아니라 상위 인터페이스의 모든 추상 메소드에 대한 실체 메소드를 가지고 있어야 한다.
디폴트 메소드의 필요성
•
인터페이스에 메소드를 추가하게 되면 하위 모든 구현 클래스들에서 해당 메소드를 구현해야 한다. 이때 디폴트 메소드를 추가하면 하위 구현 클래스들에서 메소드 구현이 필요 없어진다.