インタフェース
10412 ワード
インプリメンテーションクラスは、リレーションシップを含めるためにより多く使用されます(独立したオブジェクトを作成します).
抽象、インタフェースは継承時に意味のあるクラスでなければなりません.
ただ、インタフェースには既存のものは一つもありません.オブジェクトを作成できません.
クラスにいくつかの機能を強制したい場合に使用します.
継承によってインプリメンテーションクラスを作成し、作成したものをフレームワークのロールに渡します.
BeatはInterfaceで作る機能です
インタフェースのデフォルトはpublicです.(外部で実施する必要があるため)
パフォーマンスをテストするためのテストフレームワークを作成しました.
package ex03.inheritance.interface15;
//인터페이스 == (모두 추상메서드로 구성된)추상클래스
/*
1) IMp3를 기반으로 TestFramework를 만든다 : 비트캠프
2) IMp3를 상속받아 구현클래스를 만들도록 한다 : 비트캠프 -> 삼성,LG,소니
3) DI(Dependency Injection)으로 테스트를 진행한다
*/
/*
* 아래의 추상클래스로 작성한 것과 동일하다
public abstract class IMp3 {
public abstract void playMusic();
public abstract void listenFM();
public abstract void viewPhoto();
}
*/
/*
1) 직접 객체를 만들 수 없다
2) Specification의 역할(상세서) : 구현할 목록은 이런 메서드다
3) 상속을 전제로 한다 : 상속을 시켜서 구현 클래스를 제작한다
4) 인터페이스의 참조변수는 클래스와 클래스를 연결해주는 역할을 한다
: 인터페이스의 기능을 사용하는 클래스에
인터페이스를 상속받은 클래스가 참여하도록 해준다
5) Spring Framework도 이렇게 이루어져 있다
*/
public interface IMp3 {
int playMusic();
int listenFM();
int viewPhoto();
}
package ex03.inheritance.interface15;
public class Mp3TestFramework {
// 테스트 회수 정의
final int MUSIC_TEST = 3;
final int RADIO_TEST = 5;
final int PHOTO_TEST = 2;
final int INTERGRATED_TEST = 10;
final int DELAY_TIME = 300; //이렇게 해줘야 여기 하나를 바꾸면 사용하는 모든 곳에서 한번에 바뀌게 된다.
// 외부에서 객체를 전달받아서 저장하는 필드
private IMp3 iMp3; //자식의 객체를 받는다. 부모는 interface이기 때문에 객체생성이 안됨!
int score = 0;
// Setter를 통해서 자식 객체를 주입받는다, 중간에 언제든지 이 setter메서드를 통해 교체할 수 있다.
public void setiMp3(IMp3 iMp3) {
this.iMp3 = iMp3;
this.score = 0; //새로운 객체가 주입되는 순간 0으로 초기화
}
// 생성자를 통해 IMp3의 자식 객체를 주입받는다(DI)
// 마틴 파울러
public Mp3TestFramework(IMp3 mp3){
this.iMp3 = mp3;
this.score = 0;
}
public Mp3TestFramework() {
}
public void musicTest() throws InterruptedException {
for (int i = 0; i < MUSIC_TEST; i++)
score += iMp3.playMusic();
Thread.sleep(DELAY_TIME); //테스트할 때마다 시간을 늘려서 점수의 차이를 관찰할 수 있도록~
}
public void radioTest() throws InterruptedException {
for (int i = 0; i < RADIO_TEST; i++)
score += iMp3.listenFM();
Thread.sleep(DELAY_TIME);
}
public void photoTest() throws InterruptedException {
for (int i = 0; i < PHOTO_TEST; i++)
score += iMp3.viewPhoto();
Thread.sleep(DELAY_TIME);
}
public void intergratedTest() throws InterruptedException {
for (int i = 0; i < INTERGRATED_TEST; i++) {
score += iMp3.playMusic();
Thread.sleep(DELAY_TIME);
score += iMp3.listenFM();
Thread.sleep(DELAY_TIME);
score += iMp3.viewPhoto();
}
}
public int showScore() {
System.out.println("[총점] : " + score);
System.out.println("------------------------\n");
return score;
}
}
package ex03.inheritance.interface15;
public class SamsungMp3 implements IMp3{
final double MAX_SCORE = 9.99;
@Override
public int playMusic() {
System.out.println("Samsung - 음악의 품질이 매우 좋다 ♬");
return (int)(Math.random()*MAX_SCORE); //double형과 double형이 곱셈 후 int로 나옴
}
@Override
public int listenFM() {
System.out.println("Samsung - 라디오 소리가 깨끗하다 ♡");
return (int)(Math.random()*MAX_SCORE);
}
@Override
public int viewPhoto() {
System.out.println("Samsung - 사진이 선명하다 ♧");
return (int)(Math.random()*MAX_SCORE);
}
}
package ex03.inheritance.interface15;
public class LgMp3 implements IMp3 {
final double MAX_SCORE = 9.98;
@Override
public int playMusic() {
System.out.println("Lg - 음악이 부드럽게 들린다~ ♬");
return (int)(Math.random()*MAX_SCORE);
}
@Override
public int listenFM() {
System.out.println("Lg - 라디오를 들으니 편안하다~ ♡");
return (int)(Math.random()*MAX_SCORE);
}
@Override
public int viewPhoto() {
System.out.println("Lg - 사진이 화사하다~ ♧");
return (int)(Math.random()*MAX_SCORE);
}
}
package ex03.inheritance.interface15;
public class SonyMp3 implements IMp3 {
final double MAX_SCORE = 9.97;
@Override
public int playMusic() {
System.out.println("Sony - 가수가 노래를 부른다 ‡");
return (int)(Math.random()*MAX_SCORE);
}
@Override
public int listenFM() {
System.out.println("Sony - 가수가 이상한 랩을 한다 ☜");
return (int)(Math.random()*MAX_SCORE);
}
@Override
public int viewPhoto() {
System.out.println("Sony - 가수가 밥을 먹는다§");
return (int)(Math.random()*MAX_SCORE);
}
}
package ex03.inheritance.interface15;
public class TestMain {
public static void main(String[] args) throws InterruptedException {
Mp3TestFramework test = new Mp3TestFramework();
IMp3[] mp3 = new IMp3[] {
new SamsungMp3(),
new LgMp3(),
new SonyMp3()
};
for(int i = 0; i < mp3.length; i++) {
test.setiMp3(mp3[i]); //외부에서 자식 객체 주입
test.musicTest();
test.radioTest();
test.photoTest();
test.intergratedTest();
test.showScore();
}
}
}
会社別の比較点数に変更して、最高点数を表示します.会社名は共通名でなければならないため、インタフェースを抽象クラスに変換します.
次にsetterとgetterを作成します.
package ex03.inheritance.abstractInterface16;
public abstract class IMp3 {
private String companyName;
public String getCompanyName() {
return companyName;
}
public IMp3(String companyName) {
this.companyName = companyName;
}
public abstract int playMusic();
public abstract int listenFM();
public abstract int viewPhoto();
}
/*
public interface IMp3 {
int playMusic();
int listenFM();
int viewPhoto();
}
*/
package ex03.inheritance.abstractInterface16;
public class Mp3TestFramework {
public String winCompany; // 최종 선정업체
public int hireScore = 0; // 가장 높은 점수
// 테스트 회수 정의
final int MUSIC_TEST = 3;
final int RADIO_TEST = 5;
final int PHOTO_TEST = 2;
final int INTERGRATED_TEST = 10;
final int DELAY_TIME = 100;
// 외부에서 객체를 전달받아서 저장하는 필드
private IMp3 iMp3;
int score = 0; // 점수
// Setter를 통해서 자식 객체를 주입받는다
public void setiMp3(IMp3 iMp3) {
this.iMp3 = iMp3;
this.score = 0;
}
// 생성자를 통해 IMp3의 자식 객체를 주입받는다(DI)
// 마틴 파울러
public Mp3TestFramework(IMp3 mp3){
this.iMp3 = mp3;
this.score = 0;
}
public Mp3TestFramework(){
}
public void musicTest() throws InterruptedException {
for (int i = 0; i < MUSIC_TEST; i++) {
score += iMp3.playMusic();
Thread.sleep(DELAY_TIME);
}
}
public void radioTest() throws InterruptedException {
for (int i = 0; i < RADIO_TEST; i++) {
score += iMp3.listenFM();
Thread.sleep(DELAY_TIME);
}
}
public void photoTest() throws InterruptedException {
for (int i = 0; i < PHOTO_TEST; i++) {
score += iMp3.viewPhoto();
Thread.sleep(DELAY_TIME);
}
}
public void intergratedTest() throws InterruptedException {
for (int i = 0; i < INTERGRATED_TEST; i++) {
score += iMp3.playMusic();
Thread.sleep(DELAY_TIME);
score += iMp3.listenFM();
Thread.sleep(DELAY_TIME);
score += iMp3.viewPhoto();
}
}
public void showScore() {
System.out.println("[총점] : " + score);
System.out.println("------------------------\n");
setHighScoreCompany();
}
private void setHighScoreCompany() {
if(hireScore < score) {
winCompany = iMp3.getCompanyName();
hireScore = score;
}
}
public void testResult() {
System.out.println("최종 업체 : " + winCompany);
System.out.println("최고 점수 : " + hireScore);
}
}
package ex03.inheritance.abstractInterface16;
public class TestMain {
public static void main(String[] args) throws InterruptedException {
Mp3TestFramework test = new Mp3TestFramework();
IMp3[] mp3 = new IMp3[] {
new SamsungMp3("삼성 Mp3"),
new LgMp3("엘지 Mp3"),
new SonyMp3("소니 Mp3")
};
for (int i = 0; i < mp3.length; i++) {
test.setiMp3(mp3[i]); // 외부에서 자식 객체 주입
test.musicTest();
test.radioTest();
test.photoTest();
test.intergratedTest();
test.showScore();
}
test.testResult();
}
}
package ex03.inheritance.abstractInterface16;
public class SamsungMp3 extends IMp3{
private final double MAX_SCORE = 9.99;
public SamsungMp3(String companyName) {
super(companyName);
}
@Override
public int playMusic() {
System.out.println("Samsung - 음악의 품질이 매우 좋다 ♬");
return (int)(Math.random()*MAX_SCORE);
}
@Override
public int listenFM() {
System.out.println("Samsung - 라디오 소리가 깨끗하다 ♡");
return (int)(Math.random()*MAX_SCORE);
}
@Override
public int viewPhoto() {
System.out.println("Samsung - 사진이 선명하다 ♧");
return (int)(Math.random()*MAX_SCORE);
}
}
package ex03.inheritance.abstractInterface16;
public class LgMp3 extends IMp3 {
final double MAX_SCORE = 9.98;
public LgMp3(String companyName) {
super(companyName);
}
@Override
public int playMusic() {
System.out.println("Lg - 음악이 부드럽게 들린다~ ♬");
return (int)(Math.random()*MAX_SCORE);
}
@Override
public int listenFM() {
System.out.println("Lg - 라디오를 들으니 편안하다~ ♡");
return (int)(Math.random()*MAX_SCORE);
}
@Override
public int viewPhoto() {
System.out.println("Lg - 사진이 화사하다~ ♧");
return (int)(Math.random()*MAX_SCORE);
}
}
package ex03.inheritance.abstractInterface16;
public class SonyMp3 extends IMp3 {
final double MAX_SCORE = 9.8;
public SonyMp3(String companyName) {
super(companyName);
}
@Override
public int playMusic() {
System.out.println("Sony - 가수가 노래를 부른다 ‡");
return (int)(Math.random()*MAX_SCORE);
}
@Override
public int listenFM() {
System.out.println("Sony - 가수가 이상한 랩을 한다 ☜");
return (int)(Math.random()*MAX_SCORE);
}
@Override
public int viewPhoto() {
System.out.println("Sony - 가수가 밥을 먹는다§");
return (int)(Math.random()*MAX_SCORE);
}
}
Reference
この問題について(インタフェース), 我々は、より多くの情報をここで見つけました https://velog.io/@jinkyung/인터페이스-tr10k2viテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol