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

[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

활동하기