본문 바로가기

JAVA/DAY 16 _ 23.09.07

Polymorphism활용_TV

1. Main

public static void main(String[] args) {

    // 조립식 설정코드
    TvFactory factory = new TvFactory();	// 기본생성자로 불러오기.

    Tv tv1 = factory.create("Samsung");		// 여기서 삼성을 엘지로 손수 바꿔줘도 되겠지만은.....
    Tv tv2 = factory.create("Lg");


    // 실행코드
    User user = new User();
    user.setTv(tv2);		// 여기에 tv1으르 넣는지 2를 넣는지에 따라 출력이 달라짐.
    user.watchTv();
}

 

2. TV(interface)

// 자바 문법에서의 인터페이스? API들의 표준을 제공하는 것.
// 1. 조립식 프로그래밍(-> 오버라이딩을 이용)이 가능해진다!
// 2. 결합도를 낮춘다 --> 유지/보수가 용이해진다.

public interface Tv {
	
	// abstract가 기본으로 탑재돼있다. (굳이 써주지 않아도 됨)
	public void powerOn();
	public void powerOff();
	public void soundUp();
	public void soundDown();
}

 

3. SamsungTv(implements TV)

public class SamsungTv implements Tv {
	
	
	public void powerOn() {			// interface Tv의 메서드명과 똑같이. (= 오버라이딩)
		System.out.println("삼성TV의 전원을 켠다");	
	}

	public void powerOff() {
		System.out.println("삼성TV의 전원을 끈다");	
	}

	
//	public void volumeUp() {
//		System.out.println("삼성TV의 소리를 높인다");
//	}
//	
//	public void volumeDown() {
//		System.out.println("삼성TV의 소리를 낮춘다");
//	}
	
	
	public void soundUp() {
		System.out.println("삼성TV의 소리를 높인다");	
	}
	
	public void soundDown() {
		System.out.println("삼성TV의 소리를 낮춘다");
	}

}

 

4. LgTv()(implements TV)

public class LgTv implements Tv{

//	public void turnOn() {
//		System.out.println("LG TV의 전원을 켠다");
//	}
//	
//	public void turnOff() {
//		System.out.println("LG TV의 전원을 끈다");
//	}
	
	public void soundUp() {
		System.out.println("LG TV의 소리를 높인다");
	}
	
	public void soundDown() {
		System.out.println("LG TV의 소리를 낮춘다");
	}
	
	public void powerOn() {
		System.out.println("LG TV의 전원을 켠다");
	}
	
	public void powerOff() {
		System.out.println("LG TV의 전원을 끈다");
	}
	
}

 

5. TvFactory클래스

public class TvFactory {
	
	public Tv create(String name) {		// interface Tv를 참조주소로 받는 create변수
		 
		switch(name) {
			case "Samsung":
				return new SamsungTv();
			case "Lg":
				return new LgTv();
			default:		// default를 안넣으면 리턴이없다고 exception뜸!
				return null;
		}
	}
}

// new LgTv();는 LgTv 클래스의 새로운 인스턴스를 생성하고 반환하는 역할
//  --> new LgTv는 LgTv 클래스의 인스턴스를 생성, 이를 사용하여 '해당 클래스의 메서드 및 속성에 액세스할 수 있음!!!!'

// if) 새로운 객체를 생성하지 않고 단순히 LgTv();를 호출하면?
// --> 컴파일러가 이를 메서드 호출로 인식하고 해당 메서드를 찾으려고 할 거임
// --> 이러한 메서드가 정의되어 있지 않으니까 컴파일 오류가 발생함

 

6. User 클래스

public class User {
	
	private Tv tv;				// 2-2) 생성자로 만들어서 넘기는 방식
						// interface Tv를 참조주소로 받는 변수 tv를 인스턴스로 만들어서
//	public User(Tv tv) {			// 생성자로 넘긴다.
//		this.tv = tv;
//	}
	
	
	public void setTv(Tv tv) {		// 2-3) setter로 주입하는 방식 ★★★
		this.tv = tv;			// 생성자는 필요없겠지?
	}	
   	 // 이 매서드를 만드는 사람은, 사용자가 어떤 tv를 쓰는지에 관심이없다. 그저 슈퍼리모컨을 만들뿐.
	
	
	// 2-3) setter 주입도 인스턴스는 필요하지. 우리는 setter주입으로 간다!
	
	
	public void watchTv(/* Tv tv */) {	
    // 2. 의존 주입을 해줘야해 --> -1)메서드의 파라메터로써 넘겨주는 방식
		
		System.out.println("사용자가 TV를 시청합니다");
		
//		SamsungTv tv = new SamsungTv();		// 삼성티비가 고장나서 엘지티비로 변경했다는 상상
//		tv.powerOn();
//		tv.volumeUp();
//		tv.volumeDown();
//		tv.powerOff();
		
//		LgTv tv = new LgTv();		
// 		같은 개념으로 돌아가는데 굳이굳이 안맞는 뚜껑으로 끼우려고 추가작업을 한거지.
//		tv.turnOn();
//		tv.soundUp();
//		tv.soundDown();
//		tv.turnOff();
		
//		Tv tv = new LgTv();	// 1. interface Tv로 변경해줘야겠지... 근데 이건 좀 어거지야	
		
		tv.powerOn();
		tv.soundUp();
		tv.soundDown();
		tv.powerOff();
		
		
		System.out.println("꿈나라에 갑니다");
	}
	
}

'JAVA > DAY 16 _ 23.09.07' 카테고리의 다른 글

불변/가변객체1  (0) 2023.09.19
불변/가변객체2  (0) 2023.09.19
라이브러리  (0) 2023.09.19
Enum(열거형)  (0) 2023.09.19
Class 설계원칙  (0) 2023.09.19