[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);
블로그의 정보
개발자 미니민의 개발로그
mini_min