Java의 추상화(abstact)와 싱글톤 패턴

Yunsung·2025년 1월 1일
post-thumbnail

1. 추상화

추상화란?

추상화는 객체 지향 설계에서 공통적인 특징을 정의하여 코드의 표준을 잡는 것을 의미합니다. 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를 구현하도록 합니다.

interface를 활용한 코드

public interface Flyer {
    void fly();
}

public class Bird extends Animal implements Flyer {
    @Override
    public void fly() {
        System.out.println("날개로 날아다닙니다.");
    }
}

2. 싱글톤 패턴

싱글톤 패턴이란?

싱글톤 패턴은 클래스의 인스턴스를 하나만 생성하고, 이를 전역적으로 공유하도록 보장하는 디자인 패턴입니다. ( 즉, 객체가 하나만 만들어지도록함)

  • 구현방법
    1. 생성자의 접근지정자를 private
    2. staticgetInstance()로 자기자신의 객체를 반환하는 메서드구현

2.1 인터페이스 사용 전

처음에는 TVApp 클래스에서 LgTV나 SamsungTV 객체를 직접 생성하여 사용했습니다.

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 전원을 넣습니다.
    }
}

문제점

  • 결합도가 높음: TV의 브랜드가 바뀌면 모든 코드에서 객체 생성 부분을 수정해야 합니다.
  • 유지보수 어려움: 프로그램 전체에서 동일한 객체를 여러 번 생성할 가능성이 있으며, 코드가 복잡해질수록 관리가 어렵습니다.

2.2 인터페이스 도입(결합도 감소)

public class TVApp {

    public static void main(String[] args) {
        // 인터페이스를 통한 객체 생성
        TV lgTv = new LgTV();
        lgTv.turnOn(); // LgTV 전원을 넣습니다.

        TV samsungTv = new SamsungTV();
        samsungTv.turnOn(); // SamsungTV 전원을 넣습니다.
    }
}

문제점

  • 객체를 생성하는 코드가 여전히 분산되어있습니다.
  • 동일한 TV 객체를 여러 번 생성할 수 있어 메모리 낭비와 객체 관리의 어려움이 발생합니다.

2.3 싱글톤 패턴 도입(객체 관리 문제 해결)

위 문제를 해결하기 위해 싱글톤 패턴을 적용합니다.
싱글톤 패턴을 도입하면 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 전원을 넣습니다.
    }
}
  1. 객체 관리 통합
  • TvBeanFactory 클래스가 TV 객체의 생성을 책임지므로, 프로그램 어디에서나 동일한 인스턴스를 사용할 수 있습니다.
  • 중복 객체 생성을 방지합니다.
  1. 유지보수 용이
  • TV의 종류를 추가하거나 변경할 때 TvBeanFactory만 수정하면 되므로, 코드 수정 범위가 최소화됩니다.
  1. 결합도 최소화
  • TVApp 클래스는 구체적인 구현 클래스(LgTV, SamsungTV)를 몰라도 동작합니다.
  • 객체 생성 로직이 TvBeanFactory로 캡슐화되었으므로 코드 의존성이 줄어듭니다.
profile
풀스택 개발자로서의 도전을 하는 중입니다. 많은 응원 부탁드립니다!!😁

0개의 댓글