개발자 미니민의 개발스터디

[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

활동하기