추상화는 객체 지향 설계에서 공통적인 특징을 정의하여 코드의 표준을 잡는 것을 의미합니다. Java에서는 추상 클래스와 인터페이스를 활용해 구현할 수 있습니다.
아래는 추상 클래스를 활용한 간단한 예제입니다.
public abstract class Animal {
public void eating(String food) {
System.out.printf("%s 를(을) 먹습니다.\n", food);
}
public abstract void fly(); // 추상 메서드
}
fly메서드를 호라잉에 강제 구현하면 부적절한 코드가 될 수 있습니다.Animal 클래스는 동물의 공통적인 속성이나 행동(eating)만 포함하도록 설계합니다.Flyer 인터페이스를 추가하여, 날 수 있는 동물만 Flyer를 구현하도록 합니다.public interface Flyer {
void fly();
}
public class Bird extends Animal implements Flyer {
@Override
public void fly() {
System.out.println("날개로 날아다닙니다.");
}
}
싱글톤 패턴은 클래스의 인스턴스를 하나만 생성하고, 이를 전역적으로 공유하도록 보장하는 디자인 패턴입니다. ( 즉, 객체가 하나만 만들어지도록함)
privatestatic과 getInstance()로 자기자신의 객체를 반환하는 메서드구현public class TVApp {
public static void main(String[] args) {
// LgTV 객체 생성
LgTV lgTv = new LgTV();
lgTv.turnOn(); // LgTV 전원을 넣습니다.
// SamsungTV 객체 생성
SamsungTV samsungTv = new SamsungTV();
samsungTv.turnOn(); // SamsungTV 전원을 넣습니다.
}
}
public class TVApp {
public static void main(String[] args) {
// 인터페이스를 통한 객체 생성
TV lgTv = new LgTV();
lgTv.turnOn(); // LgTV 전원을 넣습니다.
TV samsungTv = new SamsungTV();
samsungTv.turnOn(); // SamsungTV 전원을 넣습니다.
}
}
TV 객체를 여러 번 생성할 수 있어 메모리 낭비와 객체 관리의 어려움이 발생합니다. 위 문제를 해결하기 위해 싱글톤 패턴을 적용합니다.
싱글톤 패턴을 도입하면 TvBeanFactory 클래스에서 객체를 생성하고 관리하며, 동일한 객체를 반환하도록 보장합니다.
public class TvBeanFactory {
private TV ary[]; // TV 객체 배열
private static TvBeanFactory instance; // 유일한 인스턴스
private TvBeanFactory() { // 외부에서 생성자 호출 불가
ary = new TV[2];
ary[0] = new LgTV();
ary[1] = new SamsungTV();
}
public static TvBeanFactory getInstance() { // 인스턴스 반환 메서드
if (instance == null) {
instance = new TvBeanFactory();
}
return instance;
}
public TV getBean(String brandName) { // TV 객체 반환
return (brandName.equals("samsung")) ? ary[1] : ary[0];
}
}
public class TVApp {
public static void main(String[] args) {
// 싱글톤 인스턴스 가져오기
TvBeanFactory factory = TvBeanFactory.getInstance();
// Samsung TV 객체 생성 및 사용
TV samsungTv = factory.getBean("samsung");
samsungTv.turnOn(); // SamsungTV 전원을 넣습니다.
// LG TV 객체 생성 및 사용
TV lgTv = factory.getBean("lg");
lgTv.turnOn(); // LgTV 전원을 넣습니다.
}
}
TvBeanFactory 클래스가 TV 객체의 생성을 책임지므로, 프로그램 어디에서나 동일한 인스턴스를 사용할 수 있습니다.TvBeanFactory만 수정하면 되므로, 코드 수정 범위가 최소화됩니다.TVApp 클래스는 구체적인 구현 클래스(LgTV, SamsungTV)를 몰라도 동작합니다.TvBeanFactory로 캡슐화되었으므로 코드 의존성이 줄어듭니다.