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 |