[JAVA] 자바 - 인터페이스와 추상 클래스 (2)
by mini_min[JAVA]
자바 - 인터페이스와 추상 클래스 (2)
✔️ 인터페이스와 추상클래스
추상 클래스는 인터페이스의 모든 메소드를 구현하지 않아도 된다. (일반 클래스는 구현해야함👏🏻)
ex) abstract class DemoImpl3 implements Demo3 {}
⭕ 만약, 인터페이스 메소드가 2개라면, 추상 클래스가 인터페이스의 메소드 2개를 반드시 모두 구현할 필요는 없다.
= 이때, 추상 클래스는 객체 생성이 불가! 하위 클래스가 반드시 필요하다!
⭕ 추상 클래스를 받는 하위 클래스가 남은 인터페이스의 메소드를 구현한다.
⭐ 클래스 관계도
interface Demo (할아버지) - abstract class DemoImpl3(아부지) - class Test3(자식)
interface Demo3 {
public void print();
public void disp();
}
//추상클래스는 인터페이스의 모든 메소드를 구현하지 않아도 된다.
//추상클래스는 객체 생성이 불가. 하위클래스가 반드시 필요!
abstract class DemoImpl3 implements Demo3 {
@Override
public void disp() {
System.out.println("disp...");
}
}
class Test3 extends DemoImpl3 { //print 가 재정의 안되어있으니 오류가 뜬다.
@Override
public void print() {
System.out.println("print...");
}
}
💡 추상 클래스는 인터페이스 메소드 2개 중 1개를 재정의했고, 추상 클래스의 하위 클래스는 남은 인터페이스 메소드 1개를 재정의했다. 어쨌든 인터페이스의 모든 메소드가 재정의되었다.
✔️ 인터페이스와 인터페이스
인터페이스가 다른 인터페이스를 상속하는 것이 가능하다. 이를 다중 상속이라고 한다.
ex) interface Cdemo4 extends Ademo4, Bdemo4 {}
⭕ (필수) 이들의 구현 클래스가 꼭 있어야한다.
⭕ 일반 클래스가 오는 경우(class), 모든 인터페이스의 메소드를 구현해야한다.
ex) class DemoImpl4 implements Cdemo4 { }
◾ 인터페이스C <- 인터페이스A, B 를 상속 받음
interface Ademo4 {
public void disp();
}
interface Bdemo4 {
public void print();
}
//인터페이스가 다른 인터페이스 상속. 다중 상속 가능
interface Cdemo4 extends Ademo4, Bdemo4 {
public void sub();
}
◾ 인터페이스 구현 클래스(DemoImpl4) 만들기
//인터페이스 구현 클래스 만들기
class DemoImpl4 implements Cdemo4 { //모든 인터페이스 메소드 구현해야함
@Override
public void disp() {
System.out.println("disp! ");
}
@Override
public void print() {
System.out.println("print");
}
@Override
public void sub() {
System.out.println("sub ");
}
}
✔️ 인터페이스에서 static 메소드
인터페이스에서 static 메소드는 오버라이드 하지 않고, 인터페이스명을 이용해 바로 접근이 가능하다.
이는 default 키워드를 이용한 메소드도 마찬가지인데, JDK 8 버전부터 가능하다고 한다.
ex) public static int sum(int n) {}
interface Demo6 {
public void write(int n);
//static 메소드
//jDK 8부터 가능. 인터페이스명을 이용하여 바로 접근
public static int sum(int n) {
int s = 0;
for(int i=1; i<=n; i++) {
s += i;
}
return s;
}
//디폴트 키워드를 붙였을 때 메소드 구현이 가능하다.
//default 키워드를 이용한 메소드 구현
//구현 클래스에서 재정의 가능
public default int max(int m, int n) {
return m > n ? m : n;
}
}
class DemoImpl6 implements Demo6 {
@Override
public void write(int n) {
System.out.println("write...");
}
}
💡 위와 같이 인터페이스 안에 static 메소드가 있다면, 보통의 클래스 메소드처럼 호출이 가능하다.
int s = Demo6.sum(10); (인터페이스명 + . + 클래스 메소드(인자))
write() 메소드는 인스턴스 메소드라 하위 클래스에서 재정의되었다.
💡 public default int max(int m, int n) = 디폴트 키워드 붙였을 때도 메소드 구현이 바로 가능하다.
◾ static 메소드 호출 할 때
int s = Demo6.sum(10);
//보통의 클래스 메소드와 동일하다.
Demo6 obj = new DemoImpl6();
s = obj.max(5, 10);
'Java' 카테고리의 다른 글
[JAVA] 자바 - static 중첩 클래스 & 내부 클래스(member class) (0) | 2022.07.27 |
---|---|
[JAVA] 자바 - 익명 구현(anonymous) (인터페이스 익명 구현) (0) | 2022.07.27 |
[JAVA] 자바 - 인터페이스 (interface) 정의 (1) (0) | 2022.07.26 |
[JAVA] 자바 - 추상화 클래스(abstract 클래스) (0) | 2022.07.26 |
[JAVA] 자바 - 참조형 변수의 다형성, 업 캐스팅(up-casting) (0) | 2022.07.25 |
블로그의 정보
개발자 미니민의 개발로그
mini_min