객체지향에서 다형성이 정말 강력한 기능인데 (상속도 그걸 위해 존재)
거기에 날개를 달아주는 게 인터페이스!
💘 상속과 구현 차이? 구분하여 사용하는 이유? (설명 틀릴 수 있음💦)
- 둘 모두 다형성에 기여하지만, 일반적으로
객체간 상관관계가 더 클 때(멤버변수, 메서드 내용 공유 O) -> 상속
상속보다 관련성이 적은(멤버변수, 메서드 내용 공유 X) 관계 -> 구현
: 접점. 노출되는 부분, 외부로 드러나는 부분.
= 사용자(ex) 유저, 다른 객체)가 사용할 수 있도록 드러난 부분.
private
은 상속X), interface는 그 제한이 더 커진 것.)1.8부터 interface는 'default 메서드', 'static 메서드'도 가질 수 있다.
interface IFoo {
public static final int NUM1= 100;
int NUM2 = 200;
// 기본적으로 멤버변수가 public + static final이므로 생략 가능
public abstract void todo();
void doit();
// 기본적으로 메서드가 public + abstract이므로 생략 가능
}
구성요소가 한정되어 있으므로, 멤버변수에서 'public static final', 메서드에서 'public abstract'를 생략할 수 있다.
기능만 명시하고 하위 클래스에서 구현하는 용도
interface 또한 is-a 관계를 만들며 그것을 '구현'이라 부른다.
상속에서 extends
를 사용한다면 구현에서는 implements
를 사용한다.
interface IA {
// 일반적으로 클래스에서 중요한 것은 멤버변수 (메서드도 멤버변수 보호의 목적)
// 인터페이스는 반대로 기능에 포커스가 맞춰져있다. : ~able, ~ing 형태로 명명하는 경우가 많음
}
class B {
}
class C extends B implements IA {
}
class Ex2 {
public static void main(String[] args) {
}
}
🚗 REVIEW - 중복상속의 개념충돌
중복상속시 멤버변수(정보)와 메서드 내용(기능 구현)이 충돌할 수 있어 문제
= 부모클래스가 같은 이름의 멤버변수, 같은 헤더의 메서드를 가질 때 충돌이 일어남
- 다르게 보면, 상속은 객체간 관계가 있는데, 구현은 기능 정의만이 전해질 뿐.
관계없는 클래스가 동일한 하위클래스에 상속을 주는 것은 이상하지만, 관계없는 기능이 하나의 하위 클래스에 전해지는 것은 문제 없다.
구현은 상속보다 덜 까다롭다
interface는 제한이 많은 만큼 들어갈 수 있는 요소가 적고, 오히려 그만큼 사용할 때 제한이 적다.
(상속은 상위 클래스에서 정보(멤버변수)와 구체적 기능(일반 메서드)도 물려받지만, interface는 기능 정의만을 받는다)
즉 interface를 사용하면 일반 클래스를 상속할 때 가질 수밖에 없는 한계를 벗어나, 더 다양하고 자유로운 이용이 가능하다.
인터페이스는 인터페이스를 상속할 수 있다.
인터페이스는 인터페이스를 다중상속할 수 있다.
상속받는 하위 인터페이스만 implements해도 되지만, 정의되는 기능을 한 눈에 보기 위해 상속 관계가 있더라도 하나하나 다 적어줄 수 있다.
같으면 extends
사용, 다르면 implements
class - class : extends
class - interface : implements
interface - interface : extends
java 기능, 명명 참고 - java api
구글링보다 먼저 해야 함 (자바 창립자가 만든 자바 설명서니까)
인터페이스 = '클래스 간의 상호작용을 기술하는 규격(약속)'
- 제조사가 서로 직접 정보를 주고받지 않음에도 불구하고 충전기와 핸드폰이 결합될 수 있는 이유는, 중간에 인터페이스가 존재하며, 그 인터페이스를 서로 알고 있기 때문.
- 인터페이스 안에는 추상메서드(= only 헤더 = 메서드가 뭘 하는지만 알려줌)만 존재
- 인터페이스는 추상메서드를 노출시키는 것으로 하위 클래스가 무엇을 하는지(할 수 있는지) 알려준다.
ex) 리모컨의 버튼 <- 기능이 구현되는 과정은 모르지만 무슨 기능이 있는지 알 수 있다.
- 인터페이스는 다 비슷하다. 그래야 처음 보는 사람도 바로 쓸 수 있다.
class A {
int num = 4;
}
class B extends A{
int num = 6;
public void todo() {
System.out.println(num);
System.out.println(this.num);
System.out.println(super.num);
}
}
class Ex2 {
public static void main(String[] args) {
B b = new B();
b.todo();
}
}