1. 인터페이스란?
- 추상 클래스처럼 추상 메서드를 갖지만, 추상 클래스보다 추상화 정도가 높아서
추상 클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다.
- 오직 추상 메서드와 상수만을 맴버로 가지고, 어떤 다른 요소도 가지지 않는다.
- 추상 클래스를 부분적으로만 완성된 '미완성 설계도' 라고 한다면, 인터페이스는 구현된 것은
아무것도 없고 밑 그림만 그려져 있는 '기본 설계도'라 할 수 있다.
- 인터페이스는 인터페이스로부터만 상속 받으며, 하나의 클래스가 다중 인터페이스로부터 상속
받는 것이 가능하다.
- 인터페이스 또한 추상 클래스처럼 인스턴스를 생성할 수 없다.
- 문법
interface 인터페이스이름{
public static final 상수이름 = 값;
public abstract 메서드이름 (매개변수목록);
static int 상수이름 = 값; //== public static final 상수이름 = 값;
}
( 모든 멤버 변수는 public static final 이어야 하며, 생략 가능하다. )
( 모든 메서드는 public abstract 이어야 하며, 생략 가능하다. )
--> 단, static 메서드와 default 메서드는 예외 ( JDK 1.8 이상 )
( 인터페이스에 public과 default를 사용할 수 있다. )
2. 인터페이스의 장점
(1) 개발 시간을 단축시킨다.
( 인터페이스가 작성이 되고 인터페이스를 구현해야 하는 클래스가 2개 이상이라면, 기다리지 않고
동시에 개발할 수 있기 때문이다. )
(2) 표준화가 가능하다.
(3) 서로 관계 없는 클래스들에게 관계를 맺어줄 수 있다.
(4) 독립적인 프로그래밍이 가능하다.
( 클래스와 클래스 간의 직접적인 관계를 인터페이스를 이용해서 간접적인 관계로 변경하면, 한 클래스의
변경이 관련된 다른 클래스에 영향을 미치지 않기 때문이다. )
3. 이해를 돕기 위한 예제(1)
( 인터페이스는 "기본 설계도" 이므로 다른 클래스에게 데이터 형식과 같은 것을 제공해야 한다. )
( 하지만 private를 멤버 변수 앞에 붙인다면, 인터페이스의 컨셉에 어긋나기 때문에 오류가 발생하게 된다. )
3. 이해를 돕기 위한 예제(2)
3. 이해를 돕기 위한 예제(3)
( 12번째 줄에 오류가 발생하는 이유는 Marine 클래스에 Repairable를 구현하지 않았기 때문이다. )
( 당연히 마린은 인간이기 때문에.. )
4. 이해를 돕기 위한 예제(4)
: Academy, Bunker, Barrack, Factory들은 공통적으로 건물이지만, Barrack과 Factory는
움직일 수 있는 건물이다. 그래서 공통적으로 클래스를 상속 받은 후, Barrack과 Factory는
따로 인터페이스를 구현해준다.
( LiftableIMPl 클래스를 통해 Liftable 인터페이스를 구현한다. )
5. 인터페이스를 사용하는 이유
( 위 예제는 A와 B 클래스의 직접 관계를 보여주고 있다. )
( 이렇게 하면 A 클래스의 인스턴스를 직접 불러서 함수를 호출할 수 있지만, A클래스의 함수가 바뀐다면
B 클래스의 함수 부분에서도 변경이 직접적으로 받을 것이다. )
( 예를 들어, 매개변수가 필요하게 되어 methodA()에 만들게 되면 영향을 직접적으로 받을 것이다. )
( 이때, 필요한 것이 인터페이스다. )
( 아래의 예제를 통해 직접관계를 간접적으로 바꿀 수 있다. )
( 이렇게 되면 c -> b의 관계가 c -> i -> b의 관계로 바뀐다. )
( 이렇게 함으로써 효과로는 c는 i만 보면서 변경하고 b를 신경쓰지 않아도 된다는 점이다. )
( 즉, 인터페이스 i에게만 영향을 받는다. )
( 또한 아래의 예제처럼 제 3의 클래스로 관계를 만들 수 있다. )
( 이렇게 되면 우리는 인스턴스를 직접 생성하지 않아도 된다. )
( 또한 다른 인스턴스로 변경되더라도 클래스 d가 변경 없이 c 클래스의 getInstance()만
변경해주면 된다. )
'자바 > 기본적인 개념' 카테고리의 다른 글
인터페이스의 default & static 메서드 (0) | 2021.12.09 |
---|---|
인터페이스 다형성 (0) | 2021.12.08 |
추상 클래스(abstract class) (0) | 2021.12.07 |
다형성(3) (0) | 2021.03.29 |
다형성(2) (0) | 2021.03.29 |