인터페이스: 개발 코드와 객체가 서로 통신하는 접점. 객체 사용법을 정의한 타입
-> 다형성 구현 可. 다양한 객체 동일 사용법으로 이용 可
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() 실행
'Programming > Java' 카테고리의 다른 글
Javascript를 넣은 회원가입창 만들기 (1) | 2023.10.18 |
---|---|
[Java web] Hello JSP (2) | 2023.10.17 |
Inheritance(상속) (1) | 2023.10.16 |
instance, static, package, access modifier (0) | 2023.10.16 |
OOP(Object Oriented Programming) 객체지향 프로그래밍 (0) | 2023.10.13 |