추상클래스 - 2. 인터페이스(Interface)

Ⅱ. 인터페이스(Interface)

1. 인터페이스

    ※ 인터페이스 : 클래스 상호 간의 공통사항을 공유하기 위한 일종의 약속

 - 모든 필드 public static final로 정의

 - 모든 메소드public abstract로 정의 (디폴트 메소드 제외)

 - 인터페이스로 new 연산 못함

 - 인터페이스도 다형성 적용 가능

 - 디폴트 메소드는 public로 정의 - 자체적으로 객체 생성 불가

 

2. 인터페이스 정의

 

3. 인터페이스의 상속

 - 상속 시 implements 사용

// Example
package sample;

// 인터페이스 : 클래스 상호 간의 공통사항을 공유하기 위한 일종의 약속
interface Refri {
	void iceMaking();
	void normalTemp();
	void coldTemp();
}

// 인터페이스는 클래스에 의무를 제공
// 참고 : 인터페이스의 자원은 public 이므로, 상속 시, 이보다 좁아질 수 없음
class LGRefri implements Refri {
	public void iceMaking(){}	// 좁아지지 않기 위해 public을 추가
	public void normalTemp(){}
	public void coldTemp(){}
}

public class Main {
	public static void main(String[] args) {

	}
}

 

 - 다중 상속 가능

 

    ※ 동일한 타입(클래스/인터페이스) 상속 시 extends, 다른 타입을 상속하는 경우 implements

// Example
package sample;

// 다중 상속 예제
interface Camera {void photo();}
interface Phone {void calling();}
interface Memo {void writing();}
interface Clock {void displayTime();}

class SmartPhone implements Camera, Phone, Memo, Clock{
	public void photo() {}
	public void calling() {}
	public void writing() {}
	public void displayTime() {}
}

public class Main {
	public static void main(String[] args) {
		SmartPhone a = new SmartPhone();
		Camera b = new SmartPhone();	// interface는 부모가 자식의 것을 사용 가능
	}
}

 

4. 디폴트 메소드

 - 인터페이스 내부의 완성된 메소드

 - 인터페이스를 추후 수정하고 싶을 때 사용

 

5. 디폴트 메소드의 작성 방법

 - 메소드 앞에 default 키워드 추가

 - 오버라이딩도 가능

// Example
package sample;

// 디폴트 메소드 : 인터페이스에 뒤늦게 추가하는 메소드
interface Dog {
	void bark();
	void eat();
	default void walk() {
		System.out.println("하루 한번 꼭 산책해야 한다");
	}
}

class Pug implements Dog {
	public void bark() {}
	public void eat() {}
	void callwalk() {
		// 부모명.super.메소드
		Dog.super.walk();	// 부모 인터페이스의 디폴트 메소드 호출 방법
	}
}

class Maltese implements Dog {
	public void bark() {}
	public void eat() {}
}

public class Main {
	public static void main(String[] args) {
		
	}
}

6. 정적 메소드의 작성 방법

 - 인터페이스 내에 정적(static) 메소드

    - 클래스 내부의 정적메소드와 사용방법 동일 (객체 생성 없이 클래스 이름으로 바로 접근 가능)