インタフェース

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);
	}

}