디자인패턴 - 싱글턴

jinkyung·2021년 1월 13일
0

JAVA

목록 보기
10/29

코딩의 패턴 : 디자인 패턴 (객체지향) == 알고리즘(절차지향)

싱글턴 패턴 : 강제로 오직 하나의 객체만 가지고 쓸 수 있도록 한다.

접근제한자는 생각보다 중요한 부분이다.
생성자에 private을 붙인다는 것은 객체 생성을 거부하는 것

package com.bit.day08.am;

class Lec03 {
	int su = 1234;
	static int su2=2222;
//생성자에 private을 붙인다는 건 이 클래스의 객체 생성을 거부하는 것이다.	
	private Lec03() {  
	}
}

public class Ex03 {

	public static void main(String[] args) {
		Lec03 lec = new Lec03();	//오류
		System.out.println(Lec03.su2);			
	}
}
package com.bit.day08.am;

class Lec03 {
	static Lec03 me = new Lec03();	 //non-static이라서 객체를 또 찍어야 접근가능 하기에 static을 붙임
	
	private Lec03() {			
		
	}

	void func(){
		System.out.println();
		
	}
	
	
}

public class Ex03 {

	public static void main(String[] args) {
		for(int i=0; i<4; i++){
//Lec03의 객체는 찍어내지 못하니까 Lec03 타입의 변수를 만들고, 거기에 me라는 객체의 주소를 넣은 것이다
		Lec03 lec = Lec03.me;	//하나의 객체만 쓰고도 기능을 4번 수행할 수 있어짐.
		lec.func();
		}
	}

}

but 필드에 직접 접근하여 값을 바꿀 수 있다는 문제점이 있다.

package com.bit.day08.am;

class Lec03 {
	private static Lec03 me = new Lec03();	//직접 접근을 막기 위해 private 
	
	private Lec03() {			
		
	}

	void func(){
		System.out.println();
		
	}
	
	
}

public class Ex03 {

	public static void main(String[] args) {
		for(int i=0; i<4; i++){
		Lec03 lec = Lec03.me;				
		Lec03.me = null; //그러나 필드 값을 바꿔치기 할 수 있는 문제점-->직접 접근을 막아야 함 
		lec.func();
		}
	}
}

하지만 private을 쓰면 또 접근이 안돼 갖다 쓸 수 없어짐

그래서 해결

package com.bit.day08.am;

class Lec03 {
	private static Lec03 me = new Lec03();	//직접 접근을 막기 위해 private 
	
	private Lec03() {			
		System.out.println("객체의 생성...");
	}
	
	static Lec03 getInstance(){	//자신을 주는 기능을 만들어내었다.
		return me;
	}

	void func(){
		System.out.println("Lec03 클래스의 기능");
		
	}
}

public class Ex03 {

	public static void main(String[] args) {
		for(int i=0; i<4; i++){
 //내가 필드 값을 바꾸진 못하지만 받아서 쓸 수는 있다.
//몇번을 호출하던지 상관없이 하나의 객체를 받아서 쓰는 것이다.
		Lec03 lec=Lec03.getInstance();   
		lec.func();
		
		}
	}
}

이런식으로도 가능하다

package com.bit.day08.am;

class Lec03 {
	private static Lec03 me;	
	
	private Lec03() {			
		System.out.println("객체의 생성...");
	}
	
	static Lec03 getInstance(){			
		me = new Lec03();	//매번 새로운 객체를 주는 것
		//if(me==null){me = new Lec03();}  --> 조건을 걸어주면 null이 아닐때만 객체를 생성할 것이다.
		
		return me;
	}

	void func(){
		System.out.println("Lec03 클래스의 기능");
	}
}

public class Ex03 {

	public static void main(String[] args) {
		for(int i=0; i<4; i++){
		Lec03 lec=Lec03.getInstance();  
		lec.func();
		
		}
	}
}

자바의 장점 캡슐화 : 정보의 은닉. 정보 =필드 --> 접근제한자를 통해 정보를 은닉할 수 있고, 필요에 따라서 제어도 할 수 있다.

0개의 댓글

관련 채용 정보