📌 오늘 학습한 주제
- Java 인터페이스(
interface)를 통한 표준 규격 정의 및 다형성 구현 (TV.java)
- 싱글톤 디자인 패턴(Singleton Pattern)을 활용한 단일 인스턴스 보장 (
SamsungTV.java, LgTV.java)
- 팩토리 디자인 패턴(Factory Pattern) 및
BeanFactory를 통한 객체 생성과 결합도 완화 (TvClientApp.java)
- 인터페이스 기반의 느슨한 결합(Loose Coupling) 구조 설계
💡 오늘 배운 것 — 나만의 언어로
① 오늘의 목표
- 인터페이스를 활용해 공통 동작을 표준화하고, 싱글톤 패턴과 팩토리 패턴을 결합하여 객체 생성과 사용을 분리하는 객체지향 아키텍처 실습하기
② 학습할 내용
- 인터페이스 규격화 (
TV.java): public interface TV에 turnOn() 추상 메소드를 선언하여 모든 TV 제품군이 구현해야 할 공통 규격을 표준화했다.
- 싱글톤 패턴 (
SamsungTV.java, LgTV.java): 생성자를 private으로 선언하여 외부의 무분별한 new 생성을 제한하고, getInstance() 정적 메소드를 통해 오직 단 하나의 인스턴스만 공유되도록 구현했다.
- 팩토리 패턴 및 클라이언트 연동 (
TvClientApp.java): 클라이언트가 직접 제조사 클래스를 생성하지 않고 BeanFactory를 통해 원하는 브랜드의 인스턴스를 TV 인터페이스 타입으로 주입받아 실행함으로써 객체 간의 결합도를 낮췄다.
💻 오늘 핵심 코드
1. TV 인터페이스 정의 (TV.java)
package features.oop.tv;
public interface TV {
public void turnOn();
}
2. 싱글톤 패턴 적용 TV 구현체 (SamsungTV.java & LgTV.java)
package features.oop.tv;
public class SamsungTV implements TV {
private static SamsungTV instance;
private SamsungTV() {}
public static SamsungTV getInstance() {
if(instance == null) {
instance = new SamsungTV();
}
return instance;
}
@Override
public void turnOn() {
System.out.println("samsung tv turnOn");
}
}
3. 팩토리를 통한 객체 생성 및 실행 (TvClientApp.java)
import features.oop.factory.BeanFactory;
import features.oop.tv.TV;
public class TvClientApp {
public static void main(String[] args) {
BeanFactory factory = BeanFactory.getInstance();
TV tv = factory.getBrand("lg");
tv.turnOn();
}
}
✨ 이해한 점
- 인터페이스(
TV)를 인터페이스 구현체(LgTV, SamsungTV)와 분리함으로써 클라이언트는 구체적인 클래스 내부 구현을 몰라도 일관된 메소드(turnOn())를 호출할 수 있다.
- 싱글톤 패턴을 적용하여 메모리 낭비를 줄이고 전역에서 동일한 인스턴스를 안전하게 재사용할 수 있다.
🛠️ 실습 / 결과물 & 참고 자료
③ 실습 / 결과물
- 강의 실습코드:
TV.java, SamsungTV.java, LgTV.java, TvClientApp.java 연동을 통해 싱글톤 패턴이 적용된 TV 객체들을 팩토리(BeanFactory)에서 호출하여 정상적으로 turnOn() 동작이 실행되는 것을 확인함.
④ 참고 자료
- Oracle Java Documentation: Java Interfaces & Polymorphism
- Design Patterns: Factory Pattern & Singleton Pattern in Java
🔍 문제와 해결
- 막힌 부분: 클라이언트(
TvClientApp)가 특정 TV 클래스에 직접 의존할 경우, 제품군이 변경되거나 확장될 때 클라이언트 코드의 수정이 불가피한 강한 결합(Tight Coupling) 문제 점검.
- 해결 방법:
TV 인터페이스와 객체 생성을 위임받는 BeanFactory를 중간에 두어 클라이언트가 TV 인터페이스 규격에만 의존하도록 개선(IoC/DIP 원칙 기초)함.
🎯 다음에 할 일