본문 바로가기
Programming/Java

Interface (인터페이스)

인터페이스: 개발 코드와 객체가 서로 통신하는 접점. 객체 사용법을 정의한 타입

                   -> 다형성 구현 可. 다양한 객체 동일 사용법으로 이용 可

ex) 한 집에 여러 개의 같은 회사 제품 에어컨(객체)을 작동 가능한 리모콘(인터페이스)

 

인터페이스는 객체 생성 불가 -> 생성자 불가 -> 객체에서 실행되므로 인터페이스는 추상 메소드 자동 선언.

상수필드(constant field) 자동 선언  -> 인터페이스에 선언된 필드는 모두 public static final이 생략된 개념

package sec01.exam04;

public interface RemoteControl {    // 인터페이스 선언
	//상수 필드(constant field = public static final) 자동 선언
	int MAX_VOLUME = 10;  // 대문자로 써주자
	int MIN_VOLUME = 0;
	
	//추상 메소드 선언부만 작성   <- 반드시 구현해야함 (abstract 안써도 자동 선언)
	void turnOn();
	void turnOff();
	void setVolume(int volume);
}

 

 

인터페이스는 implements로 구현한다. (구현 클래스)

package sec01.exam04;

public class Audio implements RemoteControl {   // 인터페이스 구현한 클래스
	//필드
	private int volume;
	
	//turnOn() 추상 메소드1 의 실체 메소드 1
	public void turnOn() {
		System.out.println("Audio를 켭니다.");
	}	
	//turnOff() 추상 메소드2 의 실체 메소드 2
	public void turnOff() {
		System.out.println("Audio를 끕니다.");
	}
	//setVolume() 추상 메소드3 의 실체 메소드 3
	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("현재 Audio 볼륨: " + this.volume);
	}
}

 

이 인터페이스를 그대로 적용한 TV도 동일하게 생성 가능하다.

package sec01.exam04;

public class Television implements RemoteControl {
	//필드
	private int volume;
	
	//turnOn() 추상 메소드의 실체 메소드
	public void turnOn() {
		System.out.println("TV를 켭니다.");
	}	
	//turnOff() 추상 메소드의 실체 메소드
	public void turnOff() {
		System.out.println("TV를 끕니다.");
	}
	//setVolume() 추상 메소드의 실체 메소드
	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);
	}
}

 

 

그러면 이를 어찌 실행하는가?

package sec01.exam04;

public class RemoteControlExample {
	public static void main(String[] args) {
		RemoteControl rc;   // 인터페이스 타입 선언
		rc = new Television();  // 참조타입에 선언
		rc = new Audio();   // 참조타입에 선언
	}
}

 

 

 

 

 

다중 인터페이스: 어떤 리모콘을 써도 tv는 꺼진다는 개념. 인터페이스 연결 implemnets 여러개 可

package sec01.exam05;

public interface Searchable {
	void search(String url);
}

또 다른 인터페이스 Searchable이 있다고 할 때

 

 

package sec01.exam05;

public class SmartTelevision implements RemoteControl, Searchable {
	private int volume;
	
	public void turnOn() {
		System.out.println("TV를 켭니다.");
	}	
	public void turnOff() {
		System.out.println("TV를 끕니다.");
	}
	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 void search(String url) {
		System.out.println(url + "을 검색합니다.");
	}
}

이렇게 두 인터페이스 모두 implemnets 가능하다.

 

 

이를 구현하는 예제는 다음과 같다

1)----------------

TV를 켭니다.

현재 TV 볼륨: 5

2)----------------

Audio를 켭니다.

현재 Audio 볼륨: 5

3)----------------

Audio를 켭니다.

현재 Audio 볼륨: 5

4)----------------

TV를 켭니다.

현재 TV 볼륨: 5

 

 

 

 

 

인터페이스 promotion(자동타입변환): 구현 객체가 인터페이스 타입으로 변환되는 것 (인터페이스 메소드만 사용 可)

package sec02.exam02;

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로 자동타입변환
		driver.drive(taxi);  // vehicle로 자동타입변환
	}
}

인터페이스 casting(강제타입변환): 다시 기존으로 돌려서 구현 객체의 메소드를 사용하고자 할 때.

instanceof: 강제타입변환 가능한지 확인하기

package sec02.exam04;

public class Driver {
	public void drive(Vehicle vehicle) {
		if(vehicle instanceof Bus) {  // Bus가 vehicle로 변환된건지 확인
			Bus bus = (Bus) vehicle;  // 변환된 것일 경우 Bus로 다시 강제 타입 변환
			bus.checkFare();  // bus에만 있는 메소드 실행 목적
		}
		vehicle.run();
	}
}

 

 

 

 

 

 

인터페이스 상속: extends로 두 개 이상의 다중 상속 可 

 

 

 

구현하는 인터페이스

package sec02.exam05;

public class ImplementationC implements InterfaceC {  // 추상 methodA B C를 실체화하는 내용
	public void methodA() {
		System.out.println("ImplementationC-methodA() 실행");
	}	
	
	public void methodB() {
		System.out.println("ImplementationC-methodB() 실행");
	}
	
	public void methodC() {
		System.out.println("ImplementationC-methodC() 실행");
	}
}

 

 

이를 호출(실행)하는 코드

package sec02.exam05;

public class Example { // 메소드 호출 예제
	public static void main(String[] args) {
		ImplementationC impl = new ImplementationC();  // impl로 객체화
		
		InterfaceA ia = impl;
		ia.methodA();  // A는 A만 可
		System.out.println();
		
		InterfaceB ib = impl;
		ib.methodB();  // B는 B만 可
		System.out.println();
		
		InterfaceC ic = impl;
		ic.methodA();  // C는 모두 可
		ic.methodB();
		ic.methodC();
	}
}

ImplementationC-methodA() 실행    <- A 인터페이스 호출결과

 

ImplementationC-methodB() 실행    <- B 인터페이스 호출 결과

 

ImplementationC-methodA() 실행    <- C 인터페이스 호출 결과 (전부 可)

ImplementationC-methodB() 실행

ImplementationC-methodC() 실행

 

 

 

 

728x90
반응형