public interface 인터페이스이름 {…}
로 선언상수 필드 선언
public interface RemoteControl {
public int MAX_VALUE = 10;
}
추상 메소드 선언
public interface RemoteControl {
public int MAX_VALUE = 10;
//추상 메소드
public void turnOn();
public void turnOff();
public void setVolume(int volume);
// 메소드 선언부만 작성
인터페이스에서 정의된 추상 메소드와 동일한 메소드 이름, 매개타입을 가진 실체 메소드를 가지고 있는 객체를 ‘구현 객체’
보통의 클래스와 동일하고 인터페이스 타입으로 사용할 수 있음을 알려주기 위해 implements 키워드 추가
implements 뒤에 여러 인터페이스 추가해서 다중으로도 사용 가능
public class 구현클래스이름 implements 인터페이스이름 {…}
public class Television implements RemoteControl {
private int volume;
// turnOn() 추상 메소드의 실체 메소드
public void turnOn() {
System.out.println("TV를 켭니다");
}
public void turnOff() {
System.out.println("TV를 끕니다");
}
//setVolume 추상메소드의 실체 메소드
// 인터페이스 상수를 이용해서 volume필드의 값을 제한
public void setVolume(int volume) {
if(volume>RemoteControl.MAX_VOLUME) {
this.volume = RemoteControl.MAX_VOLUME;
} else if(volume<RemoteControl.MIN_VOLUME) {
this.volume = RemoteControl.MIN_VOLUME;
} else {
this.volume = volume;
}
System.out.println("현재 TV 볼륨: " + this.volume);
}
}
public class RemoteControlExample {
public static void main(String[] args) {
RemoteControl rc;
rc = new Television();
rc = new Audio();
}
}
public class MyClass {
// 1. 인터페이스가 필드 타입으로 사용될 경우, 필드에 구현객체 대입 가능
RemoteControl rc = new Television();
// 2. 인터페이스가 생성자의 매개 변수 타입으로 사용될 경우,
// new 연산자로 객체를 생성할 때 구현 객체를 생성자의 매개값으로 대입 가능
MyClass(RemoteControl rc) { // 생성자의 매개값으로 구현 객체 대입
this.rc = rc;
}
void methodA() {
// 3. 인터페이스가 로컬 변수 타입으로 사용될 경우, 변수에 구현 객체를 대입 가능
RemoteControl rc = new Audio();
}
// 4. 인터페이스가 메소드의 매개 변수 타입으로 사용될 경우, 메소드 호출 시 구현 객체를 매개값으로 대입 가능
void methodB(RemoteControl rc) { // 생성자의 매개값으로 구현 객체 대입
}
}
1에서 선언된 필드 rc 사용
Myclass myClass = new MyClass();
myClass.rc.turnOn(); // Television의 turnOn()이 실행
myClass.rc.setVolume(5); // Television의 setVolume()이 실행
2에서 생성자 매개변수 타입으로 선언된 rc 사용
MyClass( RemoteControl rc) {
this.rc = rc;
rc.turnOn();
rc.setVolume(5);
}
3에서 로컬 변수로 선언된 rc 사용
void methodA() {
RemoteControl rc = new Audio();
rc.turnOn(); // Audio의 turnOn()이 실행
rc.setVolume(5); // Audio의 setVolume()이 실행
}
4에서 메소드의 매개변수 타입으로 선언된 rc 사용
void methodB(RemoteControl rc) {
rc.turnOn();
rc.setVolume(5);
}
// Tire.java
public interface Tire {
public void roll();
}
// Hankook.java
public class HankookTire implements Tire {
@Override
public void roll() {
System.out.println("한국 타이어가 굴러갑니다.");
}
}
// Kumho.java
public class KumhoTire implements Tire {
@Override
public void roll() {
System.out.println("금호 타이어가 굴러갑니다.");
}
}
// Car.java
public class Car {
// 인터페이스 타입 필드 선언과 초기 구현 객체 대입
Tire frontLeftTire = new HankookTire();
Tire frontRightTire = new HankookTire();
Tire backLeftTire = new HankookTire();
Tire backRightTire = new HankookTire();
void run() {
// 인터페이스에서 설명된 roll()메소드 호
frontLeftTire.roll();
frontRightTire.roll();
backLeftTire.roll();
backRightTire.roll();
}
}
// example.java
public class CarExample {
public static void main(String[] args) {
Car myCar = new Car();
myCar.run();
myCar.frontLeftTire = new KumhoTire();
myCar.frontRightTire = new KumhoTire();
myCar.run();
}
}
// 출력결과
한국 타이어가 굴러갑니다
한국 타이어가 굴러갑니다
한국 타이어가 굴러갑니다
한국 타이어가 굴러갑니다
금호 타이어가 굴러갑니다 // 두개만 타이어 교체 했음
금호 타이어가 굴러갑니다
한국 타이어가 굴러갑니다
한국 타이어가 굴러갑니다
//Driver.java
public class Driver {
public void drive(Vehicle vehicle) {
vehicle.run();
}
}
//Vehicle.java
public interface Vehicle {
public void run();
}
//Bus.java
public class Bus implements Vehicle {
@Override
public void run() {
System.out.println("버스가 달립니다.");
}
}
//Taxi
public class Taxi implements Vehicle {
@Override
public void run() {
System.out.println("택시가 달립니.");
}
}
//example.java
public class DriverExample {
public static void main(String[] args) {
Driver driver = new Driver();
Bus bus = new Bus();
Taxi taxi = new Taxi();
driver.drive(bus); // 자동 타입 변환: Vehicle vehicle = bus;
driver.drive(taxi); // 자동 타입 변환
}
}
//출력결과
버스가 달립니다.
택시가 달립니다.
//Vehicle.java
public interface Vehicle {
public void run();
}
//Bus.java
public class Bus implements Vehicle {
@Override
public void run() {
System.out.println("버스가 달립니다.");
}
public void checkFare() {
System.out.println("승차요금을 체크합니다.");
}
}
//example.java
public class VehicleExample {
public static void main(String[] args) {
Vehicle vehicle = new Bus();
vehicle.run();
//vehicle.checkFare(); (x) vehicle 인터페이스에는 checkFare()가 없음
Bus bus = (Bus) vehicle; //강제 타입 변환
bus.run();
bus.checkFare(); // Bus클래스에는 checkFare()가 있음
}
}
//출력결과
버스가 달립니다.
버스가 달립니다.
승차요금을 체크합니다.
public class Driver {
public void drive(Vehicle vehicle) {
if(vehicle instanceof Bus) { // vehucle 매개변수가 참조하는 객체가 Bus인지 조사
Bus bus = (Bus) vehicle; // Bus 객체면 강제타입 변환
bus.checkFare(); // 강제 변환해야 하는 이유
}
vehicle.run();
}
}
public interface 하위인터페이스 extends 상위1, 상위2 {…}