[보충] getInstance() & 추상 클래스, 싱글톤 패턴

부트캠프(END)/보충|2022. 7. 3. 21:44

getInstance() & 추상 클래스

 

추상 클래스는 미완성된 클래스(=미완성 설계도)로,

클래스마다 필요한 부분을 각 클래스에 맞게 완성해서 사용한다.

추상 클래스를 상속받은 하위 클래스들끼리는 공통의 변수와 메서드를 가지게 되며, 규격화할 수 있게 된다.

여러 개의 클래스를 모아서 관리하며, 한 개의 클래스 이름으로 여러 개를 제어할 수 있다.

추상 클래스를 상속받는 하위 클래스는 추상 메서드를 반드시 모두 구현해야 한다.

→ 미완성된 클래스이기 때문에.. 추상 클래스만으로 인스턴스를 생성할 수 없다.

 

Calendar는 추상 클래스이기 때문에 직접 객체를 생성할 수 없고,

getInstance() 메서드를 통해서 완전히 구현된 클래스의 인스턴스를 얻어야 한다.

→ 시스템의 국가와 지역설정을 확인하여 국가에 맞는 인스턴스를 반환한다.

인스턴스를 직접 생성하지 않고 메서드를 통해 반환받게 한 이유는...

최소한의 변경으로 프로그램이 동작할 수 있도록 하기 위해서이다.

 

 

getInstance() & 싱글톤 패턴(SingleTon Pattern)

 

getInstance() 메서드는 일반적으로 싱글톤 패턴을 구현하기 위해 많이 사용한다.

싱글톤 패턴이란, 클래스의 인스턴스를 단 하나로만 한정하는 '소프트웨어 디자인 패턴'이다.

시스템 전체에서 작업을 수행하기 위해 단 하나의 객체만 필요한 경우에 사용한다.

객체를 구체화하거나 변경, 테스트, 재사용을 쉽게 한다는 목적을 갖고, 

반복적으로 발생하는 설계상 문제를 보완하고 유연하고 재사용성이 높은 객체지향 프로그램을 만들기 위해 사용한다.

 

하나의 클래스는 단 하나의 인스턴스만을 갖는다.

해당 클래스의 인스턴스에는 쉽게 접근할 수 있다.

하나의 인스턴스만 생성가능하도록 인스턴스화를 제한한다.

 

 

싱글톤 패턴 구현하는 방법

1) 생성자를 private으로 만든다.

→ 생성자가 하나도 없는 클래스는 컴파일러가 자동으로 디폴트 생성자를 만들어 준다!

이 때 컴파일러가 만들어 주는 디폴트 생성자는 항상 public이다.

따라서, 싱글톤 패턴에서는 외부 클래스에서 해당 인스턴스를 여러 개 생성하는 것을 막기 위해

단일 인스턴스로 사용할 클래스의 생성자를 명시적으로 만들고 접근 제어자를 private으로 지정해 준다.

 

2) 클래스 내부에 static으로 유일한 인스턴스를 생성한다.

→ 생성자를 private으로 만듬으로써 외부 인스턴스를 생성할 수 없도록 하였지만,

사용할 인스턴스 하나는 필요하므로 클래스 내부에 static으로 생성하여 프로그램 전체에서 사용할 수 있도록 한다.

또한 외부에서 수정하거나 접근할 수 없도록 접근제어자를 private으로 지정해 준다.

 

3) 외부에서 참조할 수 있는 public getInstance() 메서드를 만든다.

→ 외부에서는 이 클래스의 생성자에 접근할 수 없기 때문에...

private으로 선언한 유일한 인스턴스를 외부에서도 사용할 수 있도록 해 주어야 한다.

또한 인스턴스를 생성하기 전부터 getInstance() 메서드를 호출할 수 있어야 하므로...

getInstance() 메서드를 public static으로 선언해 준다! 

public class DAO {
    //1. 생성자 숨기기
    private DAO() {   }
    //2. 클래스 내부에 유일한 인스턴스 생성
    private static DAO dao;
    //3. 외부에서 참조가능한 public 메서드 만들기
    public static DAO getInstance() {
        if (dao == null)
            dao = new DAO();
        return dao;
    }

 

위처럼 생성자를 제한하고, 클래스 내부에 유일한 인스턴스를 생성하고, 

public getInstance()를 선언해 주면 getInstance()를 몇 번 하든 같은 인스턴스를 받아 온다!

 

아래와 같이 테스트해보면 단 하나의 인스턴스만을 계속해서 불러오는 것을 볼 수 있다.

package dao;

public class MainClassDAO {

	public static void main(String[] args) {
		DAO dao1 = DAO.getInstance();
		System.out.println("dao1="+dao1);
		DAO dao2 = DAO.getInstance();
		System.out.println("dao2="+dao2);
		DAO dao3 = DAO.getInstance();
		System.out.println("dao3="+dao3);
	}

}

결과값!

'부트캠프(END) > 보충' 카테고리의 다른 글

session vs cookie? - 수정 예정  (0) 2022.07.12
[보충] new & newInstance()  (0) 2022.07.03
[보충] static & instance  (0) 2022.05.27

댓글()