본문 바로가기
Programming Languages/Java

Chapter 22. 싱글톤

by 더 이프 2023. 1. 13.
728x90

목차

    1. 싱글톤

    ■ 싱글톤이란?

    • 스태틱 키워드를 활용함
    • 싱글톤은 하나만 존재해야 하기 때문에 생성자의 접근지정자를 private로 하여 외부에서 호출 불가하도록 함
    • 싱글톤으로 생성된 객체는 모든 곳에서 접근 가능
    • 하나의 객체를 공유할 때 사용

     

    2. 예시

    ■ A

    package j17_스태틱.싱글톤;
    
    public class A {
    
    	private Student[] students;
    	private static A instance = null;
    
    	private A() {
    		students = new Student[3];
    	}
        
    	// 첫번째 호출 때 자기자신을 생성
    	public static A getInstance() { 
    		if (instance == null) {
    			instance = new A();
    		}
    		return instance;
    	}
    
    	public void addStudent(Student student) {
    
    		for (int i = 0; i < students.length; i++) {
    			if (students[i] == null) {
    				students[i] = student;
    				return;
    			}
    		}
    
    		System.out.println("더 이상 학생을 추가할 수 없습니다.");
    		System.out.println();
    	}
    
    	public void showStudents() {
    		for (Student student : students) {
           		// Null을 참조할수 없어서 toString을 여기선 사용불가
    			System.out.println(student); 
    		}
    		System.out.println();
    	}
    }

    ■ B

    package j17_스태틱.싱글톤;
    
    import java.util.Scanner;
    
    public class B {
    
    	public void insertStudent() {
    		Scanner scanner = new Scanner(System.in);
    
    		System.out.print("학생 이름 : ");
    		String name = scanner.nextLine();
    
    		Student student = new Student(name);
    		A.getInstance().addStudent(student);
    		A.getInstance().showStudents();
    	}
    }

    ■ C

    package j17_스태틱.싱글톤;
    
    public class C {
    
    	public void showAll() {
    
    		A.getInstance().showStudents();
    	}
    }

    ■ Student

    package j17_스태틱.싱글톤;
    
    public class Student {
    
    	private static final int CODE = 20230000;
        
        // auto_increment
    	private static int ai = 1; 
        
    
    	private int studentCode;
    	private String name;
    
    	public Student(String name) {
    		studentCode = CODE + ai;
    		ai++;
    		this.name = name;
    	}
    
    	@Override
    	public String toString() {
    		return "Student [studentCode=" + studentCode + ", name=" + name + "]";
    	}
    }

    ■ Main

    package j17_스태틱.싱글톤;
    
    public class Main {
    
    	public static void main(String[] args) {
    
    		B b = new B();
    		C c = new C();
    
    		for (int i = 0; i < 4; i++) {
    			b.insertStudent();
    		}
    
    		System.out.println("c에서 학생 전부 출력");
    		c.showAll();
    	}
    }

    ■ KIA

    package j17_스태틱.싱글톤;
    
    public class KIA {
    
    	// 유일한 객체를 만들며 어디서든 사용 가능
    	private static KIA instance = null;
    
    	private KIA() {
    	}
    
    	// 생성자가 private이라서 외부에서 생성 불가
        // 싱글톤 만드는 형식
    	public static KIA getInstance() {
        	// 처음 호출 시 생성 후 그 후로는 생성하지 않음
    		if (instance == null) { 
    			instance = new KIA();
    		}
    		return instance;
    	}
    
    	public void printCompanyName() {
    		System.out.println(getClass().getSimpleName());
    	}
    }

    ■ KiaMain

    package j17_스태틱.싱글톤;
    
    public class KiaMain {
    
    	public static void main(String[] args) {
        
    		KIA kia = KIA.getInstance();
    
    		kia.printCompanyName();
    	}
    }