/////
Search
🗾

인터페이스

Search
종류
구상 클래스
추상 클래스
인터페이스
0개
0개 ~ n개 가능
모든 메서드가 추상메서드 여야 함
100%
0% ~ 100%
0%
모든 메서드가 구상메서드 여야 함(부모에게 추상메서드를 받은 경우 오버라이드 필수)
0개 ~ n개 가능
0개
추상 클래스도 객체화는 불가능하지만 안에 추상, 구상 모두 가능하다. 반면에 인터페이스는 모두 추상으로 만들어 모호성을 없앴다는 특징이 있다.

예외

인터페이스는 다른 인터페이스들을 다중 상속 할 수 있다.
인터페이스에는 private를 쓸 수 없다. 모든 필드, 메소드는 public이어야 한다.
필드는 컴파일 과정에서 자동으로 public static final이 붙는다.
static 블록 사용으로 초기화 불가능하여 반드시 인터페이스 선언 시 초기화 필요
메소드는 컴파일 과정에서 자동으로 public abstract가 붙는다.
인터페이스, 추상 클래스 모두 public 접근 제어자만 가능

인터페이스 특징

상수와 메소드만을 구성 멤버로 가진다.
자바 8부터는 디폴트 메소드와 정적 메소드 선언이 가능하다.
객체에 다형성을 부여한다.
규약을 정의하는 데 용이하다. 결국에 결합성을 낮춰준다.
쉽게 말해서 한 소스가 변경되도 다른 소스들에 미치는 영향(의존)이 적어진다.
개발 코드를 수정하지 않고 사용하는 객체를 변경할 수 있도록 해준다.
즉, 호환성이 확보되어 유연한 대처가 가능하다.
예시로 타이어가 변경되도 같은 인터페이스(규약)을 따르는 타이어는 = new 새로운 타이어(); 로만 변경하여 사용할 수 있다.
개발 코드는 객체의 내부 구조를 알 필요가 없고 인터페이스의 메소드만 알고 있으면 된다.
.class로 컴파일되기 때문에 물리적 형태는 클래스와 동일하다.
구현 클래스는 인터페이스의 모든 추상 메소드를 구현해야 한다. 그렇지 않으면 추상 클래스로 선언해야 한다.

익명 구현 객체

소스 파일을 만들지 않고도 구현 객체를 만들 수 있는 방법
인터페이스 변수 = new 인터페이스() { //인터페이스에 선언된 추상 메소드의 실체 메소드 선언 public void 메소드() { /* 실행문 */ } }
Java
복사
객체는 “인터페이스명 + $번호” 의 형태로 클래스 파일명이 생성된다.

디폴트 메소드

디폴트 메소드는 인터페이스의 모든 구현 객체가 가지고 있는 기본 메소드
오버라이딩이 가능하다.

정적 메소드

인터페이스로 바로 호출이 가능하다.

자동 타입 변환

구현 객체가 인터페이스 타입으로 변환되는 것은 자동 타입 변환(Promotion)에 해당한다.
인터페이스 구현 클래스를 상속해서 자식 클래스를 만들었어도 자식 객체 역시 인터페이스 타입으로 자동 타입 변환됨

강제 타입 변환

구현 객체가 인터페이스 타입으로 자동 변환되면, 인터페이스에 선언된 메소드만 사용 가능하다는 제약 사항이 따른다.
하지만 다시 구현 클래스 타입으로 바꾸면 메소드를 다시 쓸 수 있다.

객체 타입 확인

instanceof로 확인

인터페이스 상속

인터페이스는 클래스와 달리 다중 상속을 허용한다.
extends 키워드 뒤에 상속할 인터페이스들을 나열할 수 있다.
하위 인터페이스를 구현하는 클래스는 하위 인터페이스의 메소드 뿐만 아니라 상위 인터페이스의 모든 추상 메소드에 대한 실체 메소드를 가지고 있어야 한다.

디폴트 메소드의 필요성

인터페이스에 메소드를 추가하게 되면 하위 모든 구현 클래스들에서 해당 메소드를 구현해야 한다. 이때 디폴트 메소드를 추가하면 하위 구현 클래스들에서 메소드 구현이 필요 없어진다.