[JAVA] 8. インタフェース
8.インタフェース
8.1インタフェース
オブジェクトの使用方法のタイプを定義します.
開発コードとオブジェクト通信の接点ロール
なぜインタフェースが必要なのか
開発コードを変更せずにオブジェクトのみを変更するには、複数のオブジェクトを使用します.
インタフェース宣言
最初の字は大文字で、残りは小文字です.
クラスはフィールド、作成者、メソッド|インタフェースは定数フィールド、抽象メソッドです.
定数フィールド宣言
共通静的finalタイプ定数名=値;
抽象メソッド宣言
インタフェース呼び出しによるメソッドは、インプリメンテーションオブジェクト上で実行されます.したがって、インタフェースはメソッド実行ブロックを必要としない
インプリメンテーションオブジェクトインプリメンテーションおぶじぇくと:ソリッドメソッドそりっどほうしき;インプリメンテーションクラスじぇくと:インプリメンテーションオブジェクトのクラスを生成します
抽象メソッドちゅうしょうほう:かっこなしメソッド
[public abstract]は、タイプメソッド名(パラメータ、...)を返します.
package sec01.exam03;
public interface RemoteControl {
//상수
int MAX_VOLUME = 10;
int MIN_VOLUME = 0;
//추상 메소드
void turnOn();
void turnOff();
void setVolume(int volume);
}
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);
}
}
インタフェースを使用してオブジェクトを生成できます.インプリメンテーションクラスを作成したら、new演算子を使用してオブジェクトを作成できます.
package sec01.exam04;
public class RemoteControlExample {
public static void main(String[] args) {
RemoteControl rc;
rc = new Television(); // 인터페이스 변수 = 구현객체
rc = new Audio();
}
}
マルチインタフェース実装クラス
public class SmartTelevision implements RemoteControl, Searchable {
// 인터페이스 RemoteControl 에 선언된 추상메소드의 실체메소드 선언
// 인터페이스 Searchable 에 선언된 추상메소드의 실체메소드 선언
}
インタフェースの使用
「RemoteControl」は、開発コードとインプリメンテーションオブジェクトの間で接点ロールとして機能します.
コード呼び出しインタフェース宣言の抽象メソッドを開発し,インタフェース呼び出し実装オブジェクトの再定義メソッド
package sec01.exam06;
public class MyClass {
// 필드 : 인터페이스가 필드 타입으로 사용될 경우, 필드에 구현 객체 대입 가능
RemoteControl rc = new Television();
// 생성자
MyClass() {
}
// 생성자 : 인터페이스가 생성자의 매개변수로 사용될 경우, new 연산자로 객체 생성할 때 구현 객체를 매개값으로 줄 수 있다
// MyClass myClass1 = new MyClass(new Television());
MyClass(RemoteControl rc) {
this.rc = rc;
rc.turnOn();
rc.setVolume(5);
}
// 메소드
void methodA() {
RemoteControl rc = new Audio();
rc.turnOn();
rc.setVolume(5);
}
// 메소드 : 인터페이스가 메소드의 매개 변수 타입으로 사용될 경우, 메소드 호출 시 구현 객체를 매개값으로 대입 가능
void methodB(RemoteControl rc) {
rc.turnOn();
rc.setVolume(5);
}
}
public class MyClassExample {
public static void main(String[] args) {
System.out.println("1)----------------");
MyClass myClass1 = new MyClass();
myClass1.rc.turnOn();
myClass1.rc.setVolume(5);
System.out.println("2)----------------");
MyClass myClass2 = new MyClass(new Audio());
System.out.println("3)----------------");
MyClass myClass3 = new MyClass();
myClass3.methodA();
System.out.println("4)----------------");
MyClass myClass4 = new MyClass();
myClass4.methodB(new Television());
}
}
/*
1)--------------
TV를 켭니다.
현재 TV 볼륨: 5
2)--------------
Audio를 켭니다.
현재 Audio 볼륨: 5
3)--------------
Audio를 켭니다.
현재 Audio 볼륨: 5
4)--------------
TV를 켭니다.
현재 TV 볼륨: 5
*/
package sec01.exam06;
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.exam06;
public class Audio implements RemoteControl {
//필드
private int volume;
//turnOn() 추상 메소드의 실체 메소드
public void turnOn() {
System.out.println("Audio를 켭니다.");
}
//turnOff() 추상 메소드의 실체 메소드
public void turnOff() {
System.out.println("Audio를 끕니다.");
}
//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("현재 Audio 볼륨: " + this.volume);
}
}
8.2タイプ変換過多
開始前
多形性を実現するには、メソッドと変換タイプを再定義する必要があります.
継承、マルチインタフェース実装
->継承はサブクラスを作成するテクノロジーです
->インタフェース同じクラスを使用したテクノロジーの作成
インタフェースの多形性とは,インタフェースによる実装オブジェクトの置き換えにより実行結果を多様化することである.
自動タイプ変換
自動タイプ変換:インプリメンテーションオブジェクトをインタフェースタイプに変換
인터페이스 변수 = 구현객체;
インタフェースインプリメンテーションクラスを継承してサブクラスを作成すると、サブオブジェクトは自動的にタイプを変換することもできます.自動タイプ変換により、フィールドの多形性とパラメータの多形性を実現できます.
フィールドの多形性
package sec02.exam01;
public interface Tire {
public void roll(); // roll()메서드 호출 방법 설명
}
package sec02.exam01;
public class HankookTire implements Tire {
// Tire 인터페이스 구현
@Override
public void roll() {
System.out.println("한국 타이어가 굴러갑니다.");
}
}
package sec02.exam01;
public class KumhoTire implements Tire {
// Tire 인터페이스 구현
@Override
public void roll() {
System.out.println("금호 타이어가 굴러갑니다.");
}
}
package sec02.exam01;
public class Car {
// 인터페이스 타입 필드 선언과 초기 구현 객체 대입
Tire frontLeftTire = new HankookTire();
Tire frontRightTire = new HankookTire();
Tire backLeftTire = new HankookTire();
Tire backRightTire = new HankookTire();
// 인터페이스에서 설명된 roll()메소드 호출
void run() {
frontLeftTire.roll();
frontRightTire.roll();
backLeftTire.roll();
backRightTire.roll();
}
}
package sec02.exam01;
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();
}
}
パラメータの多形性
パラメータのタイプがインタフェースの場合、どのインプリメンテーションオブジェクトが提供されているかによって、どのインプリメンテーションオブジェクトもパラメータとして使用できます.
メソッドの実行結果は多様である可能性があります.これが界面パラメータの多形性である.
package sec02.exam02;
public class Driver {
public void drive(Vehicle vehicle) { // 인터페이스 타입으로 매개변수 주기!!
vehicle.run(); // 구현객체의 run메소드 실행됨
}
}
package sec02.exam02;
public interface Vehicle {
public void run();
}
package sec02.exam02;
public class Bus implements Vehicle {
@Override
public void run() {
System.out.println("버스가 달립니다.");
}
}
package sec02.exam02;
public class Taxi implements Vehicle {
@Override
public void run() {
System.out.println("택시가 달립니다.");
}
}
package sec02.exam02;
public class DriverExample {
public static void main(String[] args) {
Driver driver = new Driver();
// 객체 생성
Bus bus = new Bus();
Taxi taxi = new Taxi();
// Vehicle vehicle = bus; 자동 타입 변환
driver.drive(bus);
driver.drive(taxi);
}
}
強制型変換
インプリメンテーションオブジェクトが自動タイプの場合、インタフェースで宣言されたメソッドのみが使用できます.
ただし、強制タイプでは、クラス内の他のフィールドとメソッドを実装できます.
구현클래스 변수 = (구현클래스) 인터페이스변수;
package sec02.exam03;
public interface Vehicle {
public void run();
}
package sec02.exam03;
public class Bus implements Vehicle {
@Override
public void run() {
System.out.println("버스가 달립니다.");
}
public void checkFare() {
System.out.println("승차요금을 체크합니다.");
}
}
package sec02.exam03;
public class VehicleExample {
public static void main(String[] args) {
Vehicle vehicle = new Bus();
vehicle.run();
//vehicle.checkFare(); (x) - vehicle 인터페이스에는 이메소드 없음
Bus bus = (Bus) vehicle; //강제타입변환
bus.run();
bus.checkFare();
}
}
オブジェクトタイプのチェック
強制タイプ変換は、オブジェクトをインタフェースタイプに変換する場合に使用できます.
強制型変換ではClassCastExceptionなどのエラーが発生します.
package sec02.exam04;
public class Driver {
public void drive(Vehicle vehicle) { // VEHICLE에는 BUS, TAXI 객체
if(vehicle instanceof Bus) { // vehicle 매개변수가 참조하는 객체가 bus인지 조사
Bus bus = (Bus) vehicle; // bus 객체일 경우 안전하게 강제 타입 변환
bus.checkFare(); // bus 타입으로 강제 타입 변환 하는 이유
}
vehicle.run();
}
}
インタフェースの継承
複数の継承を許可
サブインタフェースには、親インタフェース内のすべての抽象メソッドのエンティティメソッドが必要です.
public 인터페이스 하위인터페이스 extends 상위인터페이스1, 상위인터페이스2 {}
Reference
この問題について([JAVA] 8. インタフェース), 我々は、より多くの情報をここで見つけました https://velog.io/@redcarrot01/JAVA-8.-인터페이스テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol