JAVA/기본 이론

JAVA | 인터페이스(Interface)

로아다 2023. 4. 1. 21:43
728x90
반응형
인터페이스 (Interface)

- 추상 클래스처럼 내부에 추상 메서드를 지닐 있다.

- 인터페이스 내부에 선언하는 모든 변수들은 자동으로 final static이 된다.

- 인터페이스 내부에 선언하는 메서드는 모두 자동으로 abstract public이 된다.

- 추상 클래스는 하나밖에 상속받을 없지만, 인터페이스는 여러개 구현 받을 수 있다.

- 인터페이스를 통해 하나의 클래스가 더욱 다양한 형태를 지닐 있게 된다.

- 추상 클래스에는 인스턴스 영역이 존재하지만, 인터페이스에는 인스턴스 영역이 아예 없다.

 

package myinterface;

public interface Swimmer {
	// abstract : 자식 클래스로 구현을 미룬다.
	public abstract void swin();
	
	// abstract public을 생략해도 자동으로 abstract public 메서드가 된다.
	// 아무것도 안붙여도 자식 클래스로 구현을 미룬다.
	void dive(int meter);
}
package myobj2;

public interface Runner {
	void run();
}
package myobj2;

import myinterface.Swimmer;

public class Shark implements Swimmer {

	int speed;
	
	@Override
	public void swin() {
		System.out.println("상어가 " + speed + "의 속도로 헤엄칩니다.");
	}
	
	@Override
	public void dive(int meter) {
		System.out.println("상어가 " + meter + "만큼 잠수했습니다.");
	}
}
package myobj2;

import myinterface.Swimmer;

public class Bear implements Swimmer, Runner {
	int runSpeed;
	int swimSpeed;
	
	@Override
	public void run() {
		System.out.printf("곰이 %d의 속도로 뜁니다.\n", runSpeed);
	}
	
	@Override
	public void swin() {
		System.out.printf("곰이 %d의 속도로 헤엄칩니다.\n", swimSpeed);
	}
	
	@Override
	public void dive(int meter) {
		System.out.println("곰은 잠수는 잘 못합니다.");
		System.out.println("곰이 " + meter * 0.3 + "만큼 잠수했습니다.");
	}
}
import myinterface.Swimmer;
import myobj2.Bear;
import myobj2.Runner;
import myobj2.Shark;

public class C17_Interface {

	// 뭐가 올지 모르겠지만 뛸 수 있는 것은 모두 전달될 수 있는 메서드
	public static void run(Runner r) {
		r.run();
	}
	
	// 뭐가 올지 모르겠지만 수영할 수 있는 것은 모두 전달될 수 있는 메서드
	public static void swim(Swimmer s) {
		s.swin();
		s.dive(10);
	}
	
	public static void main(String[] args) {
		Bear b = new Bear();
		Shark s = new Shark();
		
		// 인터페이스 타입으로 변수를 선언할 수 있고 업 캐스팅이 가능
		Swimmer swim1 = b;
		Swimmer swim2 = s;
		Runner run1 = b;
		run(new Bear());
		swim(new Bear());
		swim(new Shark());
	}
}
728x90
반응형